如果没有焦点,我如何让我的Android应用程序运行?

时间:2016-04-26 16:49:25

标签: java android service android-asynctask

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

我也希望能够切换到另一个应用程序,但保持我的应用程序处理。我猜这与上述情况相同。

谷歌搜索显示 service 作为一种保持应用程序运行的方式,但如果用户必须与应用程序进行交互,则一次点击建议不要这样做,我的情况就是如此应用

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

查询功能(目前为AsyncTask)更改为 AsyncTask 会是一个好主意吗?它甚至可行吗? (用户在查询期间不与app交互。)

我目前有以下私人课程:

service

private class DatabaseOpenHelper extends SQLiteOpenHelper

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

您的意见将不胜感激。

修改

下面的第一个答案表明使用private class QueryDB extends AsyncTask<Object, String, Void>会有效。

我认为谷歌搜索已经建议,如果我延长Service,我的任务会更简单。

另一个编辑

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

1 个答案:

答案 0 :(得分:3)

对于真正的后台任务,唯一的标准方法是服务或您的应用程序可以被杀死。

AsyncTask的问题:

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

使用服务并发送广播消息,向用户发出通知。

注意:默认情况下,服务在UI线程中运行,因此仍然必须使用线程。

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