解決Android 按Home鍵時(shí)無法從后臺(tái)啟動(dòng)Activity

最近有個(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ì)是合理的。 

參考自——后臺(tái)啟動(dòng)Activity

原因是知道了,但是是文中卻沒有給出可行的解決辦法。但我們?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是多么厲害

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容