Android中通過Service啟動Activity遇到的問題及解決方案
阿新 • • 發佈:2021-01-21
最近在做畢業設計是有關Android方向的,有需要再後臺執行的service中,等待使用者指令開啟Activity的情景,遇到一些坑,在這裡分享一下,希望對大家有幫助。
一、沒有新增flag
會報如下錯誤:
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
解決方案:
這種情況沒用過Service的很容易出現,解決辦法也很簡單,在startActivity之前給intent新增flag就好,如下:
intent.setFlags(FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
參考文章:https://www.jianshu.com/p/d269a91e48d4
二、啟動一次之後,再啟動就沒反應,也不報錯
這個問題困擾了我兩天,才找到答案。參考文章:https://juejin.cn/post/6844903936059523080
出現這種問題的都是Android版本10以上的,它是由於10更新後的安全機制,限制了後臺啟動Service和Activity的時間,一般允許Service在被建立後的十秒內啟動Activity,這個時候是可以啟動成功的,但是十秒後就禁止啟動Activity了,所以出現這種情況,沒有任何錯誤資訊,導致我一直以為是隻能啟動一次。
解決方案:
申請SYSTEM_ALERT_WINDOW懸浮窗許可權
在Manifest.xml清單檔案中加上:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
java程式碼中發起請求許可權申請:
if (!Settings.canDrawOverlays(this)) {
//若未授權則請求許可權
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) ;
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 0);
}
這裡需要使用者手動授權,就可以了。