㈠ android中如何啟用Service,如何停用Service
• Context.startService()
• Context.bindService()
1. 在同一個應用任何地方調用 startService() 方法就能啟動 Service 了,然後系統會回調 Service 類的
onCreate() 以及 onStart() 方法。這樣啟動的 Service 會一直運行在後台,直到
Context.stopService() 或者 selfStop() 方法被調用。另外如果一個 Service 已經被啟動,其他代碼再試圖調用
startService() 方法,是不會執行 onCreate() 的,但會重新執行一次 onStart() 。
2. 另外一種 bindService() 方法的意思是,把這個 Service 和調用 Service
的客戶類綁起來,如果調用這個客戶類被銷毀,Service 也會被銷毀。用這個方法的一個好處是,bindService() 方法執行後
Service 會回調上邊提到的 onBind() 方發,你可以從這里返回一個實現了 IBind
介面的類,在客戶端操作這個類就能和這個服務通信了,比如得到 Service 運行的狀態或其他操作。如果 Service
還沒有運行,使用這個方法啟動 Service 就會 onCreate() 方法而不會調用 onStart()。
總結:
1.
startService()的目的是回調onStart()方法,onCreate()
方法是在Service不存在的時候調用的,如果Service存在(例如之前調用了bindService,那麼Service的onCreate方法
已經調用了)那麼startService()將跳過onCreate() 方法。
2.
bindService()目的是回調onBind()方法,它的作用是在Service和調用者之間建立一個橋梁,並不負責更多的工作(例如一個
Service需要連接伺服器的操作),一般使用bindService來綁定到一個現有的Service(即通過StartService啟動的服
務)。
由於Service 的onStart()方法只有在startService()啟動Service的情況下才調用,故使用onStart()的時候要注意這點。
㈡ Android 10.0 ActivityManagerService的啟動流程
我們講完了SystemServer的啟動過程,本節主要來講解ActivityManagerService的啟動過程。ActivityManagerService簡稱AMS,管理Activity行為,控制Activity的生命周期,派發消息事件,內存管理等功能。
ActivityManagerService啟動由SystemServer中startBootstrapService啟動
ATM啟動最終調用的是ActivityTaskManagerService.Lifecycle.onStart()來啟動ATM服務的
源碼:ActivityTaskManagerService.java#Lifecycle.class
將ActivityTaskManagerInternal添加到本地服務的全局注冊表中。
ActivityTaskManagerInternal為抽象類,其實現類為ActivityTaskManagerService#LocalService.class
構造函數初始化主要工作就是初始化一些變數,供之後的service,broadcast,provider的管理和調度
start中做了兩件事
AMS的systemReady處理分為三個階段
同時獲取一些配置參數。 需要注意的是,由於只有Java進程才會向AMS注冊,而一般的Native進程不會向AMS注冊,因此此處殺死的進程是Java進程。
主要是調用一些關鍵服務的初始化函數,然後殺死那些沒有FLAG_PERSISTENT 卻在AMS啟動完成前已經存在的進程,同時獲取一些配置參數。需要注意的是,由於只有Java進程才會向AMS注冊,而一般的Native進程不會向AMS注冊,因此此處殺手的進程是Java進程。
執行goingCallback的處理,主要的工作就是通知一些服務可以進行systemReady相關的工作,並進行啟動服務或應用進程的工作
監控Native的crash,啟動WebView,執行一些服務的systemReady和systemRunning方法
啟動Home Activity,當啟動結束,發送ACTION_BOOT_COMPLETED廣播時,AMS的啟動過程告一段落
啟動Home Activity
AMS的啟動主要經歷了如下幾個階段:
㈢ Android 後台應用 無界面,怎麼啟動service
完全沒有界面,那應該是 AndroidManifest.xml 文件里一個activity也沒有聲明.
沒有聲明activity就肯定沒有一個響應如下配置的intent:
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
沒有這個配置應用程序就沒有入口.
沒有入口就無法啟動應用程序進程.
應用程序進程都起不來,service肯定也起不來.
=========================================
所以要啟動一個完全沒有界面的apk包中的service,那隻能由其他進程來啟動了.
比如如下service:
<manifestxmlns:android="
package="no.ui.app"
android:versionCode="1"
android:versionName="1.0">
<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
......
<service
android:enabled="true"
android:name="no.ui.app.i_am_service"
android:process="i_am_service">
<intent-filter>
<actionandroid:name="no.ui.app.start_service"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
</application>
</manifest>
安裝了這個apk後,在另一個apk的某個地方調用
就可以啟動這個service了.
startService(newIntent("no.ui.app.start_service"));
㈣ Android應用程序啟動流程總結
AMS主要功能:
AMS是Android中最核心的服務,主要負責系統中四大組件的啟動、切換、調度及應用進程的管理和調度等工作。還負責啟動或殺死應用程序的進程。
WMS主要功能:
為所有窗口分配Surface。
管理Surface的顯示順序、尺寸、位置。
管理窗口動畫。
輸入系統相關:WMS是派發系統按鍵和觸摸消息的最佳人選,當接收到一個觸摸事件,它需要尋找一個最合適的窗口來處理消息。
PWS主要功能:
PMS 用來管理跟蹤所有應用APK,包括安裝,卸載,解析,控制許可權等。
SystemServer也是一個進程,包括AMS、PMS、WMS等等。
zygote意為「受精卵「。Android是基於Linux系統的,而在Linux中,所有的進程都是由init進程直接或者是間接fork出來的,zygote進程也不例外。
App進程是用戶點擊桌面icon時,通過Launcher進程請求SystemServer,再調用Zygote孵化的。
①點擊啟動一個App,Launcher進程採用Binder IPC向ActivityManagerService發起startActivity請求;
②ActivityManagerService接收到請求後,向zygote進程發送創建進程的請求;
③Zygote進程fork出新的子進程,即App進程;
④App進程通過Binder IPC向sytem_server進程發起綁定Application請求;
⑤system_server進程在收到請求後,進行一系列准備工作後,再通過binder IPC向App進程發送scheleLaunchActivity請求;
⑥App進程的binder線程(ApplicationThread)在收到請求後,通過handler向主線程發送LAUNCH_ACTIVITY消息;
⑦主線程在收到Message後,通過發射機制創建目標Activity,並回調Activity.onCreate()等方法。
⑧到此,App便正式啟動,開始進入Activity生命周期,執行完onCreate/onStart/onResume方法,UI渲染結束後便可以看到App的主界面。
備註:
Launcher,PMS,Zygote,App進程是三個獨立的進程,相互通信就需要使用進程間通信機制。與Zygote通信是使用的socket通信,Launcher,PMS,App進程間使用的是Binder機制。
㈤ Android Framework——AMS、PMS的啟動流程
AMS實際是有SystemServer創建的,不了解的大家可以看這篇文章 Android Framework—SystemServer進程啟動過程
ActivityManagerService.Lifecycle.class實際是創建ActivityManagerServer,並創建UI和CPUTracker
最終實際走到的Lifecycle的onStart方法
最後實際走的桌面的Activity進程
PMS實際也是SystemServer創建的
PackManagerService的main函數實際就是創建PackageManagerService對象,然後將其對象添加到ServiceManager
實際就是對我們data/app目錄下文件進行掃描
總結
㈥ android中當Service在運行時怎麼重啟Service
只需要重新startService即可重新調用service的onStart()。
Service是在一段不定的時間運行在後台,不和用戶交互應用組件。每個Service必須在manifest中 通過<service>來聲明。可以通過contect.startservice和contect.bindserverice來啟動。
Service和其他的應用組件一樣,運行在進程的主線程中。這就是說如果service需要很多耗時或者阻塞的操作,需要在其子線程中實現。
service的兩種模式(startService()/bindService() :
1.本地服務 Local Service 用於應用程序內部。
它可以啟動並運行,直至有人停止了它或它自己停止。在這種方式下,它以調用Context.startService()啟動,而以調用Context.stopService()結束。它可以調用Service.stopSelf() 或 Service.stopSelfResult()來自己停止。不論調用了多少次startService()方法,你只需要調用一次stopService()來停止服務。
用於實現應用程序自己的一些耗時任務,比如查詢升級信息,並不佔用應用程序比如Activity所屬線程,而是單開線程後台執行,這樣用戶體驗比較好。
2.遠程服務 Remote Service 用於android系統內部的應用程序之間。
它可以通過自己定義並暴露出來的介面進行程序操作。客戶端建立一個到服務對象的連接,並通過那個連接來調用服務。連接以調用Context.bindService()方法建立,以調用 Context.unbindService()關閉。多個客戶端可以綁定至同一個服務。如果服務此時還沒有載入,bindService()會先載入它。