我目前有一个处理一些东西的服务,它以startService
. 我想知道,我可以在启动服务后立即调用`stopService 并期望它在处理完成后停止服务吗?
或者当我调用该命令时,Android 会终止服务吗?
人们希望“处理一些东西”在后台线程中完成,假设它需要超过几毫秒。
Android 在很大程度上忽略了这样的后台线程。stopService()
将触发onDestroy()
服务,服务将消失。但是,线程将继续运行,直到它自行终止,或者直到进程终止。
我可以在启动服务后立即调用`stopService 并期望它在处理完成后停止服务吗?
仅当“处理”在主应用程序线程上完成时(例如,在 的主体中onStartCommand()
),如果这样的工作将花费超过几毫秒,这也不是一个好主意。而且,如果确实如此,那么首先就没有充分的理由提供服务。
如果您想获得以下服务:
stopService()
)然后使用IntentService
.
Android 不能只杀死一个Service
. 它所能做的就是杀死整个过程和其中运行的一切。大多数应用程序只有 1 个进程,因此这通常意味着 Android 会杀死一切或什么都不做。大多数时候什么都没有。
Service
or的生命周期Activity
告诉 Android 它是否可以安全地终止进程。进程和线程描述了如果需要内存,进程被杀死的顺序。
重要的是要知道 aThread
从 a 开始Service
/Activity
它根本不受onDestroy
etc 的影响。它只是继续运行。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() 的调用不计算在内 - 无论服务启动多少次,这都会停止服务。
请注意,如果已停止的服务仍然具有绑定到 BIND_AUTO_CREATE 集的 ServiceConnection 对象,则在删除所有这些绑定之前它不会被销毁。有关服务生命周期的更多详细信息,请参阅服务文档。