簡體   English   中英

stopService是殺死Android服務還是要等到它空閑為止?

[英]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會殺死所有內容或一無所獲。 大多數時候什么都沒有。

ServiceActivity的生命周期告訴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.

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