2

我目前有一个处理一些东西的服务,它以startService. 我想知道,我可以在启动服务后立即调用`stopService 并期望它在处理完成后停止服务吗?

或者当我调用该命令时,Android 会终止服务吗?

4

3 回答 3

2

人们希望“处理一些东西”在后台线程中完成,假设它需要超过几毫秒。

Android 在很大程度上忽略了这样的后台线程。stopService()将触发onDestroy()服务,服务将消失。但是,线程将继续运行,直到它自行终止,或者直到进程终止。

我可以在启动服务后立即调用`stopService 并期望它在处理完成后停止服务吗?

仅当“处理”在主应用程序线程上完成时(例如,在 的主体中onStartCommand()),如果这样的工作将花费超过几毫秒,这也不是一个好主意。而且,如果确实如此,那么首先就没有充分的理由提供服务。

如果您想获得以下服务:

  • 有一个后台线程,并且
  • 工作完成后自动关闭(避免需要stopService()

然后使用IntentService.

于 2013-06-13T20:36:27.170 回答
0

Android 不能只杀死一个Service. 它所能做的就是杀死整个过程和其中运行的一切。大多数应用程序只有 1 个进程,因此这通常意味着 Android 会杀死一切或什么都不做。大多数时候什么都没有。

Serviceor的生命周期Activity告诉 Android 它是否可以安全地终止进程。进程和线程描述了如果需要内存,进程被杀死的顺序。

重要的是要知道 aThread从 a 开始Service/Activity它根本不受onDestroyetc 的影响。它只是继续运行。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;
    }
}
于 2013-07-22T13:18:41.763 回答
-1

根据文档:

stopService(Intent service)

请求停止给定的应用程序服务。如果服务未运行,则不会发生任何事情。否则将停止。请注意,对 startService() 的调用不计算在内 - 无论服务启动多少次,这都会停止服务。

请注意,如果已停止的服务仍然具有绑定到 BIND_AUTO_CREATE 集的 ServiceConnection 对象,则在删除所有这些绑定之前它不会被销毁。有关服务生命周期的更多详细信息,请参阅服务文档。

于 2013-06-13T20:34:02.463 回答