网上查了N多资料,基本都是讲解AlarmManager要怎么用,但基本没怎么说什么情况会失效或被安卓系统杀掉。都说AlarmManager是系统级的服务,手机睡眠后都能唤醒CPU执行。但本人测试在手机不休眠时能正常功能,一旦休眠后过几个小时后不再重复定时执行。本人写了写入数据库的日志,从日志可以清晰看到定时服务确实没再执行过。下面是本人的代码,请高手指点啊!
在服务的onCreate方法中启动定时发送广播
在服务的onCreate方法中启动定时发送广播
AlarmUtil.startBroadcast(this, 1000*60*10, ConnectionReceiver.class, CommonFinal.CheckConnectionAction);
广播接收器代码
public class ConnectionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获取设备锁 WakeLockUtil.acquireWakeLock(context); if (CommonFinal.CheckConnectionAction.equals(intent.getAction())) { //在此方法内部判断能否需要释放设备锁。 SocketListener.getInstance().checkConnection(); //写入数据库日志。 new BroadcastLogDal(context).insert("接收到广播了!"); } else if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { SocketListener.getInstance().checkConnection(); } } }
AlarmUtil类(定时发送广播)
public class AlarmUtil { // 开启定时服务 public static void startBroadcast(Context context, int seconds, Class<?> cls, String action) { // 获取AlarmManager系统服务 AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, cls); intent.setAction(action); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), seconds, pendingIntent); } // 停止定时服务 public static void stopBroadcast(Context context, Class<?> cls, String action) { AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, cls); intent.setAction(action); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT); // 取消 manager.cancel(pendingIntent); } }
WakeLockUtil类(参考网上代码,具体在哪忘了,不好意思!)
public class WakeLockUtil { private static WakeLock wakeLock = null; //获取电源锁,保持该服务在屏幕熄灭时仍然获取CPU时,保持运行 public static void acquireWakeLock(Context context) { if (null == wakeLock) { PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "HEMSService"); if (null != wakeLock) { wakeLock.acquire(); } } } //释放设备电源锁 public static void releaseWakeLock() { if (null != wakeLock) { wakeLock.release(); wakeLock = null; } } }
昨晚写完12点手机熄屏睡觉,早上起来在本人写的数据库日志中发现,总工才执行了4次,只有4条日志记录,后面就没再执行过,而且本人早入门机开了很久,一直有在操作手机,即使本人手动打开了本人的应用(服务执行了onstart,没有执行onCreate)都没再发现有新的日志出现,在系统设置中看本人的服务显示还是在运行的,而且本人的服务使用:notice表明是在独立的进程的,广播接收器ConnectionReceiver也是一样。真是头都大了。请高手救命啊!
解决方案
20
定制开发机,如小米,是会把AlarmManager的进程kill或延后的,建议在源生模拟器上面试试
20
应该是写到framework层了,这个要细研究
60
试着搞两个service,彼此监视,然后在service里面去做提醒操作。
彼此监视,要是有一个被kill了,另外一个立刻启动。
你试试。、
彼此监视,要是有一个被kill了,另外一个立刻启动。
你试试。、