2016-11-18 61 views
3

的我很困惑,現在,有關服務運行的理念和停止服務:停止對銷燬應用

什麼我想要做的:

  • 啓動位置服務的應用程序的最開始。

  • 不斷得到位置更新和他們共享偏好

  • 停止在的onDestroy應用範圍的服務!

到目前爲止,我已經搜索並研究我們只能做以下的事情與服務(糾正我,如果我錯了):

  • 通過其綁定到相關的活動自動停止服務/ fragments/views,當它們全部被破壞時,服務會自動解除綁定,因此我們可以在解除綁定時調用stopself方法

  • 返回START_NOT_STICKY onStartCommand告訴OS,不要重新創建它,並創建intent local在完成一些工作之後,它會自我毀滅。

  • 手動停止服務,通過聲明它的意圖在某種靜態範圍和停止服務在應用程序類onActivityDestroyed [我不知道會發生什麼? ,也許服務會毀壞每次任何活動將被破壞?否則將只有當整個應用程序中獲得的破壞

無論哪種方式,我感到有點困惑和毆打被破壞?],一直在努力調整自己的Location service給定的細節2天

+0

應用程序範圍沒有** onDestroy **的概念 –

回答

0

首先,啓動 「LocationService」 在您的應用程序啓動:

public class MyApp extends Application { 

    private static final String TAG = "MyApp"; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d(TAG, "App started up"); 
     startService(new Intent(this, MyLocationService.class)); 
    } 
} 

二: 正如你所說的,服務應該更好地與 「START_NOT_STICKY」 標誌

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return START_NOT_STICKY; 
    } 

運行三月:

一旦系統殺死你的應用程序,該服務將自動被殺死,所以沒有問題。

應用程序對象上沒有onDestroy()方法,唯一類似的事件是onTerminated()並且它不在生產設備上啓動。

onTerminate

在API級別1空隙onTerminate()此方法是用於模擬 過程的環境中使用。它絕對不會在Android設備上被調用,通過簡單地殺死進程來刪除進程;沒有 用戶代碼(包括此回調)在執行時執行。

的更多信息: https://developer.android.com/reference/android/app/Application.html#onTerminate()

順便說一句,如果你想在MyLocationService發送位置更新您的應用程序(當它打開時),你應該考慮使用奧托或EventBus(我建議你這是最後一個,因爲使用它很簡單)。如果需要,您甚至可以將@Suscriber配置爲接收舊檢索位置的更新。

0

我會盡力以最簡單的方式解釋:) 有兩種類型的服務 IntentService服務 IntentService開始時會殺死自己一旦它處理它onHandleIntent內容方法 至於服務這個人不會結束,直到你給它的命令,即使你使用活動的上下文開始它。當應用程序在極端情況下停止時(系統(設置/應用程序/ YourApp /停止應用程序或應用程序崩潰),它也會停止。

1

如果您使用START_NOT_STICKY啓動服務,那麼您的應用程序會終止您的服務一次整個應用程序從後臺即你從主屏幕清潔您的應用程序關閉。

這裏START_NOT_STICKY狀態,你不需要的情況下,重新創建服務。它是被打死。

如果不是這種情況,那麼你必須用你自己手動殺死它。

Intent lintent = new Intent(context, LocationService.class); 
context.stopService(lintent); 

您可以將您的應用程序殺死,其中在點使用此代碼。

就是這樣。你很高興與此合作。

-1

是的,你可以停止的onDestroy()活動的服務:

@Override 
public void onDestroy(){ 
Log.v("SERVICE","Service killed"); 
service.stop(); 
super.onDestroy(); 

}

0

最簡單的方法是所有的在一些重複的時間與AlarmManager開始IntentService(10個mintutes),然後再在onHandleIntent()獲取位置並存儲到首選項中。

否需要綁定到您的活動,IntentService將保存在首選項中後自動自行停止。