最近有個(gè)需求:在檢查到特定條件的時(shí)候,自動(dòng)從后臺(tái)啟動(dòng)頁面。
很簡單的功能,但是也遇到了坑,那就是:按Home鍵時(shí)無法從后臺(tái)啟動(dòng)Activity。
會(huì)報(bào)以下錯(cuò)誤:
10-22 17:31:21.897 I/ActivityManager( 664): START u0 {flg=0x14000000 meizuflg=0x200000 cmp=com.pl.getaway.getaway/com.pl.getaway.component.Activity.welcome.SplashActivity } from uid 10255
10-22 17:31:21.897 W/ActivityManager( 664): Activity start request from 10020 stopped
百度一下,很快就找到了原因,是Android系統(tǒng)本身的限制:
當(dāng)通過 home 鍵將當(dāng)前 activity 置于后臺(tái)時(shí),任何在后臺(tái)startActivity 的操作都將會(huì)延遲 5 秒。
除非該應(yīng)用獲取了"android.permission.STOP_APP_SWITCHES" 權(quán)限。
關(guān)于延遲 5 秒的操作在 com.android.server.am.ActivityManagerService 中的 stopAppSwitches() 方法中。
系統(tǒng)級(jí)的應(yīng)用當(dāng)獲取了 "android.permission.STOP_APP_SWITCHES" 后將不會(huì)調(diào)用到這個(gè)方法來延遲通過后臺(tái)啟動(dòng) activity 的操作。
事實(shí)上 android 原生的 Phone 應(yīng)用就是這樣的情況,它是一個(gè)獲取了"android.permission.STOP_APP_SWITCHES" 權(quán)限的系統(tǒng)級(jí)應(yīng)用。
當(dāng)有來電時(shí),一個(gè)從后臺(tái)啟動(dòng)的 activity 將突然出現(xiàn)在用戶的面前,警醒用戶有新的來電,這樣的設(shè)計(jì)是合理的。
原因是知道了,但是是文中卻沒有給出可行的解決辦法。但我們?cè)趺茨芫痛朔艞壞?。?jīng)過一番搜索,終于在sof上找到了答案: Starting an activity from a service after HOME button pressed without the 5 seconds delay
方法很簡單,也很巧妙,用PendingIntent來啟動(dòng):
把:
Intent intent = new Intent(context, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
改成:
Intent intent = new Intent(context, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent =
PendingIntent.getActivity(context, 0, intent, 0);
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
如此即可解決問題。
但是這種方案也并不完美,在pixel 2 android 9上可以完美運(yùn)行,但是在小米6 miui10,android 8.0上無法運(yùn)行。
再次感嘆:
1、面向google和sof編程是如此重要。
2、國產(chǎn)ROM是多么厲害