相关疑难解决方法(0)

如何在Doze模式下使用Android 6.0时使Alarm Manager工作?

我是Google Play上两个闹钟应用的开发者.我想让他们使用Android 6.0.但是,打盹模式使它们不响.我把它们放在白名单上,我放了一个前景通知图标,我不知道我还能做什么 - 当处于打盹模式时,警报管理器警报仍然被忽略.然而,时钟应用程序(这是一个Google Play而不是AOSP应用程序)是不同的.当在Clock应用程序上启用闹钟时,"adb deviceidle step"将始终显示为"active"且永远不会"idle","idle_pending"或其他任何内容.

Android在这里作弊,给自己的应用程序更多的力量,又名."拉苹果"?Google Play上的所有闹钟应用程序是否即将失效?有点担心,这些都是高质量的应用程序,每个人都需要一年的兼职开发时间,并且对我来说是很大的收入来源.关于如何让这些工作起作用的任何线索都将是一个巨大的帮助.

设置AlarmManager意图:

        Intent intent = new Intent(context, ReceiverAlarm.class);
        if (android.os.Build.VERSION.SDK_INT >= 16) {
            intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
        }
        amSender = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); //FLAG_CANCEL_CURRENT seems to be required to prevent a bug where the intent doesn't fire after app reinstall in KitKat
        am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, scheduleToTime+1, amSender);
Run Code Online (Sandbox Code Playgroud)

和ReceiverAlarm类:

public class ReceiverAlarm extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    if (wakeLock == null) {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); …
Run Code Online (Sandbox Code Playgroud)

android alarmmanager android-6.0-marshmallow

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

打盹/待机功能如何影响位置更新?

有人知道当设备处于打盹或应用处于待机状态时,持有部分唤醒锁定的白名单应用是否可以接收位置更新?

Android文档(http://developer.android.com/training/monitoring-device-state/doze-standby.html)仅声明CPU和网络延迟,并且未提及对位置更新的任何影响(即来自LocationManager) ).基于此,似乎位置更新不受Doze/Standby影响,因此如果应用程序持有部分唤醒锁定(以保持CPU运行),则应用程序应该能够接收位置更新.

我已经实现了这一点并对其进行了测试,发现应用程序似乎没有在Doze中接收位置更新,即使它具有部分唤醒锁定并且已列入白名单.有趣的是,当我将设备放在我的办公桌上,一夜之间运行带有唤醒锁定的应用程序时,早上电池几乎是空的,但是当重复使用不带唤醒锁定的应用程序时,电池在早上几乎已满.所以看起来该应用程序一直在运行,但没有收到位置更新.

一些额外的背景:该应用程序用于车队跟踪,所以我们试图找出一个应用程序是否有运行后台服务,可靠地接收位置更新时,使用电池供电.

谢谢!-Tom B.

android location android-6.0-marshmallow android-doze-and-standby

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

Wakelock和打盹模式

根据Android Marshmallow文档,当系统处于打盹模式时,任何唤醒锁被忽略.然而,我不清楚唤醒锁是否会阻止打盹模式.

android android-6.0-marshmallow

14
推荐指数
3
解决办法
1万
查看次数

前景服务从奥利奥被杀

我编写了一个前台服务,它适用于低于Oreo的所有操作系统版本.从Oreo开始,应用程序流程在关闭5分钟后被杀死,并从最近删除应用程序.

根据android开发人员文档中的后台执行限制, 操作系统不应该终止正在运行前台服务的应用程序,并且通知窗口中会显示通知.

根据开发人员文档的指导原则.我按照以下步骤启动前台服务.

  1. 前台服务以startForegroundService()方法开始
  2. 在启动服务后的5秒内,将显示使用该服务的通知 startForeground()
  3. 返回START_STICKYonStartCommand()service

我在以下手机上遇到此问题:

  1. OnePlus 5T
  2. 体内
  3. OPPO

我试图阻止前台服务被破坏?

  1. 通过向用户显示系统对话框以禁用打盹模式,禁用应用程序的电池优化.

我试图重启前台服务?

  1. 用于AlarmManager从onTaskRemoved()重新启动服务.请查看此链接了解详情.

根据我的理解,这些制造商已经定制了AOSP,并且不遵守允许前台服务运行的操作系统指南.可能这些制造商已经做到了这一点,因为它给用户带来了很长的电池续航时间

前台服务课

    class DataCaptureService : Service() {

        private var isServiceStarted = false

        override fun onBind(intent: Intent?): IBinder? {
            return null
        }

override fun onCreate() {
        super.onCreate()
        wakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).run {
                    newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WakelockTag123").apply {
                        acquire()
                    }
                }
    }


        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int …
