标签: android-doze

如何正确触发ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS意图?

如文档中所述:

"An app holding the REQUEST_IGNORE_BATTERY_OPTIMIZATIONS permission can trigger a system dialog to let the user add the app to the whitelist directly, without going to settings. The app fires a ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent to trigger the dialog."

Can someone tell me the proper way to fire this intent?

optimization android android-intent android-6.0-marshmallow android-doze

31
推荐指数
2
解决办法
2万
查看次数

电池省电+电话呼叫意图=>没有互联网?

注意:事实证明,原始问题在其假设中是不正确的.在底部查看有关其编辑的更多详细信息.

它现在关于电池节电器,而不是电池节电和打盹模式.它也不是关于Service&BroadcastReceiver,而是仅仅是BroadcastReceiver.

背景

从Android Lollipop开始,Google推出了新的,手动和自动的方式来帮助节省电池:

"打盹"模式和"电池节电器".

在某些情况下,由于这些技术,应用程序可能无法访问Internet.

问题

我在一个应用程序上工作,该应用程序需要使用在特定情况下触发的后台服务来访问Internet,如果收到重要内容,则会显示一些UI.

作为用户,我注意到在某些情况下,它无法访问Internet.

检查应用程序是否可以访问Internet是这样的:

public static boolean isInternetOn(Context context) {
    final NetworkInfo info = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
    return !(info == null || !info.isConnectedOrConnecting());
}
Run Code Online (Sandbox Code Playgroud)

问题是我需要检查为什么这有时会返回false,所以如果它失败了,我们应该告诉用户(可能通过通知)无法访问数据,因为设备限制了应用程序,并提供给用户从电池优化中列出应用程序.

我不确定哪些影响这个:打盹,节电或两者兼而有之,如果总是这样,对于所有设备,在所有情况下.

我试过的

我找到的是如何查询打盹模式和省电模式(省电模式):

public class PowerSaverHelper {
    public enum PowerSaveState {
        ON, OFF, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
    }

    public enum WhiteListedInBatteryOptimizations {
        WHITE_LISTED, NOT_WHITE_LISTED, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
    }

    public enum DozeState {
        NORMAL_INTERACTIVE, DOZE_TURNED_ON_IDLE, NORMAL_NON_INTERACTIVE, ERROR_GETTING_STATE, IRRELEVANT_OLD_ANDROID_API
    }

