[英]starting android service using explicit vs implicit intent
根據標准的Android文檔,啟動服務(即已啟動的服務)的首選方法是使用如下所示的明確意圖:
// Using explicit intent:
Intent serviceIntent = new Intent(getApplicationContext(), MyService.class);
// or:
Intent serviceIntent = new Intent(this, MyService.class);
startService(serviceIntent);
您還可以使用帶有清單中指定的操作字符串的隱式意圖來啟動/停止服務,如下所示:
// Using implicit intent:
static final String serviceAction = "com.example.my.app.services.MYSERVICE";
Intent serviceIntent = new Intent(serviceAction);
startService(serviceIntent);
// AndroidManifest.xml:
<service android:name="com.example.my.app.services.MyService"
android:exported="false" android:process=":services" >
<intent-filter>
<!-- Start/Stop service -->
<action android:name="com.example.my.app.services.MYSERVICE" />
</intent-filter>
</service>
如果僅在本地使用服務(不允許第三方應用程序啟動或綁定到該服務),則文檔說明清單服務標簽中不應包含意圖過濾器 ,而應將導出的標簽設置為false。
注意:活動和服務在單獨的進程(:: application和:services進程)中運行。 活動和服務之間的通信是通過實現AIDL接口來完成的(之所以這樣做,是因為只有AIDL遠程接口才允許我在需要同時處理IPC的服務中進行多線程處理,不僅是活動之間,而且主要是在運行於該服務中的服務之間:服務流程)。
我的問題是:
問題1:當我在應用程序中使用的活動和服務在兩個不同的流程中運行時,是否需要在顯式意圖上使用隱式意圖來啟動和停止服務?
問題2:當:application進程消失(已銷毀,不再在內存中)並且:services進程在后台運行時,如何將新的:application進程重新連接到已經運行的:services進程? 我不知何故需要再次引用:services進程,以便可以停止該進程中正在運行的服務。 使用AIDL afaik無法完成此操作。
問題是Android會並且會在資源不足時輕松破壞:application進程,只要:services進程繼續運行,對我來說這很好。 (是的,我知道通過將服務設置為前台服務等來影響流程。我也可以閱讀手冊;),但這不是我的問題。
當活動和服務處於單獨的流程中並使用AIDL時,以及當:application進程需要在被Android殺死后的:service進程中再次“查找”:service進程時,我找不到與我的問題有關的任何信息或答案。用戶再次進入應用程序(在他/她離開應用程序之后)。
歡迎任何專家級的建議。
A1:即使您的活動和服務在不同的進程中運行,它們仍然屬於同一應用程序。 您仍然可以使用顯式意圖,在這里我看不到使用隱式意圖的任何特定優勢(讓我知道是否找到了:))
A2:讓我在這里列出一些事實
現在回答您的問題,如果您的服務仍在運行(由於先前的活動調用了startService()),那么bindService()/ startService()將確保連接到現有服務。
希望這對您有所幫助。 如果您還有其他具體問題,請告訴我。
您無需使用隱式意圖即可在單獨的流程中啟動服務或活動。 但是,為活動使用單獨的過程是一種罕見的情況。 為服務使用單獨的過程更為常見,但是盡管如此,我還是想知道用例是什么。
如果您的應用程序進程被銷毀然后重新啟動,則可以使用startService重新連接到服務。 如果該服務正在運行,請連接到該服務,否則該服務將重新啟動。 如果您隨后想終止該服務,則可以終止它,也可以從主應用程序運行stopService()。
服務在做什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.