几天后,AlarmManager停止工作

时间:2014-08-15 17:01:43

标签: android

我有一项服务,应该每隔1分钟运行一次。我使用广播接收器和AlarmManager来完成这项工作。我也打电话给PowerManger.aquire()以确保cpu在服务启动之前不会睡觉。在前2或3天,应用程序运行正常但在此之后服务无法启动。声音alarmManager没有启动它。任何想法为什么?

public class MyReceiver extends BroadcastReceiver {
    PowerManager pawerManager;
    public static PowerManager.WakeLock wakeLock=null;
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
         pawerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         wakeLock = pawerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
         wakeLock.acquire();
         Intent serviceIntent=new Intent(context,MyService.class);
         context.startService(serviceIntent);
    }
}

服务:

public class MyService extends Service {
    void releaseTheLock(){
        if (MyReceiver.wakeLock != null){
            MyReceiver.wakeLock.release();
            MyReceiver.wakeLock=null;
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub      
        return null;
    }
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub      
        super.onCreate();       
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        final Context serviceContext=this;      
        new Thread(new Runnable() {         
            @Override
            public void run() {
                // TODO Auto-generated method stub      
                    /*
                       Do something
                    */
                    //Now set the timer
                    long currntTime = System.currentTimeMillis();
                    AlarmManager mgr=(AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
                    Intent i= new Intent(serviceContext, MyReceiver.class);
                    PendingIntent pi=PendingIntent.getBroadcast(serviceContext, 0, i, 0);                       
                    mgr.set(AlarmManager.RTC_WAKEUP, currntTime + 60000 , pi);                      
                    stopSelf();
                    releaseTheLock();
                    return;                 

            }
        }).start();
    return START_STICKY;
    }   
}

以下是清单中的接收者注册:

<receiver android:name=".TimeReceiver"></receiver>

2 个答案:

答案 0 :(得分:2)

我怀疑您遇到了Service对象(Context)正在被清理和销毁的竞争状态,但是被用作Context PendingIntent。以下是几个选项:

  1. 更改PendingIntent的创建以使用应用程序上下文。此上下文是您PendingIntent发送的上下文。因此,如果您使用瞬态上下文,例如Service对象本身,它可能不再有效。

  2. 将其修改为根本不使用BroadcastReceiver。您可以通过PendingIntent方法为Service创建PendingIntent.getService()。同样,请在此处使用您的应用程序上下文,而不是Service对象本身。

答案 1 :(得分:1)

您是否尝试过使用setRepeating?

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
        1000 * 60, alarmIntent);