我阅读了有关AsyncTasks,Services,...的整个文档。 很清楚远程服务的用途。但我遇到了麻烦,获得了LocalService的好处?典型的例子是“播放音乐”或下载大文件。但为什么我要为此开始本地服务呢?
我做了一个小的异步任务,模拟了这样的任务。
AsyncTask<String, Integer, String> async = new AsyncTask<String, Integer, String>() {
@Override
protected String doInBackground(String... params) {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(500);
System.out.println(i);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
return null;
}
};
async.execute("");
大多数答案是,(本地)服务适用于长时间运行的活动,即使主活动关闭也必须运行。好的 - 但我也可以在主活动中使用异步任务执行此操作:
Button btnFinish = (Button) findViewById(R.id.button1);
btnFinish.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
按下按钮调用onDestroy(),但Async任务仍在运行?那么从服务启动AsyncTask就不一样了吗?
//编辑: 我运行了几个测试,我非常确定只要进程,异步任务就会存在。因此,如果我将它包装到本地服务(常见方式) - 它也会活动... ...
那么为什么每个人都使用本地服务执行下载文件,同步等任务,......?
答案 0 :(得分:3)
大多数答案是,(本地)服务适用于长时间运行的活动,即使主活动关闭也必须运行。好的 - 但我也可以在主活动中使用异步任务执行此操作:
不是没有泄漏记忆。切勿从组件中泄漏螺纹。当活动被销毁时,请确保该活动启动的所有线程将快速关闭。
我运行了几个测试,我非常确定Async Task只要进程有效。
正确。但是,如果没有服务,在用户离开前台活动并转到其他应用程序后,该过程可能只存在几毫秒。
服务是一个标记,告诉Android“哟!我还在这里工作,哟!”。此标记无法使进程无限期地保持活动状态,但它通常适用于将在几分钟或几小时内运行的事物。
服务 也有自己的生命周期,与活动无关。例如,如果您希望每15分钟获得一次控制权来执行某项工作,那么正确的解决方案是使用AlarmManager
和IntentService
,并且此应用可能没有活动。
那么为什么每个人都使用本地服务来完成下载文件,同步等任务
因为我们希望它能够正常运作。
答案 1 :(得分:0)
我理解它的方式,AsyncTask的预期用途更符合在进行一些后台处理后更新UI。我们的想法是,当它们完成时,您可以在UI线程上执行某些操作。你建议像服务一样使用它们的方式类似于盲目地排队Runnable并让它在后台线程上运行直到它的处理完成,完全独立于Activity的其余生命周期。通常,可以在onPause或onDestroy中取消这些额外的挂起线程。这样做是不好的形式,因为它们可能导致错误,导致即使在您的活动关闭后也会向用户显示崩溃对话框。
您可以将本地服务用于长时间运行的任务,这些任务不需要具有向用户显示内容的上下文或者独立于应用程序中的任何Activity的上下文。系统会知道不会杀死你的服务,除非应用程序本身被杀死(这是将其绑定到活动的好处)。它们也比远程服务更简单,不需要进程间通信或其他过程。您可能还希望有一个服务,如果从其他地方(本地服务)调用,将触发您的应用程序启动,或者如果您的应用程序死亡,将会死亡。远程服务可以在应用程序的上下文之外运行,因此不依赖于应用程序的生命周期。