首页 新闻 会员 周边

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

0
悬赏园豆:100 [已解决问题] 解决于 2015-11-09 18:53

网上查了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也是一样。真是头都大了。。。。请大神救命啊!

问题补充:

用wakelook detector看,QQ和微信一个晚上执行了一百多次。。。我的应用只执行了几次,怎么回事呢,郁闷啊!!!!

安卓粉丝的主页 安卓粉丝 | 初学一级 | 园豆:99
提问于:2015-10-25 14:20
< >
分享
最佳答案
0

顺便进来一起学习一下。

收获园豆:100
Firen | 大侠五级 |园豆:5385 | 2015-10-27 08:44

快来大神啊!!

安卓粉丝 | 园豆:99 (初学一级) | 2015-10-28 13:37

没人知道吗。。。。

安卓粉丝 | 园豆:99 (初学一级) | 2015-11-01 17:59
其他回答(1)
0

参考下这个  http://blog.csdn.net/lcf687619/article/details/51527731

lcf1006 | 园豆:202 (菜鸟二级) | 2016-05-29 10:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册