让app在android中运行

问题描述 投票:5回答:2

嗨:我很好奇如何展示这个对话框。当我按下允许时,此应用程序的电池优化功能被禁用。这是一个新的Android api

android android-alertdialog
2个回答
2
投票

这是API 23(Marshmallow)与App Standby一起推出的新Doze Battery Optimization功能的一部分,旨在优化功能和资源使用,同时应用程序处于后台(App Standby)或设备长时间处于睡眠状态(Doze)。

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

具体来说,在App Standby模式下,系统会在用户未主动使用应用程序时确定应用程序处于空闲状态。当用户在一段时间内未触摸应用程序时,系统会做出此确定,并且以下条件均不适用:

  • 用户明确启动应用程序。
  • 该应用程序当前处于前台(作为活动或前台服务,或由其他活动或前台服务使用)。
  • 该应用会生成用户在锁定屏幕或通知托盘中看到的通知。
  • 该应用程序是一个活动的设备管理员应用程序(例如,设备策略控制器)。虽然它们通常在后台运行,但设备管理员应用程序永远不会进入App Standby,因为它们必须始终可用于从服务器接收策略。

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

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


4
投票
        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);
            }
        }

此外,您需要在清单中添加以下权限

<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
© www.soinside.com 2019 - 2024. All rights reserved.