導航:首頁 > 源碼編譯 > androidservice源碼

androidservice源碼

發布時間:2025-05-25 03:28:14

A. android Service啟動Activity

Android Service 基礎知識點

我們都知道Activity中啟動Activity,只需要startActivity,如果在Service中啟動Activity呢?

在Service中啟動Activity,很多人說在非Activity中啟動Activity需要加FLAG_ACTIVITY_NEW_TASK flag,如果我不加會怎麼樣呢?

並沒有出現異常和崩潰,跳轉也是正常的,但是與之前所說的會崩潰報出異常不符合啊?!難道是與版本有關嗎?大友於是我使用了Android 23去測試果然拋出了異常

ContextImpl在Android studio中屬於隱藏源碼,在IDE中可能看不到,那就需要在SDK中去找 我的是:D:\AndroidSdk\sources\android-23\android\app\ContextImpl.java

可以看到只是判斷條件不同而已,android-23中發現沒有Intent.FLAG_ACTIVITY_NEW_TASK會直接拋出異常,而android-26中我們在非 Activity 調用 startActivity() 的時候,我們這個 options 通常是 null 的,所以在 26 之間的時候,誤把判斷條件 options == null 寫成了 options != null 導致進不去 if,從而不會拋出異常

附加:在android 24-android 27(即android N-android O)之間出現了bug,也就是說即使沒有加Intent.FLAG_ACTIVITY_NEW_TASK也會正常跳轉激仿銷

可以很明顯看到判斷條件targetSdkVersion <明游 Build.VERSION_CODES.N || targetSdkVersion >= Build.VERSION_CODES.P 即在24-27

看Activity中啟動Activity的源碼

Activity.startActivity() ->startActivityForResult()->mInstrumentation.execStartActivity() ...最終還是Ams去啟動Activity 也就是Activity中重寫了startActivity()方法所以不會出現這個異常

其實直觀很好理解,如果不是在Activity中啟動的,那就可以看做不是用戶主動的行為,也就說這個界面可能出現在任何APP之上,如果不用Intent.FLAG_ACTIVITY_NEW_TASK將其限制在自己的Task中,那用戶可能會認為該Activity是當前可見APP的頁面,這是不合理的。舉個例子:我們在聽音樂,這個時候如果郵件Service突然要打開一個Activity,如果不用Intent.FLAG_ACTIVITY_NEW_TASK做限制,那用戶可能認為這個Activity是屬於音樂APP的,因為用戶點擊返回的時候,可能會回到音樂,而不是郵件(如果郵件之前就有界面)

對比源碼發現,在我們非 Activity 調用 startActivity() 的時候,我們這個 options 通常是 null 的,所以在 24~27 之間的時候,誤把判斷條件 options == null 寫成了 options != null 導致進不去 if,從而不會拋出異常,如此我們使用 Context.startActivity() 的時候是一定要加上 FLAG_ACTIVITY_NEW_TASK 的,但是在 Android N 到 O-MR1,即 24~27 之間卻出現了 bug,即使沒有加也會正確跳轉

結語:感謝各位大佬的分享,對此有疑問的可以去運行跑一下,看一下相關的源碼,如有錯誤的需要改進的地方,請留言評論指出,謝謝!

參考文章:

B. 如何查看Android 中native的Service

在Android裡面,init程序會解析 Init.rc文件,然後啟動很多Native Service。如何查看這些service的狀態呢,查看init的源代碼,發現所有的native service的信息都會保存到系統屬性裡面。這樣就可以用下面的命令查看各個Service的狀態。

# getprop |grep init.svc
getprop |grep init.svc
[init.svc.servicemanager]: [running]
[init.svc.vold]: [running]
[init.svc.netd]: [running]
[init.svc.debuggerd]: [running]
[init.svc.omsril-daemon]: [running]
[init.svc.sdm]: [running]
[init.svc.zygote]: [running]
[init.svc.media]: [running]
[init.svc.dbus]: [running]
[init.svc.installd]: [running]
[init.svc.keystore]: [running]
[init.svc.lapisrv]: [running]
[init.svc.console]: [running]
[init.svc.tcmd-autolaunch]: [stopped]
[init.svc.tel]: [stopped]
[init.svc.pxa920-setup]: [stopped]
[init.svc.logcat]: [running]
[init.svc.logcat-radio]: [running]
[init.svc.dnsmasq]: [running]
[init.svc.powerpolicy]: [stopped]
[init.svc.adbd]: [running]
[init.svc.telserver]: [stopped]
[init.svc.bootanim]: [stopped]
[init.svc.fmradiod]: [stopped]
[init.svc.wpa_supplicant]: [running]
[init.svc.dhcpcd]: [running]

C. 一文總結Android系統服務大管家-ServiceManager

Android系統服務大管家ServiceManager總結

閱讀全文

與androidservice源碼相關的資料

熱點內容
全球最好用的編程軟體 瀏覽:490
單片機lcd不亮 瀏覽:997
程序員自動化 瀏覽:927
南瓜電影改成什麼app 瀏覽:226
android使用looper 瀏覽:211
惠普伺服器怎麼查看ip是否被封 瀏覽:736
如何減少pdf的大小 瀏覽:995
b站的原神文件夾 瀏覽:993
memcached分布式java 瀏覽:213
雞蛋圓的演算法 瀏覽:598
unix環境高級編程翻譯 瀏覽:885
加密手機解不開 瀏覽:304
pdf識別圖片中的文字 瀏覽:181
投屏海爾電視需要什麼app 瀏覽:981
什麼是phpmodel類 瀏覽:914
stl異常檢測演算法python 瀏覽:747
騰訊雲esc伺服器在哪進去 瀏覽:807
技能優先的宏命令 瀏覽:888
vb可視化編程的步驟是 瀏覽:43
字母轉換加密c語言 瀏覽:353