Run Code Online (Sandbox Code Playgroud)

android android-source android-service

11
推荐指数
3
解决办法
6735
查看次数

在Android 7(One Plus 3T)上杀死应用程序时,警报管理器未触发

自介绍打盹模式和App StandBy管理警报以来已经改变.我面临的问题是我的报警管理器在KitKat,Lolipop和Marshmellow设备上正常启动但在API 23之上它不会触发,除非应用程序处于前台或后台.但是如果应用程序被杀死,警报就会停止.

在我的Android 7上查看Google Keep应用程序,结果证明它也是如此.

但无论应用程序是否被杀,Google日历都会触发.

完成一些阅读并发现setExactAndAllowWhileIdle警报管理器上的方法可确保打破打盹模式并触发警报.

但它不起作用,这里有什么我想念的吗?

这是我的代码:

Intent alertIntent = new Intent(this, NotificationPublisher.class);

    alertIntent.putExtra("Hello", "Meal Time");

    AlarmManager alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);

    int id = (int) System.currentTimeMillis();

    if (Build.VERSION.SDK_INT < 23) {
        if (Build.VERSION.SDK_INT >= 19) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, delay, PendingIntent.getBroadcast(this, id, alertIntent, PendingIntent.FLAG_UPDATE_CURRENT));
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, delay, PendingIntent.getBroadcast(this, id, alertIntent, PendingIntent.FLAG_UPDATE_CURRENT));
        }
    } else {
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, delay, PendingIntent.getBroadcast(this, id, alertIntent, PendingIntent.FLAG_UPDATE_CURRENT));
    }
Run Code Online (Sandbox Code Playgroud)

广播接收器:

