【问题标题】:How to programmatically turn off Android 8’s background execution limit如何以编程方式关闭 Android 8 的后台执行限制
【发布时间】:2018-07-02 19:13:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如您所见,它是 Android 开发人员的新常态。 Android 文档on Background services 注明:

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

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

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

    还有Android Jobs,但是作者建议他的用户开始切换到WorkManager,所以现在开始使用它没有意义

    【讨论】:

    • 后台线程可以在应用退出时被杀死。我认为创建一个新的 Runable 是使用线程池。
    • 按照推荐的方式是不会被杀掉的。否则,无法保证您的线程会存活......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2023-04-04
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多