2

我有一个 Android 应用程序,它使用服务在应用程序打开时不断更新视图中的文本视图。它使用向其发送意图的广播接收器对其进行更新。根据应用程序的性质,即使在应用程序退出/视图消失后,服务也需要继续运行。显然在这种情况下在主线程上运行服务是不明智的,因为这会占用太多并最终强制关闭并使应用程序崩溃。那么保持此服务运行的最佳方法是什么?异步任务?一个单独的线程?我该怎么做呢?我用这样的 ASyncTask 进行了尝试:

private class MyTask extends AsyncTask {

    @Override
    protected Object doInBackground(Object... objects) {
        return getActivity().getApplicationContext().startService(intent);
    }

    @Override
    protected void onCancelled() {
        getActivity().getApplicationContext().stopService(intent);
        super.onCancelled();
    }
}

哦,是的,我正在使用 getActivity().getApplicationContext() 因为这是在片段内部。

所以这很好用;我想启动它时调用 MyTask.execute() ,当我想停止它时调用 MyTask.cancel(true) ,但我很确定我没有使用它应该如何使用它。我什至不知道我应该使用什么作为执行方法的参数(??)。并且仅在其中启动服务似乎不是最好的主意,而仅使用线程肯定会更好吗?为了让它按照预期的方式工作,正确的方法是什么?顺便说一句,虽然这确实比在主线程上运行它的工作时间要长得多,但它仍然在几个小时后崩溃。

4

4 回答 4

3

您可以使用异步任务在 android 中执行后台任务。除非在特定情况下,否则不建议您自己处理线程。即使用户切换到另一个视图,异步任务也将在后台线程中运行,您也可以使用 onProgress() 更新定期获取回调。这里有一些关于异步任务的好教程,可以帮助您入门。请仔细阅读它们,因为异步任务将在 android 开发中为您提供很多帮助。

http://mobileorchard.com/android-app-developmentthreading-part-2-async-tasks/

http://www.vogella.com/articles/AndroidPerformance/article.html

这里是官方文档: https ://developer.android.com/reference/android/os/AsyncTask.html

于 2012-10-05T05:25:41.350 回答
1

更新:我想我明白了。我在我认为我需要做的事情上还差得很远,显然对于我所拥有的那种服务,我只需要在前台运行它(所以使用 startForeground() 方法)。它现在似乎正在工作。对不起!

于 2012-10-07T04:03:53.033 回答
0

您不应该在除事件线程之外的另一个线程中启动服务,而是如果某些代码需要更长的时间在服务中执行,则将该代码仅放在服务类中的另一个线程中。

要在主应用程序以外的其他进程中执行服务,您应该在服务的清单文件中定义进程标记。

于 2012-10-05T05:23:14.767 回答
0

在后台线程上调用 startService 不会使服务在后台线程上运行。您应该正常调用 startService,而不使用 Async Task。在您的服务中,您应该创建一个新线程来完成这项工作。在这里你不应该使用 AsyncTask 因为这个服务可以无限期地运行,它不是一个定义的任务。

于 2012-10-05T05:31:33.133 回答