最近有個需求:在檢查到特定條件的時候,自動從后臺啟動頁面摔竿。
很簡單的功能面粮,但是也遇到了坑,那就是:按Home鍵時無法從后臺啟動Activity继低。
會報以下錯誤:
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 置于后臺時郁季,任何在后臺startActivity 的操作都將會延遲 5 秒丁频。
除非該應(yīng)用獲取了"android.permission.STOP_APP_SWITCHES" 權(quán)限南蹂。
關(guān)于延遲 5 秒的操作在 com.android.server.am.ActivityManagerService 中的 stopAppSwitches() 方法中六孵。
系統(tǒng)級的應(yīng)用當(dāng)獲取了 "android.permission.STOP_APP_SWITCHES" 后將不會調(diào)用到這個方法來延遲通過后臺啟動 activity 的操作涎嚼。
事實上 android 原生的 Phone 應(yīng)用就是這樣的情況冕碟,它是一個獲取了"android.permission.STOP_APP_SWITCHES" 權(quán)限的系統(tǒng)級應(yīng)用耻煤。
當(dāng)有來電時扰楼,一個從后臺啟動的 activity 將突然出現(xiàn)在用戶的面前梯轻,警醒用戶有新的來電褪迟,這樣的設(shè)計是合理的冗恨。
參考自——后臺啟動Activity
原因是知道了,但是是文中卻沒有給出可行的解決辦法味赃。但我們怎么能就此放棄呢掀抹。經(jīng)過一番搜索,終于在sof上找到了答案: Starting an activity from a service after HOME button pressed without the 5 seconds delay
方法很簡單心俗,也很巧妙傲武,用PendingIntent來啟動:
把:
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上可以完美運行揪利,但是在小米6 miui10态兴,android 8.0上無法運行。
再次感嘆:
1疟位、面向google和sof編程是如此重要瞻润。
2、國產(chǎn)ROM是多么厲害