关于安卓AlarmManager定时会失效的问题,请大神指教!

代码改变世界 2015-10-25 02:28:04
网上查了N多资料,基本都是讲解AlarmManager要怎么用,但基本没怎么说什么情况会失效或被安卓系统杀掉。都说AlarmManager是系统级的服务,手机睡眠后都能唤醒CPU执行。但我测试在手机不休眠时能正常功能,一旦休眠后过几个小时后不再重复定时执行。我写了写入数据库的日志,从日志可以清晰看到定时服务确实没再执行过。下面是我的代码,请大神指教啊!
在服务的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也是一样。真是头都大了。。。。请大神救命啊!
...全文
25732 72 打赏 收藏 转发到动态 举报
写回复
用AI写文章
72 条回复
切换为时间正序
请发表友善的回复…
发表回复
采菊东篱yy 2019-10-12
  • 打赏
  • 举报
回复
我用的是华为mate10,安卓9,之前也收不到广播,打开允许后台活动后就可以了
采菊东篱yy 2019-10-12
  • 打赏
  • 举报
回复
打开手机管家,应用启动管理,将你的应用设置成手动管理,允许后台活动试一下,我的可以。
形上为道 2019-03-06
  • 打赏
  • 举报
回复
@西瓜CSDN 使用系统日历只不过是添加提醒事件,要做什么定时任务做不了吧
qq_37950256 2018-12-11
  • 打赏
  • 举报
回复
设置成RTC_WAKEUP的类型,结果通过adb看到类型变成了RTC,导致息屏后无法接收到广播,亮屏后马上就能接收到广播
会飞的兔子丶 2018-12-08
  • 打赏
  • 举报
回复
可以尝试下锁屏亮屏监听,然后通过记录熄屏和亮屏记录和获取系统时间来计算。希望这个思路能帮到你们。
西瓜csdn 2018-10-17
  • 打赏
  • 举报
回复
换种方式实现吧,参考这篇文章,能够实现提醒效果,还不用担心app被杀各种问题https://blog.csdn.net/wx1396530501/article/details/83106521
零度殇 2018-07-20
  • 打赏
  • 举报
回复
  static void scheduleAlarms(Context ctxt) {
AlarmManager mgr = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent("keeplive");
PendingIntent pi = PendingIntent.getBroadcast(ctxt, 0, i, 0);
mgr.cancel(pi);
mgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + PERIOD, pi);

}

零度殇 2018-07-18
  • 打赏
  • 举报
回复
感觉有问题 闹钟的不准时,还是会导致 时间差的存在
零度殇 2018-07-18
  • 打赏
  • 举报
回复
2018-07-18 手机锁屏,5-10分钟后进入休眠状态,蓝牙广播,服务等被暂停,并没有杀死,但是收不到信息(重新唤醒屏幕,广播和服务都被唤醒), 尝试了PowerManager.WakeLock和1像素保活的方法并没有用,目前正在用AlarmManager 思路:4分钟左右设置一次AlarmManager ,然后用广播接收AlarmManager ,然后点亮屏幕
  PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "");
wakeLock.acquire();

KeyguardManager km= (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
//这里参数”unLock”作为调试时LogCat中的Tag
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("unLock");
kl.disableKeyguard(); //解锁


不同手机设置的时间差距好大
设置60s 在中兴有的手机上要等7分钟多
Cong_Deemo 2018-05-26
  • 打赏
  • 举报
回复
2018.5.26 公司突然想要一个闹钟提示功能,然后再Service开启Alarm,然而,杀后台后吧我的Service杀了,而且Service也死了,IOS的同事说IOS那边不会这样。。。。。 国内的坑货厂商,人家Android原生都是设置就是全局,哪怕Service被杀了也能定时执行。。。。
qq_36169694 2018-04-18
  • 打赏
  • 举报
回复
2018.4.18 入坑 做物联平台 需要长连接 之前心跳是timer做的锁屏后被挂起 后面改成alarm后发现锁屏不会被干掉 但是魅族手机以及小米都会在后台运行的时候alarm不执行
WonderEgg 2018-04-02
  • 打赏
  • 举报
回复
2018.4.2 同样入坑的我来打个卡,应用想实现一个定时任务,Service不死可以执行。如果进程被杀,就不会定时执行任务,所谓的系统级别的服务就这样失效了。各大厂商为了优化手机性能,可苦了我们这群Android开发者!我就想看看什么时候这个问题才能够解决。。。
tulensa 2018-03-13
  • 打赏
  • 举报
回复
都快3年了,这个问题居然还没解决。。这个问题也是两面性吧,国内的软件太杂了,太多乱占用手机资源的了,所以小米华为这些才会在底层做限制吧。
天为峰 2018-02-11
  • 打赏
  • 举报
回复
我用华为mate9,单独写的一个demo可以正常唤醒,即使在锁屏状态下。 但我的app中不行,我发现它也发送了通知的,但是必须重新打开app然后通知才出来。这是什么情况?
qq_19762741 2018-01-06
  • 打赏
  • 举报
回复
不遵守标准,害苦了开发者
「已注销」 2017-12-06
  • 打赏
  • 举报
回复
快来做iOS 吧,省心省力,设备给你发的还好。
  • 打赏
  • 举报
回复
大佬们还没解决吗 还有华为手机下持有WakeLock锁也会进入休眠状态啊
小天才嗷大喵 2017-11-22
  • 打赏
  • 举报
回复
为什么会有这个问题,明显为难我胖虎啊
qq_18497815 2017-10-27
  • 打赏
  • 举报
回复
我都快被这问题弄疯了,我宁愿选择死亡
lishipengche 2017-09-05
  • 打赏
  • 举报
回复
manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), seconds, pendingIntent); AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2; AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0; 1首先你要搞清楚相对时间和局对时间问题,显然绝对时间更靠谱 2其次重复时间在5.0之后是不固定的 会根据系统中已经注册的alarm所要执行的时间提前或推后
加载更多回复(52)

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