Activity 认可继续服务奥利奥

Activity Recognition continues services in Oreo

我正在为这个问题伤脑筋,目前还没有解决方案。我看到很多指南如何完成此操作 (Documentation, Tutorial) 并在 android 中成功实现了它 7. 我设法做的是当用户 activity 改变了。我的应用程序完美运行。问题出在 android 8 和 google 电池管理上。我的服务总是被杀死。所以...我已经尝试解决这个问题:

  1. 向用户解释如何禁用我的应用程序的电池优化,这样它就不会终止我的服务。问题是它对于普通用户来说太复杂了。

  2. 添加

    uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"
    

并用代码检查:

Intent intent = new Intent();
            String packageName = context.getPackageName();
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                if (pm.isIgnoringBatteryOptimizations(packageName)){
                    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);

                }
                else {
                    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                    intent.setData(Uri.parse("package:" + packageName));
                }
            }
            context.startActivity(intent);

但我知道我的应用程序可能会被 Play 商店禁止,这是个大问题。

  1. 使用具有持久通知的前台服务。问题是用户看到这个持续不断的、有时是无关紧要的通知是非常有害的。

那么,即使我的应用程序在 android 8 中处于后台,我如何才能使用 ActivityRecognitionClient 并在 activity 更改时始终收到通知?也许以某种方式直接连接 google 服务?

考虑使用 DetectedActivityFence,Awareness API 的一部分。在这种情况下,是系统监视并向您发送广播,因此不需要 运行 您自己的后台服务。

收到围栏的广播后,您可以使用 startForegroundService 来响应广播。即使您的应用程序处于后台并且相应的面向用户的通知只会显示一小段时间,这仍然有效。