2012-03-16 25 views
4

你如何創建一個可在當應用程序停止運行保持服務運行服務?安卓:創建,當應用程序停止

<service 
    android:name="com.example.myservice" 
    android:process=":remoteservice" /> 

我也是在服務的onStartCommand返回START_STICKY:

@Override 
public in onStartCommand(Intent intent, int flags, int startId){ 
    return Service.START_STICKY; 
} 
+0

我有同樣的問題。 您是否找到解決方案? – Mixer 2015-01-22 21:48:59

回答

4

我不會使用android:process屬性 - 這實際上運行在一個獨立的進程服務,並使得它很難做這樣的事情份額的偏好。當您的應用程序停止運行時,您不必擔心服務會死掉,服務將繼續運行(這是服務的重點)。您也不需要綁定服務,因爲綁定會啓動並死掉。話雖這麼說:

<service 
    android:enabled="true" 
    android:exported="true" 
    android:name=".MyService" 
    android:label="@string/my_service_label" 
    android:description="@string/my_service_description" 
    <intent-filter> 
     <action android:name="com.package.name.START_SERVICE" /> 
    </intent-filter> 
</service> 

您可以定義自己的意圖來啓動服務行動(不能被系統啓動 - 必須是一個活動)。我喜歡設置爲「Enabled」爲true,因此該系統可以實例我的服務,和「出口」,讓其他應用可以發送意圖和我的服務進行交互。你可以找到更多關於這個here

您還可以使用綁定,如果你這樣做只是爲了粘合劑中添加和意圖,如長時間運行的服務:

<action android:name="com.package.name.IRemoteConnection" /> 

我們瞭解您的活動啓動服務:

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent serviceIntent = new Intent("com.package.name.START_SERVICE"); 
     this.startService(serviceIntent); 

     // You can finish your activity here or keep going... 
    } 
} 

現在的服務:

public class MyService extends Service { 

    @Override 
    public IBinder onBind(Intent intent) { 
     // This is triggered by the binder action intent. 
     // You can return your binder here if you want... 
     return null; 
    } 


    @Override 
    public void onCreate() { 
     // Called when your service is first created. 
    } 

    @Override 
    public in onStartCommand(Intent intent, int flags, int startId) { 
     // This is triggered by the service action start intent 
     return super.onStartCommand(intent, flags, startId); 
    } 
} 

現在您的服務應該運行。爲了幫助延長壽命,有一些技巧。使其運行作爲前臺服務(你在服務做到這一點) - 這將讓你創建一個在狀態欄中堅持一個通知圖標。同時保持你的HEAP燈亮,讓你的應用程序不太可能被Android殺死。

此外,該服務在殺死DVM時被殺死 - 因此,如果您打算進入設置 - >應用程序並停止應用程序,則正在殺死DVM並因此終止服務。僅僅因爲你看到你的應用程序在設置中運行並不意味着Activity正在運行。活動和服務具有不同的生命週期,但可以共享DVM。請記住,如果不需要,您不必殺死您的活動,只需讓Android處理它即可。

希望這會有所幫助。

+0

我100%確定我的服務在我的應用程序死亡時死亡。當我的應用程序運行時,我在設置 - >應用程序 - >運行服務下看到它。當我殺死我的應用程序時,服務不再存在。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 2012-03-16 16:56:41

+0

嘗試將其作爲前臺服務運行並設置啓用的屬性,以便使用系統上下文而不是應用程序上下文來實例化服務。 – jjNford 2012-03-16 16:59:12

+0

我將啓用設置爲true,並將其設置爲前臺服務,我認爲問題是我在應用程序上下文中啓動它。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 2012-03-16 17:05:23

-8

開始使用下面的代碼服務:

startService(new Intent(this, YourServiceClass.class)); 
我在清單文件中創建一個單獨的進程服務

運行在你的應用工作的的onStop()或任何你請!

+1

我知道如何開始一項服務。我正在尋求讓它在應用程序的生命週期之外運行。在activity的onStop()中調用它什麼都不會做。該應用程序退出時,該服務仍將被終止。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 2012-03-16 16:11:38