我的 Android 应用程序没有焦点时如何保持运行?

Posted

技术标签:

【中文标题】我的 Android 应用程序没有焦点时如何保持运行?【英文标题】:How do I keep my Android app running when it doesn't have focus? 【发布时间】:2016-08-20 15:26:18 【问题描述】:

如何让我的 android 应用程序在后台运行,即使它不再具有焦点?现在发生的情况是,在被中断(例如,消息到达)之后,当它重新获得焦点时,它只是坐在那里,处理到中断点为止。可能我的设计不太好,因为我看不出有什么明显的方法可以让它从中断的地方恢复。 (设计的一个原因是长时间运行的查询的输出必须立即给出中间结果,而不是在最后一次全部给出。)

我还希望能够切换到另一个应用程序,但继续处理我的应用程序。我想这与上面的情况相同。

谷歌搜索出现了 service 作为保持应用程序运行的一种方式,但如果用户必须与应用程序交互(我的应用程序就是这种情况),则有人建议不要这样做。

我使用一个Asynctask创建我的数据库(一次;如果被中断,到目前为止没有问题——在下一次执行时,我只是从中断的地方继续加载)和另一个AsyncTask 到 查询它(这可能是一个运行时间很长的任务),但这种方法不会让应用程序在后台运行。任何中断要么导致输出屏幕不完整和死机,要么将焦点返回到用户输入屏幕。

query 功能(当前为 AsyncTask)更改为 service 是否是个好主意?它甚至可行吗? (用户在查询期间不与应用交互。)

我目前有以下私人课程:

private class DatabaseOpenHelper extends SQLiteOpenHelper

private class LoadDatabase extends AsyncTask<Object, Integer, Void>

private class QueryDB extends AsyncTask<Object, String, Void>

您的意见将不胜感激。

编辑

下面的第一个答案表明使用Service 会起作用。

我认为谷歌搜索表明,如果我扩展 IntentService,我的任务会更简单。

另一个编辑

是的,IntentService 正是我所需要的。见this。从AsyncTask 更改为IntentService 相当简单。

【问题讨论】:

【参考方案1】:

对于真正的后台任务,唯一的标准方法是服务,否则您的应用可能会被终止。

AsyncTask 的问题:

非静态内部类会导致内存泄漏; 它与进程的生命周期(而不是宿主 Activity)相关; killing list is low 中的优先级;

使用服务并发送广播消息,形成通知给用户。

注意:默认情况下,服务运行在 UI 线程中,所以还是要使用线程。

IntentService 适用于串行任务。如果您想要多个并行作业扩展服务。

【讨论】:

--谢谢。串行任务确定。不确定如何在这种情况下使用线程;已经在几个桌面程序中成功使用了线程,所以我认为这让我可以很好地为这个应用程序追求service。欢迎任何教程/示例。 我会尝试first。然后来自google team 的完整示例(下载ThreadSample.zip)

以上是关于我的 Android 应用程序没有焦点时如何保持运行?的主要内容,如果未能解决你的问题,请参考以下文章

弹出窗口时如何保持文本框的焦点

Android - 如何在应用程序内保持音乐播放?

如何防止滚动到焦点 EditText [重复]

android tv常见问题(四)焦点变化时,Recyclerview是如何进行滚动的

使终端保持焦点

调用新应用程序时如何保持 Android 在 Kiosk 模式下运行?