网上查了N多资料,基本都是讲解AlarmManager要怎么用,但基本没怎么说什么情况会失效或被安卓系统杀掉。都说AlarmManager是系统级的服务,手机睡眠后都能唤醒CPU执行。但我测试在手机不休眠时能正常功能,一旦休眠后过几个小时后不再重复定时执行。我写了写入数据库的日志,从日志可以清晰看到定时服务确实没再执行过。下面是我的代码,请大神指教啊!
在服务的onCreate方法中启动定时发送广播
AlarmUtil.startBroadcast(this, 1000*60*10, ConnectionReceiver.class, CommonFinal.CheckConnectionAction);
广播接收器代码
public class ConnectionReceiver extendsBroadcastReceiver {
@Overridepublic voidonReceive(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 classAlarmUtil {//开启定时服务
public static void startBroadcast(Context context, int seconds, Class>cls, String action) {//获取AlarmManager系统服务
AlarmManager manager =(AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = newIntent(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= newIntent(context, cls);
intent.setAction(action);
PendingIntent pendingIntent= PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);//取消
manager.cancel(pendingIntent);
}
}
WakeLockUtil类(参考网上代码,具体在哪忘了,不好意思!)
public classWakeLockUtil {private static WakeLock wakeLock = null;//获取电源锁,保持该服务在屏幕熄灭时仍然获取CPU时,保持运行
public static voidacquireWakeLock(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 voidreleaseWakeLock()
{if (null !=wakeLock)
{
wakeLock.release();
wakeLock= null;
}
}
}
昨晚写完12点手机熄屏睡觉,早上起来在我写的数据库日志中发现,总工才执行了4次,只有4条日志记录,后面就没再执行过,而且我早上手机开了很久,一直有在操作手机,即使我手动打开了我的应用(服务执行了onstart,没有执行onCreate)都没再发现有新的日志出现,在系统设置中看我的服务显示还是在运行的,而且我的服务使用:notice表明是在独立的进程的,广播接收器ConnectionReceiver也是一样。真是头都大了。。。。请大神救命啊!