Android 8 0啟動Service問題

2021-10-04 15:00:28 字數 1001 閱讀 5312

由於我們是定製化系統,是可以收到開機廣播的,所以不要糾結開機廣播的問題。android原生os在已經禁用了開機廣播,第三方應用是無法收到開機廣播的。

根據同事定位我們的應用在開機的時候出現crash,如果開機後從應用入口進入可正常執行,並且在android8.0上是必現的。檢視我們應用的原始碼找到兩處關鍵log,乙個位於startservice()處,乙個位於service的oncreate()方法中。

獲取測試反饋log,進行log搜尋,找到crash時和正常啟動時的關鍵log及關鍵log附近的log。對比log後發現:

【出錯時log】:resourcemanagerservice: emmm, iscaller fg not directly return false

resourcemanagerservice: package 【包名被我替換了】is bg!

resourcemanagerservice: 【包名被我替換了】 is not found in 白名單.

【正常時log】:resourcemanagerservice: package 【包名被我替換了】is fg!

看這情況應該是由於我們的應用是後台程序的問題,出錯時是後台程序,正常時是前台程序。問了下系統開發的同事,的確是這樣的!!!我們的程序是後台程序,android8.0及以後在原生os的邏輯中是直接拋異常的。我們的系統加入了白名單的判斷,由於我們的應用沒在白名單裡,所以就startservice()報異常了。正常啟動時由於是前台行為,我們的程序在startservice()時是前台程序,所以可以直接啟動。原生os對於前台程序也是如此處理的。

定位了問題後,解決就很簡單了,由於我們的是定製化作業系統,直接把我們應用加白名單就行了!!!

android原生8.0及以後的作業系統中對startservice()做了限制,如果在後台應用中呼叫startservice()將丟擲異常。如果是前台程序,則可以正常執行。對於後台程序呼叫startservice()需改為startforegroundservice(),前台程序可以正常呼叫startservice()。

Android8 0 啟動Service遇到的問題

1 在android8.0之後呼叫startservice service 原因 android 8.0 不再允許後台service直接通過startservice方式去啟動。解決方案 改用startforegroundservice service 2 在使用了context.startforeg...

Android8 0 啟動前台Service

1.啟動service if build.version.sdk int build.version codes.o else2.在被啟動service中的oncreate方法呼叫 private void startnotificationforeground notification notif...

android8 0適配工作

整個8.0適配,設計的部分包括6部分 我專案中的,其他的適配感覺並不會影響專案的執行 1 執行時許可權 2 通知notifaction適配 3 未知 apk安裝適配 4 後台執行限制 後台服務 5 懸浮框適配 6 集合的處理 abstractcollection使用限制 android6.0的執行時...