在 android 中让应用程序 运行 在后台运行

Let app run in background in android

您好: 我很好奇如何显示这个对话框。当我按下允许时,此应用程序的电池优化被禁用。是新的吗androidapi

这是新 App Standby feature introduced with API 23 (Marshmallow) alongside Doze Battery Optimization 的一部分,旨在优化应用程序在后台(应用程序待机)或设备长时间处于睡眠状态(打瞌睡)时的电源和资源使用。

以下是Android Developer's site page的解释:

具体来说,在App Standby模式下,当用户没有主动使用某个应用时,系统判断该应用处于空闲状态。当用户在一段时间内没有触摸应用程序并且满足以下条件 none 时,系统会做出此判断:

  • 用户明确启动应用程序。
  • 该应用当前有一个进程在前台(作为 activity 或前台服务,或者正在被另一个 activity 或前台服务使用)。
  • 该应用会生成用户在锁定屏幕或通知栏中看到的通知。
  • 该应用是一个活跃的设备管理应用(例如,设备策略控制器)。尽管它们通常 运行 在后台运行,但设备管理应用永远不会进入应用待机状态,因为它们必须随时保持可用以从服务器接收策略。

当用户将设备插入电源时,系统将应用从待机状态释放,允许它们自由访问网络并执行任何挂起的作业和同步。如果设备长时间闲置,系统允许闲置应用每天访问一次网络。

因此,这意味着从 API 23 (Marshmallow) 开始,设备可能会主动将您的应用置于待机状态,从而阻止网络访问(比如同步等任务)并限制(或禁用)后台执行.现在,对于大多数应用程序来说,这种行为没有问题,或者您可以 轻松地 优化这种行为,但对于某些应用程序来说,这可能会导致一些意外行为,尤其是对于那些表现不佳的应用程序优化或使用 non-standard 同步策略或其他一些后台手段 sync/execution。 因此,为了避免这种情况,用户可以明确地将应用标记为 non-optimized 并且系统将回退并且不会将应用置于待机状态,尽管这会导致更差的用户体验和您不应该对可以优化的常规应用程序执行此操作。

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            String packageName = context.getPackageName();
            PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
            if (!pm.isIgnoringBatteryOptimizations(packageName)) {
                Intent intent = new Intent();
                intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
                intent.setData(Uri.parse("package:" + packageName));
                context.startActivity(intent);
            }
        }

另外,您需要在manifest中添加以下权限

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />