【问题标题】:How do I properly fire ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS intent?如何正确触发 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 意图?
【发布时间】:2016-01-11 21:02:09
【问题描述】:

如文档中所述:

“拥有 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限的应用可以触发系统对话框,让用户直接将应用添加到白名单,而无需进入设置。应用触发 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent 以触发对话框。”

有人能告诉我触发这个意图的正确方法吗?

【问题讨论】:

  • 另一种选择是通过 adb 进行操作,或者在应用程序中创建命令行工具来调用类似 answer 的东西,这对我来说非常有用

标签: android android-intent optimization android-6.0-marshmallow android-doze


【解决方案1】:
Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
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);

科特林

val intent = Intent()
val pm : PowerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
if (pm.isIgnoringBatteryOptimizations(context.packageName)) {
    intent.action = Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
} else {
    intent.action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
    intent.data = Uri.parse("package:${context.packageName}")
}
context.startActivity(intent)

更多信息请参见this answer

【讨论】:

  • 请注意这一点 - 我的应用刚刚从 Google Play 暂停,没有事先通知请求REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,即使免除该应用的电池优化对我的应用的功能至关重要,但我不能出于技术原因使用 GCM。
  • @milosmns 他们决定恢复我的应用程序的唯一方法是删除REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限,尽管我解释说根据文档我完全有权请求它。我决定删除它,这样我就不会冒险永久删除该应用程序。 Google 似乎对暂停和永久禁止 Google Play 上的应用程序感到非常高兴和无动于衷。
  • 只有在你的 AndroidManifest.xml 中有 时才会触发
  • @Alin 我最终删除了权限。我会手动引导抱怨应用无法正常工作的用户将应用列入电池优化白名单。
  • @EladNava 谢谢!据我了解,如果没有在清单中声明这一点,则将用户直接引导到退出页面(通过调用 startActivity() 将此操作和应用程序 ID 作为数据)是安全的。
【解决方案2】:

为避免 Google Play 商店被暂停,最好将用户带到电池优化设置,以手动将应用程序添加到白名单

Intent myIntent = new Intent();
myIntent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
startActivity(myIntent);

也不需要有

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

清单文件中的权限

【讨论】:

  • 未经许可 startActivity() 不做任何事情
  • 我同意@KgaboL 的观点,如果清单中缺少 android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS ,那么使用操作 Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS 启动活动不会做任何事情。但是,我确实希望将用户带到 them 的页面以手动打开它。
  • 同时看起来很有趣,您可以通过 ActionIgnoreBatteryOptimizationSettings 将用户带到一个页面以查看您未优化。我只想被带到我优化的页面,这样我就可以禁用它?
【解决方案3】:
    Intent myIntent = new Intent();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        myIntent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        myIntent.setData(Uri.parse("package:" + getActivity().getPackageName()));
    }
    startActivity(myIntent);

【讨论】:

  • 仅代码答案是不够的,请对您的代码提供一点解释
  • 这毫无意义。如果 SDK ,你调用 startActivity 的意图是空的
  • 正如@Jamile 上面提到的那样,您需要清单中的许可才能使其工作,我看到很多警告说您的应用程序可以从 Google Play 中被拉出......看起来很苛刻如果它导致显示一个对话框,则用户做出选择。
猜你喜欢
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多