[英]Does stopService kill a Android service or does it wait untill it's idle?
我目前有一個處理某些內容的服務,它以startService
啟動。 我想知道,我可以在啟動服務后立即調用`stopService並期望它在處理完成后停止服務嗎?
還是我調用該命令時Android會終止該服務?
有人希望“處理某些東西”在后台線程中完成,假設這將花費幾毫秒以上的時間。
Android在很大程度上忽略了這樣的后台線程。 stopService()
將觸發服務的onDestroy()
,服務將消失。 但是,線程將繼續運行,直到它自己終止或進程終止為止。
我可以在啟動服務后立即調用`stopService並期望它在處理完成后停止該服務嗎?
僅當在主應用程序線程上(例如,在onStartCommand()
的主體中onStartCommand()
完成了“處理”時,如果這樣的工作要花費幾毫秒以上的時間,這也不是一個好主意。 而且,如果確實如此,則沒有充分的理由首先要提供服務。
如果您想獲得以下服務:
stopService()
) 然后使用IntentService
。
Android不能僅僅殺死一項Service
。 它所能做的就是殺死整個過程以及其中運行的所有內容。 大多數應用只有1個進程,因此這通常意味着Android會殺死所有內容或一無所獲。 大多數時候什么都沒有。
Service
或Activity
的生命周期告訴Android它是否可以安全地終止該進程。 進程和線程描述了在需要內存時殺死進程的順序。
重要的是要知道,從Service
/ Activity
啟動的Thread
完全不受onDestroy
等的影響。它只會一直運行。 Android根本不知道該線程,也不會為您停止它。
這意味着,如果您想進行一些后台處理,則必須將此類線程的生命周期鏈接到您的Activity
/ Service
的生命周期,否則Android可能會殺死該進程,從而殺死您的線程。
運行時每秒打印到logcat的服務的快速示例。 不基於IntentService
因為它或多或少是針對具有結束目的的任務的。
public class MyService extends Service {
public static void start(Context context) {
context.startService(new Intent(context, MyService.class));
}
public static void stop(Context context) {
context.stopService(new Intent(context, MyService.class));
}
private final ExecutorService mBackgroundThread = Executors.newSingleThreadExecutor();
private Future<?> mRunningTask;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// startService -> start thread.
if (mRunningTask == null) {
// prevents task from being submitted multiple times.
// actually not necessary when using a single thread executor.
mRunningTask = mBackgroundThread.submit(mRunnable);
}
return START_STICKY;
}
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
while (!Thread.interrupted()) {
try {
// Do something
Log.d("Service", "I'm alive");
Thread.sleep(1000);
} catch (InterruptedException e) {
Log.d("Service", "Got interrupted", e);
Thread.currentThread().interrupt();
}
}
}
};
@Override
public void onDestroy() {
// stopService > kill thread.
mBackgroundThread.shutdownNow();
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
根據文檔:
stopService(Intent service)
請求停止給定的應用程序服務。 如果該服務未運行,則什么都不會發生。 否則將停止。 請注意,不計入對startService()的調用-無論服務啟動了多少次,都將停止該服務。
請注意,如果停止的服務仍然具有綁定了ServiceConnection對象且已設置BIND_AUTO_CREATE,則在刪除所有這些綁定之前,該服務不會被銷毀。 有關服務生命周期的更多詳細信息,請參見服務文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.