2013-07-20 93 views
8

我試圖創建一個服務,即使在用戶從正在運行的進程菜單中關閉了應用程序(通過將進程移出屏幕)後,我也會爲後臺作業。用戶退出後保持後臺服務活着

我試圖做的是通過聲明它像這樣在不同的進程創建服務:

<service 
     android:name=".service.Service" 
     android:enabled="true" 
     android:icon="@drawable/ic_launcher" 
     android:process=":my_process" > 
    </service> 

和onStartCommand()是:

這樣做的
@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    return START_STICKY; 
} 
+0

嗨,你有沒有接觸到一個解決方案?我一直在尋找幾個小時來解決這個問題,我無法找到解決方案。你的代碼看起來和我的完全一樣。 – OmarBizreh

+0

我已經解決了這個問題,只需開始我的服務使用這一行: 'ContextWrapper cont = new ContextWrapper(getBaseContext()); \t \t \t cont.startService(服務)' – OmarBizreh

+0

相關http://stackoverflow.com/questions/16651009/android-service-stops-when-app-is-closed –

回答

4

按照Service documentation就可以實現這種行爲利用屬性:

android:isolatedProcess="true" 

順便說一句,我知道它不回答這個問題,但它可能會幫助一些人作爲好 - 最近我發現了Evernote開發者創建的一個偉大的第三方庫。它的名字是JobManager,其目標是創建在不同進程上運行的作業,並且即使在設備重啓後也可以再次變爲活動狀態。驚人。

+0

這個圖書館很古老。使用它會好嗎? –

+0

是的,我們正在廣泛使用它。不知道,但我認爲它現在得到新的承諾,並且比 – Nativ

+1

簡單的解決方案在這裏,https://stackoverflow.com/a/46603241/1881527 –

0

的一種方式。假設你有一個名爲「DoSomething」的服務類。在Android Manifest聲明:本

<service android:name = ".DoSomething"></service> 

服務類:

Handler handler = new Handler(); 

Runnable runnable = new Runnable(){ 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     YourMethod(); 
     handler.postDelayed(this, 1000); // 1000 - Milliseconds 
    } 
}; 

最後:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // TODO Auto-generated method stub 


    handler.postDelayed(runnable, 1000); 

    return START_STICKY; 
} 

從你的活動:

Intent intent = new Intent(this, DoSomething.class); 
startService(intent); 

我希望它能幫助。

+7

我不明白你爲什麼認爲它應該工作..當用戶關閉應用程序時,該服務仍然會死亡。我目前有我從服務的OnCreate()聲明的TimerTask,並且我不認爲從onStartCommand()聲明它會做詭計 – Nativ

+3

完全垃圾回答 – Subho

+0

這不工作,我已經嘗試過它自己。 Handler沒有理由在那裏。 – XcodeNOOB

-6

服務被設計爲在後臺運行,不需要其他進程。

從服務文檔:

一旦啓動,服務可以在後臺運行下去,即使啓動它的成分,被銷燬。

但是,服務應該在工作完成時自行停止。 IntentService是開始實施服務的最簡單方法。

+0

是的,我看到了這一行,但仍然每當我關閉應用程序的服務被破壞也。順便說一句,我不知道它的問題,但服務實施OnSensorListener聽加速計更改(動作..) – Nativ

+0

@powerX你如何開始服務?你是綁定到它還是'startService'? – brillenheini

+0

我使用startService的目的是爲了開始我的服務 – Nativ

1

其實有不同種類的服務可以實現。使用服務而不是IntentService。您需要查看START_STICKYSTART_NOT_STICKYSTART_REDELIVER_INTENT即使您的活動消失,您仍可以保持服務在後臺運行。 Android services還看AIDL服務

+1

我使用了'START_REDELIVER_INTENT',但我的服務在用戶關閉應用程序時仍然停止。 –

+0

我使用了'START_STICKY',但即使應用程序被用戶關閉,我的服務仍然停止。 –

0

爲此,您可以使用處理器和運行的類

@Override 
    public void onCreate() 
    { 

     Toast.makeText(context, "SMS SERVICE START", Toast.LENGTH_SHORT).show(); 


     handler=new Handler(); 
     runnable=new Runnable() { 
      @Override 
      public void run() 
      { 

        TASK(); 
        handler.postDelayed(runnable,180000); 
// 3min delay 
      } 
     }; 

     handler.postDelayed(runnable,180000); 
     super.onCreate(); 
    } 

這個任務連續運行3分鐘

public void TASK() 
{ 
    //your task 

}