從后臺(tái)啟動(dòng)Activity的限制
Android 10 (API 級(jí)別 29) 及更高版本對后臺(tái)應(yīng)用可啟動(dòng) Activity進(jìn)行限制肢娘。Android10中, 當(dāng)App的Activity不在前臺(tái)時(shí)侮腹,其啟動(dòng)Activity會(huì)被系統(tǒng)攔截,導(dǎo)致無法啟動(dòng)掩驱。當(dāng)然罕扎,這么做的目的是為了用戶在使用其他APP過程中咨跌,不會(huì)被強(qiáng)制打斷。
例如辫继,典型的鬧鐘類APP怒见。預(yù)定鬧鐘本該啟動(dòng)一個(gè)Activity對用戶進(jìn)行提醒,結(jié)果Activity被攔截姑宽,無法執(zhí)行之后響鈴等操作遣耍,導(dǎo)致整個(gè)程序失去意義。
解決方案一:
官方給予的折中方案是使用全屏Intent(full-screen intent), 既創(chuàng)建通知欄通知時(shí), 加入full-screen intent 設(shè)置炮车。示例代碼如下(基于官方文檔修改):
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)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Incoming call")
.setContentText("(919) 555-1234")
//以下為關(guān)鍵的3行
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_CALL)
.setFullScreenIntent(fullScreenPendingIntent, true);
NotificationManager notifyManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notifyManager.notify(notifyId, builder.build());
注意:在Target SDk為29及以上時(shí),需要在AndroidManifest上增加USE_FULL_SCREEN_INTENT申明
//AndroidManifest中
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
解決方案二:
向用戶申請 SYSTEM_ALERT_WINDOW
權(quán)限,系統(tǒng)就不會(huì)攔截該程序后臺(tái)啟動(dòng)的Activity
示例代碼如下:
- 在清單中申請權(quán)限
//AndroidManifest中
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
- 判斷是否擁有權(quán)限舵变,未授權(quán)則請求權(quán)限(>=Android6.0)
//檢查是否已經(jīng)授予權(quán)限
if (!Settings.canDrawOverlays(this)) {
//若未授權(quán)則請求權(quán)限
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 0);
}
其中,Settings.canDrawOverlays(this)方法是在API level 23也就是Android M中新加入的用于檢查當(dāng)前是否擁有出現(xiàn)在“出現(xiàn)在其他應(yīng)用上”權(quán)限的方法瘦穆。在6.0以前的系統(tǒng)版本纪隙,懸浮窗權(quán)限是默認(rèn)開啟的,直接使用即可扛或。