如何以编程方式关闭Android 8的后台执行限制

时间:2018-07-02 19:13:13

标签: android android-asynctask bluetooth-lowenergy background-thread

我有一个正在运行的应用程序,可以接收低功耗蓝牙通知,并通过在异步线程中将数据发送回源进行响应。我注意到在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();

1 个答案:

答案 0 :(得分:1)

您已经注意到,它是Android开发人员的新常识。 Android文档on Background services进行了以下记录:

  

如果您的应用程序的目标API级别为26或更高,则当应用程序本身不在前台时,系统会对运行后台服务施加限制。在大多数情况下,您的应用应改为使用计划作业。

因此,当您的应用以某种方式进入后台时,您将需要对用户进行某种安排。推荐的方法是使用WorkManager,它是Google JetPack的一部分。同一页上的注释清楚表明:

  

WorkManager适用于需要保证即使应用程序退出时系统也将运行它们的任务,例如将应用程序数据上传到服务器。它不适用于进行中的后台工作,如果应用程序进程消失,该后台工作可以安全地终止;对于这种情况,我们建议使用ThreadPools。

也有Android Jobs,但是作者建议他的用户开始切换到WorkManager,因此此时开始使用它是没有意义的