3

如果我通过 UI 线程中的 AsyncTask 生成一个线程,当 UI 线程终止时该线程是否被终止?

我的 AsyncTask(从 UI 中生成)执行操作,然后酌情调用通知管理器(我的应用程序功能的一部分)。这很好用,但是当应用程序退出时通知会停止,我假设这是因为 UI 线程已经终止,因此孩子也是如此。

我确实考虑过一项服务(假设最初它的执行类似于守护程序),但后来读到这些服务在 UI/主线程上运行,因此不会在 UI 线程终止时持续存在。

我的问题真的是如何获得从 Android 应用程序生成的守护程序的功能?我不需要生成父进程之外的权限,并且它不需要在重新启动后保持不变。

通过NDK的POSIX API'ish线程还是我完全错了?

只在 Android 上呆了几天,所以仍在尝试摸索。非常感谢!

4

3 回答 3

1

If I spawn a thread via AsyncTask from the UI thread, is this thread killed when the UI thread terminates?

Not automatically and not immediately. The thread will run to completion, or until Android terminates the process, whichever comes first.

I did consider a service (assuming initially it would perform similar to a daemon) but then read that these run on the UI/main thread so would not be persistent across the UI thread termination.

Services are not really a "daemon" in classic Linux sense. A service is automatically in the background from a UI standpoint. It is not automatically in the background from a threading standpoint. Any work the service does that will take some time should be done on a background thread. The difference is that with a service running, Android will not be as prone to terminate your process quite as quickly.

My question really is how can I get the functionality of a daemon spawned from an Android app?

That depends on what features of a "daemon" you are trying to obtain, which you neglected to describe in your question.

POSIX API'ish threads through the NDK

That will do you no good. Your threads will still be terminated when your process terminates.

于 2012-06-08T15:30:33.983 回答
1

线程在进程内执行。当应用程序被销毁时,Android 会挂起(供以后重用)或终止应用程序的进程,这会占用所有线程。所以守护进程必须是一个断开连接的进程,而不是一个线程。Android 被故意设置为阻止您启动这些(尽管子进程Runtime.exec()及其亲属很简单)。我认为你可以通过在 NDK 中 fork/exec()'ing 来做你想做的事,但是手机必须植根才能运行生成的应用程序,这会产生很多问题。尤其重要的是,有根电话的保修通常无效。

于 2012-06-08T15:35:18.337 回答
0

我必须实现几乎相同的功能:触发通知表单背景。

这相当简单:启动一个服务并从服务中生成一个新线程。

在许多情况下,Android 平台提供了一些开箱即用的好东西,您不必自己启动线程。

例如:

  • 如果您的线程应该等待某些事情,您可以使用 AlarmManager 安排定期“唤醒”事件,该事件将负责在后台运行
  • 或者,如果您需要在后台与后端同步数据,您可以使用 SyncAdapter API,它也负责在后台运行。

正如CommonsWare刚刚建议的那样:

这取决于您尝试获得的“守护程序”的哪些功能,而您在问题中忽略了这些功能。

于 2012-06-08T15:41:43.227 回答