android調用oncreate
Ⅰ Android輸入法IMMS服務啟動流程(3)(啟動IMS應用)
接上一篇,IMMS設置當前默認輸入法為LatinIME輸入法後,調用onCreate方法,然後會調用startInputInnerLocked啟動輸入法LatinIME的服務
本章節主要分析,onCreate生命周期中,各個流程調用
bindServiceAsUser啟動的服務是LatinIME
如上圖流程圖,服務啟動後,會調用到InputMethodManagerService的方法
該流程的主要邏輯:
完成對mMethodList和mMethodMap的數據初始化;檢查當前默認的輸入法(LatinIME)服務是否存在,很明顯,經過systemrunning過程以後,
mMethodMap已經包含了LatinIME,因此不會重復執行選擇和設定另外輸入法為默認輸入法的操作
該方法主要是檢查默認的LatinIME是否是可用的可用的輸入法,如果不可用,則設置為可用;
對應的settingprovider欄位為:
經過以上流程後,默認輸入法依然為LatinIME輸入法,該流程的主要作用為,將啟動的輸入法應用更新到可用列表enabled_input_methods中;
不過,目前默認的輸入法依然為LatinIME輸入法,跟重啟手機前,我們設置的輸入法(搜狗輸入法)依然不一致
下一篇文章,我們研究下,輸入法啟動過程中的onBind和onServiceConnected流程
Ⅱ Android後台進程保活方案
思想: 使用 Linux 中的 fork 機制創建 Native 進程,在 Native 進程中監控主進程的存活,當主進程掛掉後,在 Native 進程中立即對主進程進行拉活。
原理: 在 Android 中所有進程和系統組件的生命周期受 ActivityManagerService 的統一管理。Android5.0以下通過 Linux 的 fork 機制創建的進程為純 Linux 進程,其生命周期不受 Android 的管理。
該方案主要適用於 Android5.0 以下版本手機。
該方案不受 forceclose 影響,被強制停止的應用依然可以被拉活,在 Android5.0 以下版本拉活效果非常好。
詳情
對於 Android5.0 以上手機,系統雖然會將native進程內的所有進程都殺死,這里其實就是系統「依次」殺死進程時間與拉活邏輯執行時間賽跑的問題,如果可以跑的比系統邏輯快,依然可以有效拉起。在 某些 Android 5.0 以上機型有效。
詳情
https://github.com/Marswin/MarsDaemon
作者5.0以下系統用一個java進程和一個fork出來的純native進程雙管道互鎖監聽對方的狀態,無論哪個被殺後都拉起第三個進程,第三個進程來拉活常駐進程,實現拉活。
5.0以上同一進程組的進程會被同時殺死,所以5.0以上使用雙java進程在native層互鎖文件實現監聽,但任務管理器會在短時間內殺死所有進程,只能用反射提前初始化pacel,在進程被殺的時候和系統搶那幾十毫秒的時間發送一個拉活的廣播。用4個文件來讓兩個進程實現互鎖來做監聽,但實際效果很一般,測試了幾個5.0以上的國產機型都不行,效果是根本監聽不到進程被殺,目測原因是當任務管理器查殺進程的時候將所有的進程都掛起了,隨後全部殺掉,並在一段時間內禁止進程啟動。
PersistedJobService.java
BootReceiver.java靜態注冊BroadcastReceiver
注冊,開機,網路切換、拍照、拍視頻時候,利用系統產生的廣播也能喚醒app,不過Android N已經將這三種廣播取消了
常用的拉活許可權
BackgroundService.java
WakeLock
作為前台應用運行,提高應用存活幾率
service被關掉後自動啟動
START_STICKY
如果系統在onStartCommand返回後被銷毀,系統將會重新創建服務並依次調用onCreate和onStartCommand(注意:根據測試Android2.3.3以下版本只會調用onCreate根本不會調用onStartCommand,Android4.0可以辦到),這種相當於服務又重新啟動恢復到之前的狀態了)。
START_NOT_STICKY
如果系統在onStartCommand返回後被銷毀,如果返回該值,則在執行完onStartCommand方法後如果Service被殺掉系統將不會重啟該服務。
START_REDELIVER_INTENT
START_STICKY的兼容版本,不同的是其不保證服務被殺後一定能重啟。
service注冊,許可權設置為高優先順序
KeepAliveService.java
注冊,在新的獨立進程內啟動,適用5.0以下的原生系統,5.0以上同樣會被殺死
他的局限性在於:
第一,用戶會在系統設置的賬戶列表裡面看到一個不認識的賬戶;
第二,同步的事件間隔是有限制的,最短1分鍾,見源碼,如果小雨60秒,置為60秒。而且各種國產機怎麼改的源碼我們未可知,是不是都能用仍然未可知;
第三,很致命,某些手機比如note3需要手動設置賬戶,你如何騙你的用戶給你手動設置賬戶完了之後不卸載你;
第四,也很致命,必須聯網!google提供這個組件是讓你同步賬戶信息,不聯網你同步個鬼,我們要保活,可以不聯網不做事,但是不能不聯網就死
集成三方推送平台sdk,友盟極光等
Ⅲ Android的AlertDialog的show()和onCreate()是自動執行嗎誰先誰後
onCreate是自動執行的,當你創建一個dialog時,會執行onCreate創建視圖界面等,你也可以在onCreate中自定義界面布局,onCreate是它的生命周期中的一個方法。show不是自動執行,需要開發者調用使用,show方法就是顯示出對話框。對話框創建完成後,沒有show出來,它是隱藏的,所以要調用show。很顯然,onCreate是創建對話框時使用,show是創建完後使用,onCreate先執行,show後執行。