2016-10-10 54 views
6

好日子, 情况:电池优化(wakelocks)4.0+

我开发作为运动跟踪器/导航应用Android应用 - 所以它需要对GPS,也永久清醒设备永久连接。录音每秒完成一次。

目前的解决方案多年工作得益于wakelocks,保持设备清醒。

在Android 6.0+打盹模式使情况复杂化,但它不是这种情况。

在华为设备上可能是不同类型的优化。

这里是日志的一部分:

10-10 10:33:18.462 1014-384 D/PFW.HwPFWAppWakeLockPolicy: getUidWakeLock uid: 10097 wakelock >= 10 mins 10-10 10:33:18.543 1014-384 D/PFW.HwPFWAppWakeLockPolicy: force stop abnormal wakelock app uid: 10097 10-10 10:33:18.558 1014-384 I/ActivityManager: Force stopping menion.android.locus appid=10097 user=0: from pid 1014

所以经过约。 30分钟以上,系统只是简单地决定应用程序使用太多wakelocks并完全终止它与所有服务,历史,只需kill

任何这种行为和任何建议的经验,如何更简单的任务(屏幕关闭时永久记录GPS位置)?

正如我在开始时所写的,除了新的华为之外的其他所有设备,这样的系统多年来都运行正常。

编辑:华为电池管理器中的“白​​名单”应用(标记为“受保护的应用”)中的一个用户(删除?)评论后注释对此问题没有影响。

回答

1

您是否尝试设置定期发布WakeLock并在几秒后重新获取它的闹钟?如果问题在于华为的Android不喜欢Wakelocks的滥用,如果您偶尔发布它,也许它们很好? 例如:我想你会有一个后台进程在前台运行。如果是这样,在你的onStartCommand插入:

setupWakeupAlarm(context); 

其中,该方法被定义为:

private static void setupWakeupAlarm(Context context) { 
    AlarmManager mWakeUpAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    PendingIntent mWakeUpAlarmIntent; 
    Intent serviceIntent; 
    serviceIntent = new Intent(context, SSAlarmReceiver.class); 
    mWakeUpAlarmIntent = PendingIntent.getBroadcast(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    // every 5 minutes 
    mWakeUpAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
      SystemClock.elapsedRealtime() + WAKEUP_ALARM_FREQUENCY, mWakeUpAlarmIntent); 
    Log.d("TAG", "wakup alarm set up or reset!"); 
} 

其中接收器是一个本地类:

static public class SSAlarmReceiver extends WakefulBroadcastReceiver { 
    @Override 
    public void onReceive(final Context context, Intent intent) { 
     setupWakeupAlarm(context); 
     mBackgroundService.stopForeground(true); 
     if (mWakeLock.isHeld()) 
      mWakeLock.release(); 
     new Timer().schedule(
       new TimerTask() { 
        @Override 
        public void run() { 
         mWakeLock.acquire(); 
         mBackgroundService.startForeground(mNotificationId, mNotification.getNotification()); 
         } 
       }, 
       3000 
     ); 
    } 
} 

注意,在我的情况下,我还有我的后台服务在前台运行,我决定停止前台。不确定是否有必要。

风险当然是在3秒内Wakelock不活跃,你的过程可能会被杀死。

3

有两种华为系统的应用程序,可能会杀死用户的应用程序,以节省电池:

  • 的SystemManager(com.huawei.systemmanager)杀死屏幕关闭后,除非他们在“仍在运行的所有应用受保护的应用程序“列表。
  • PowerGenie(com.huawei.powergenie)杀死了长时间持有唤醒锁的应用程序。

这听起来像是你的应用程序正在被PowerGenie杀死。您可以通过利用PowerGenie的唤醒锁标记的硬编码白名单来避免这种情况。例如,如果您的唤醒锁的标签是“LocationManagerService”,它将被PowerGenie忽略,因为系统服务使用相同的标签持有唤醒锁,并且PowerGenie已将其列入白名单。