    @NonNull
    public static DozeState getDozeState(@NonNull Context context) {
        if (VERSION.SDK_INT < VERSION_CODES.M)
            return DozeState.IRRELEVANT_OLD_ANDROID_API; …
Run Code Online (Sandbox Code Playgroud)

android internet-connection battery-saver android-doze

27
推荐指数
1
解决办法
1724
查看次数

最小的Android前台服务在高端手机上被杀死

我正在尝试创建一个允许用户记录路线(位置/ GPS)的应用程序.为了确保即使屏幕关闭也会记录位置,我已经foreground service为位置记录创建了一个.我将位置存储在一个Room Database注入我的服务中的位置Dagger2.

但是,这项服务被Android杀死,当然这并不好.我可以订阅低内存警告,但这并没有解决我的服务在运行Android 8.0的现代高端手机上大约30分钟后被杀的根本问题

我创建了一个只有"Hello world"活动和服务的最小项目:https://github.com/RandomStuffAndCode/AndroidForegroundService

该服务在我的Application课程中启动,路由记录通过以下方式启动Binder:

// Application
@Override
public void onCreate() {
    super.onCreate();
    mComponent = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build();

    Intent startBackgroundIntent = new Intent();
    startBackgroundIntent.setClass(this, LocationService.class);
    startService(startBackgroundIntent);
}

// Binding activity
bindService(new Intent(this, LocationService.class), mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT);
// mConnection starts the route logging through `Binder` once connected. The binder calls startForeground()
Run Code Online (Sandbox Code Playgroud)

我可能不需要BIND_AUTO_CREATE旗帜,我一直在测试不同的旗帜,试图不让我的服务被杀 - 到目前为止没有运气.

使用分析器看起来我没有任何内存泄漏,内存使用率稳定在~35mb:

探查

使用adb shell dumpsys activity …

android android-service android-location android-lifecycle android-doze

26
推荐指数
2
解决办法
8112
查看次数

如何在打盹模式下移动设备(Android Preview M/Marshmallow)?

我按照这里描述的步骤:

https://developer.android.com/preview/testing/guide.html#doze-standby

情况:

  • Android Debug Bridge版本1.0.32

  • Nexus 9预览M

贝壳:

$ adb shell dumpsys battery unplug
Run Code Online (Sandbox Code Playgroud)

=>工作,设备拔掉

$ adb shell dumpsys deviceidle step
Run Code Online (Sandbox Code Playgroud)

=>输出:步进到:ACTIVE

$ adb shell dumpsys deviceidle -h
Run Code Online (Sandbox Code Playgroud)

=>不起作用=>输出:

Device idle controller (deviceidle) dump options:

[-h] [CMD]

-h: print this help text.

Commands:

step

disable

enable

whitelist
Run Code Online (Sandbox Code Playgroud)

我尝试过:

adb shell dumpsys deviceidle enable
Run Code Online (Sandbox Code Playgroud)

但它没有用.

所以我的问题,如上所述,如何在打盹模式下移动设备?我犯了什么错?

编辑 - 2016年6月:

新链接:https: //developer.android.com/training/monitoring-device-state/doze-standby.html

android android-6.0-marshmallow android-doze

23
推荐指数
2
解决办法
3万
查看次数

打盹模式如何影响后台/前台服务,有/无部分/完整唤醒锁?

这是一个简单的问题,看到G +(这里)有关于此的大量帖子,以及官方文档(这里)缺乏信息:

当设备进入"打盹"模式时,应用程序的服务会发生什么变化?

它对后台/前台服务(绑定/未绑定,已启动/未启动)有什么作用,有/无部分/完整唤醒锁?

例如,为了创建在设备屏幕关闭时播放音频流的服务,您会做什么?如果音频流不是来自本地文件,而是来自网络,该怎么办?

看到Google开发者声称:

已经运行前台服务的应用程序(带有相关通知)不受打盹的限制.

- 之后进行了大量的讨论,声称这并不完全正确,我认为知道特殊的后台操作应用程序应该做什么是相当令人困惑的.

android android-service android-doze-and-standby android-doze

19
推荐指数
1
解决办法
5848
查看次数

Android 7.0(Nougat)打盹模式停止Web服务

我有一个带有WiFi锁的Android前台服务,它充当另一个本地设备的Web服务.在打盹模式之前,获取WiFi锁并根据需要提供服务非常有效.

即使关闭了我的应用程序的电池优化功能,当屏幕关闭几分钟时,手机仍然会杀死应用程序.

如何正确警告Android明确地在前台执行客户请求的服务,并且他们此时不希望他们的手机进入睡眠状态?

编辑:这个问题仍然存在于Android 8.0(奥利奥)

android android-wifi android-doze

19
推荐指数
1
解决办法
873
查看次数

Android Alarm Manager setExactAndAllowWhileIdle()在Doze模式下无法在Android 7.0 Nougat中运行

我试图使用Alarm Manager每隔30分钟在我的应用程序中发出警报,setExactAndAllowWhileIdle但它无法正常工作!

每当收到报警信号时,我都会通过发出推送通知来测试功能.

问题是:当设备闲置一段时间后进入打盹模式时,我不再收到警报.但是,只要我打开屏幕,我就会收到通知.我的应用程序需要准确的警报,需要每30分钟准确按时交付!由于设备处于打盹模式,它无法接收延迟警报或丢失警报!

我在我的代码中使用了以下内容:

  1. 我在打开应用程序时设置闹钟.
  2. 我使用WakefulBroadcastReceiver接收警报信号.在它的 onReceive()方法中,我设置下一个警报.我也是,启动一个只发出推送通知的startWakefulService,然后自行停止.
  3. 我在onReceive()的末尾调用completeWakefulIntent.
  4. 我尝试了两种方法:RTC_WAKEUP和ELAPSED_REALTIME_WAKEUP

笔记:

  • wakefulbroadcastReceiver类在Manifest中注册.
  • 我添加了权限: android.permission.WAKE_LOCK
  • 我试过White-Listing我的应用程序,但结果是一样的
  • 我尝试使用setAlarmClock()它甚至在打盹模式下一直工作,每50个警报一个丢弃/延迟警报.所以,它也不完美.而且我不希望用户一直看到警报图标.
  • 在打盹期间,setExactAndAllowWhileIdle()不仅不起作用,而且在它工作时也具有可怕的准确性.我通常会
    在1-3分钟后或1-3分钟前收到很多警报信号.
  • 我正在使用华为Mate 8和android 7.0 Nougat进行测试.

PS: 在回答之前,请确保您了解从Android 6.0 M和Doze模式开始施加的限制.

Link1:https://developer.android.com/training/monitoring-device-state/doze-standby.html

总之它说:

  • 如果需要设置在Doze中触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle().
  • 使用setAlarmClock()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze.

现在,为什么我不能每30分钟使用setExactAndAllowWhileIdle()?获得准确的报警信号?而且,为什么不是setAlarmClock()100%可靠?!

android android-intent android-alarms android-doze android-7.0-nougat

16
推荐指数
2
解决办法
4420
查看次数

如何检测App是否已进入或退出App Standyby模式(Android M +)

如果设备处于DOZE IDLE或IDLE_MAINTENANCE模式,如果我们为" android.os.action.DEVICE_IDLE_MODE_CHANGED " 注册广播接收器,则可以接收这些事件.但是当使用adb命令使App进入App Standby时,此接收器无法正常工作.对于在Marshmallow及以上版本上运行的设备,我们是否有可能以编程方式检查应用程序是否已进入或退出App Standby模式?

用于使App进入App Standby的adb命令

adb shell dumpsys battery unplug
adb shell am set-inactive {Package name} true
Run Code Online (Sandbox Code Playgroud)

并退出

adb shell am set-inactive {Package name} false
Run Code Online (Sandbox Code Playgroud)

android android-6.0-marshmallow android-appstandby android-doze-and-standby android-doze

13
推荐指数
0
解决办法
708
查看次数

推送通知在 Android Doze 模式下延迟

我正在通过 adb 让我的 Android 设备进入睡眠状态:

adb shell dumpsys battery unplug
adb shell dumpsys deviceidle step <-- repeat until state is IDLE
Run Code Online (Sandbox Code Playgroud)

然后我发送以下 JSON:

{
   "to":"dYA7tVZrfag:APA91bFVqddVcJHnr_7ZhgNC5iu4Y6XKcLbSVD4DlZgfjMKwKvZhJHiKR4DIzpMrX8zUL15C_adfyEcrlI9q6zOFqFs_zwNPTVIDm-v20ZK0qgagKYGaQE1OPBqdH4P_JHYIXOIS3gfn",
    "priority": "high",
    "data":{
        "test0":"test0",
        "test1":"test1"
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:什么都没有……直到我唤醒设备,然后我才能将所有消息排队。我正在通过将日志放入方法来监视消息是否到来onMessageReceived()

我搜索了一下,有人说使用旧版本的 Android Studio 或升级 FCM SDK 的版本 (9.4.0) 可以解决问题。我都做了,但都没有成功。

编辑:这个问题似乎只发生在三星 Galaxy S5 上

android push-notification firebase-cloud-messaging android-doze

9
推荐指数
0
解决办法
2979
查看次数

Android - 空闲时允许重复警报

我需要每隔X小时设置一次重复警报,甚至会在打盹模式下触发.但是,AlarmManager for Android 23中唯一可用的Apis是setExactAndAllowWhileIdle和setAndAllowWhileIdle,它们不用于重复警报.

我想知道每次发射时我是否应该重新安排闹铃?或者有更好的解决方案吗?

android android-alarms android-6.0-marshmallow android-doze-and-standby android-doze

9
推荐指数
1
解决办法
2773
查看次数