public class NotificationPublisher extends WakefulBroadcastReceiver {


@Override
public void onReceive(Context context, Intent …
Run Code Online (Sandbox Code Playgroud)

android alarmmanager

10
推荐指数
1
解决办法
1788
查看次数

打盹模式下的网络访问

打瞌睡时是否可以使用网络访问?如果我的应用程序忽略电池优化不会进入待机状态,但无论如何都会受到打瞌睡的影响.我错过了什么吗?

android android-6.0-marshmallow

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

当设备休眠时,Android 会减慢前台服务的速度

几天来,我一直在努力解决以下问题:我想在屏幕关闭时使用 Android 设备上的重力传感器计算运动模式。我正在使用我在前台启动的绑定服务(带有 Android 8 的通知以使其保持运行),并且在屏幕打开时一切正常。即使应用程序不在前台运行,一切正常。

然而,一旦显示器关闭,非常奇怪的事情就会开始发生:传感器数据仍在处理中,并且在一定程度上计算了移动,但结果非常糟糕且不准确。此外,如果再次打开屏幕,该应用程序的行为非常奇怪。有时应用程序按预期工作,但有时似乎旧传感器事件被延迟处理并在以后计数。从这个时候开始,整个算法就不能顺利运行了。还有什么有趣的:如果设备已插入并且我在 Android Studio 中使用控制台观察一切,一切都运行得非常完美,即使屏幕关闭也是如此。但是,如果拔掉设备,结果又会出错。

我尝试了很多事情:在主线程上运行所有内容,在另一个线程上,使用 IntentService,将 App 设置为Doze的白名单,在屏幕关闭时不向 MainActivity 发送数据,并遵循本指南(我正在开发 Galaxy J5) - 但没有任何效果。似乎 Android 系统的 SensorFusion 算法在待机状态下关闭,即使有注册的监听器,或者三星在后台运行了一些电池优化并限制了 CPU 操作。还有其他可能导致这种行为的原因吗?因此,如果应用程序处于活动状态,如果它在后台运行,但在设备处于睡眠状态时运行良好?

值得一提的是:我正在为 Cordova 开发一个插件。

这是我的代码

主类

public class SensorPlugin extends CordovaPlugin implements ServiceClass.Delegate {

    public void initialize() {
      ...
      Intent serviceIntent = new Intent(applicationContext, ServiceClass.class);
      applicationContext.bindService(serviceIntent, serviceConnection, 
          Context.BIND_AUTO_CREATE);
    }

    public void start() {
        serviceClass.startMeasuring();
    }

    @Override
    public void updateMovementCount(int count) {
        ...
    };

}
Run Code Online (Sandbox Code Playgroud)

服务类

public class ServiceClass extends Service implements …
Run Code Online (Sandbox Code Playgroud)

android android-sensors

8
推荐指数
1
解决办法
1942
查看次数

如何从Doze模式中选择退出应用程序?

如何从android M DOZE模式中选择退出我的应用程序?是否有标准方法在运行时有选择地包含和排除DOZE和自动待机中的应用程序?

android android-6.0-marshmallow

6
推荐指数
1
解决办法
5270
查看次数

如何在棉花糖上强行打瞌睡?

一切似乎都指向这两个命令:

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

我按照运行Marshmallow正式版的Nexus 6上的说明进行操作.我将手机插入我的测试机器.我设置了我的应用程序来测试我想用打瞌睡测试的作品.我关掉了我的屏幕.在battery unplug上面运行后我没有输出所以我认为它有效,但每次我运行deviceidle step输出总是Stepped to: ACTIVE.

我不确定它是否重要,但我正在尝试测试的应用程序的特殊功能是我设置的警报应该将手机从Doze中唤醒.我希望我的设备能够在我的PendingIntent计划AlarmManager.setAlarmClock中断时打瞌睡.这会阻止我的设备进入Doze吗?

android adb android-6.0-marshmallow android-doze-and-standby android-doze

6
推荐指数
2
解决办法
3296
查看次数

Android VoIP 应用程序:PARTIAL_WAKE_LOCK 与忽略电池优化(打盹白名单)

我正在使用 SIP 协议开发 IP 语音 (VoIP) 应用程序,该协议要求应用程序监听来电。这意味着应用程序不得休眠或死亡。

对于旧代码,似乎这样做的方法是获取PARTIAL_WAKE_LOCK

现在从 Android 6.0 及更高版本开始,有新的Doze。建议,如果您不希望您的应用进入待机状态,您应该通过请求REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限将其“列入白名单” 。根据文档,这是专门针对 VoIP 应用程序的。

这两个不同的东西似乎是相关的。我不确定它们是如何相关的,它们是否相互干扰,我是否应该使用一个或另一个或两者,以及是否还有其他考虑。请解释。

另外,我不允许在这个项目上使用推送通知。如果您有其他节省电池的建议,请告诉我。

sip android-wake-lock wakelock android-doze portsip

5
推荐指数
1
解决办法
792
查看次数

禁用电池优化

华为和Honor设备有一种称为“耗电应用”的模式,可以在应用异常消耗时通知用户。

Settings > Battery > "gear icon" > "Close excessively power-intensive apps" > On/Off
Run Code Online (Sandbox Code Playgroud)

有没有办法在华为和荣耀设备中以编程方式禁用它?如果没有,是否有人知道调用电池菜单的意图,以便我可以手动禁用它?

我已经试过了

Intent.ACTION_POWER_USAGE_SUMMARY
Settings.ACTION_BATTERY_SAVER_SETTINGS
Run Code Online (Sandbox Code Playgroud)

但它不起作用

android android-intent android-background huawei-mobile-services

5
推荐指数
0
解决办法
5275
查看次数