前言
前几天接触的一个闹钟APP项目,闹钟触发从后台启动一个activity,执行之后的响铃操作,但是却失效了,闹钟并没有按时响铃。最后发现是系统拦截了从后台启动的Activity。
具体原因
-
一、AndroidQ从后台启动Activity的限制
Android 10 (API 级别 29) 及更高版本对后台应用可启动 Activity进行限制。Android10中, 当App的Activity不在前台时,其启动Activity会被系统拦截,导致无法启动。 -
二、后台弹出界面、锁屏显示权限(小米等部分国产手机)
小米手机有个特殊的权限,“后台弹出界面(允许应用在后台弹出界面)”,默认是拒绝的,如下图所示.
华为手机没有这个权限,目前vivo/oppo/小米手机有这个“后台弹出界面”权限. -
其他原因,有待更新,暂时没有遇见
解决方案
-
一、针对Android10的问题
方案1
官方给予的折中方案是使用全屏Intent(full-screen intent), 既创建通知栏通知时, 加入full-screen intent 设置。示例代码如下(基于官方文档修改):
Intent fullScreenIntent = new Intent(this, CallActivity.class);
PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this, CHANNEL_ID