文档开发者中心
我的

【原创】安卓Q | 弹窗通知受影响,后台启动Activity限制适配指导

作者:HW-ZF


为了减少后台页面弹出对用户的影响,谷歌从Android Q开始限制应用后台启动Activity,但部分合理的使用场景如锁屏音乐、语音电话、闹钟等场景也受到影响,需要开发进行重点关注和适配。

变更介绍

为了用户能更好的控制屏幕上显示的内容,最大限度减少后台弹页面对用户的打扰,Android Q对应用启动Activity进行了严格的限制。应用只有在满足下方一个或多个条件时才可以启动Activity。

  1. 应用处于前台;

  2. 桌面widget点击启动Activity;

  3. 由桌面点击启动应用;

  4. 多任务切换场景(即recent中启动应用);

  5. 前台界面A所在的应用启动后台界面B;

  6. 临时白名单机制,不拦截通过通知拉起的应用:

  • 应用通过通知,在pendingintent中启动activity;

  • 应用通过通知,在pendingintent中发送广播,接收广播后启动activity,加入临时白名单不拦截;

  • 应用通过通知,在pendingintent中启动service,在service中启动activity,加入临时白名单不拦截。

备注:应用无法通过前台服务让应用处于前台豁免该管控。

变更影响

1、影响范围

该特性对所有非系统应用都生效,开发者需要对自身应用进行排查,如果发现无法整改的问题可以通过下方链接及时反馈给谷歌:

developer.android.google.cn

2、兼容性表现

在Android Q beta1未正式开启该特性,但如果应用的页面存在被管控的场景,系统会通过一个Toast告警提示,提示开发者需要整改,否则应用的某些页面在Android Q的后续版本会被拦截,具体的告警如下:

This background activity start from package-name will be blocked in future Q builds.

3、受影响的业务场景

目前测试发现一些合理的应用场景都有影响,如:锁屏、语音和视频电话、闹钟提醒等。

适配指导

1、开启设置

开发者需要到开发者选项中将“允许系统执行后台活动”设置项关闭来开启该特性。


2、适配方案

(1)使用高优先级的全屏通知来代替弹窗:

首先创建一个NotificationChannel:CHANNEL_ID,然后通过高优先级全屏通知来提醒用户。参考代码如下:

private void showHighNotification() {
 Intent fullScreenIntent = new Intent(this, DownloadProviderTestActivity.class);
 PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0, fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);
 Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
 .setSmallIcon(R.drawable.if_apple_2003193)
 .setContentTitle('Incoming call')
 .setContentText('(919) 555-1234')
 .setPriority(NotificationCompat.PRIORITY_HIGH)
 .setCategory(NotificationCompat.CATEGORY_CALL)
 .setFullScreenIntent(fullScreenPendingIntent, true).build();
 NotificationManager mNotificationManager =
 (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
 mNotificationManager.notify(1, notification);
}

(2)将通知与前台服务关联

如果应用需要持续提醒用户(例如来电和闹钟等),需要将通知与前台服务相关联。参考代码如下:

// Provide a unique integer for the 'notificationId' of each notification.

startForeground(notificationId, notification)

(3)灭屏通知适配

在亮屏场景,系统会把全屏通知改成横幅通知提醒用户;在灭屏场景,我们需要通过全屏通知直接拉起Activity并点亮屏幕来提醒用户,拉起的Activity需要设置在锁屏之上显示。参考代码如下:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED

| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

音乐锁屏、电话和闹钟等使用场景都可以使用该方案在灭屏状态下提醒用户。


点赞
收藏
回复
分享
举报
浏览1466 发布于2019-10-17 07:09未知归属地
全部评论
最多点赞
最新发布
最早发布
暂无评论
暂无评论
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

目录 收起
变更介绍
变更影响
适配指导
了解社区公约,与您携手共创和谐专业的开发者社区。