1. 程式人生 > 其它 >Android中通過Service啟動Activity遇到的問題及解決方案

Android中通過Service啟動Activity遇到的問題及解決方案

技術標籤:Android開發androidjava

最近在做畢業設計是有關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); }

這裡需要使用者手動授權,就可以了。