我有一个正在运行的应用程序,可以接收低功耗蓝牙通知,并通过在异步线程中将数据发送回源进行响应。我注意到在Android 8下,该应用程序以及推送到后台的数据发送都已暂停。是否可以将其关闭或我是否需要将应用程序作为服务进行改进,并且该应用程序将继续接收蓝牙回调(如“特征更改”通知)?
更新1.我无法获得运行Oreo的真实设备来测试后台睡眠,因此我创建了一个运行8.1的虚拟Pixel 2,并在onCreate()中运行了以下代码。令人惊讶的是,即使在打开手机和浏览器应用程序之后,后台线程仍能按时运行。
Thread workThread = new Thread(new Runnable()
{
public void run()
{
int i = 0;
try
{
while (true)
{
Log.d(LOGTAG, "Work Thread: " + i++);
Thread.sleep(500);
}
}
catch (InterruptedException ie)
{
Log.d(LOGTAG, "Work Thread interrupted");
}
catch(Exception e)
{
Log.d(LOGTAG, "Work Thread error: " + e.toString());
}
Log.d(LOGTAG, "Work thread stopped");
}
});
workThread.start();
答案 0 :(得分:1)
您已经注意到,它是Android开发人员的新常识。 Android文档on Background services进行了以下记录:
如果您的应用程序的目标API级别为26或更高,则当应用程序本身不在前台时,系统会对运行后台服务施加限制。在大多数情况下,您的应用应改为使用计划作业。
因此,当您的应用以某种方式进入后台时,您将需要对用户进行某种安排。推荐的方法是使用WorkManager,它是Google JetPack的一部分。同一页上的注释清楚表明:
WorkManager适用于需要保证即使应用程序退出时系统也将运行它们的任务,例如将应用程序数据上传到服务器。它不适用于进行中的后台工作,如果应用程序进程消失,该后台工作可以安全地终止;对于这种情况,我们建议使用ThreadPools。
也有Android Jobs,但是作者建议他的用户开始切换到WorkManager,因此此时开始使用它是没有意义的