簡體   English   中英

使用顯式和隱式意圖啟動android服務

[英]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:讓我在這里列出一些事實

  • “已啟動”服務(而不是“綁定”服務)的生命周期與已啟動該服務的活動的生命周期無關。 無論兩者是否都在同一進程中運行,都是如此。
  • 在任何時間點只有一個Service實例仍然有效。 當您的活動調用startService()時,如果服務實例尚未運行,則會創建該服務實例(在這種情況下,您的服務也會收到onCreate()回調)。 但是,如果Service已經在運行,則Framework會在已經運行的進程上簡單地調用onStartCommand()回調(在這種情況下,沒有onCreate()回調)。 同樣,無論活動和服務運行在同一進程還是不同進程上,這一切都是正確的。

現在回答您的問題,如果您的服務仍在運行(由於先前的活動調用了startService()),那么bindService()/ startService()將確保連接到現有服務。

希望這對您有所幫助。 如果您還有其他具體問題,請告訴我。

您無需使用隱式意圖即可在單獨的流程中啟動服務或活動。 但是,為活動使用單獨的過程是一種罕見的情況。 為服務使用單獨的過程更為常見,但是盡管如此,我還是想知道用例是什么。

如果您的應用程序進程被銷毀然后重新啟動,則可以使用startService重新連接到服務。 如果該服務正在運行,請連接到該服務,否則該服務將重新啟動。 如果您隨后想終止該服務,則可以終止它,也可以從主應用程序運行stopService()。

服務在做什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM