Android AlarmManager在几天后停止工作
我有一个服务,例如每1分钟运行一次。我使用广播接收器和AlarmManager来实现这一点。我还调用PowerManger.aquire()以确保cpu在服务启动前不会休眠。在最初的2到3天内,应用程序运行正常,但之后服务就无法启动。听起来alarmManager没有启动它。知道为什么吗Android AlarmManager在几天后停止工作,android,Android,我有一个服务,例如每1分钟运行一次。我使用广播接收器和AlarmManager来实现这一点。我还调用PowerManger.aquire()以确保cpu在服务启动前不会休眠。在最初的2到3天内,应用程序运行正常,但之后服务就无法启动。听起来alarmManager没有启动它。知道为什么吗 public class MyReceiver extends BroadcastReceiver { PowerManager pawerManager; public static Powe
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>
您是否尝试过设置重复
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
1000 * 60, alarmIntent);
我怀疑您遇到了一种竞争条件,即
服务
对象(上下文
)正在被清理和销毁,但却被用作您的挂起内容的上下文
。以下是几个选项:
更改pendingent
的创建以使用应用程序上下文。此上下文是发送pendingent
的上下文。因此,如果使用瞬态上下文,如服务
对象本身,它可能不再有效
修改此项,使其完全不使用广播接收器
。您可以通过pendingent.getService()
方法为服务创建pendingent
。同样,在这里使用应用程序上下文,而不是服务
对象本身
张贴你的舱单。您的BroadcastReceiver
是如何在系统中启动/注册的?请重新阅读问题。我更新了帖子。你的收信人到底在注册什么?这就是我在这里要说的——如果你的接收器是由服务本身注册的,它就不一定会留下来。系统的低内存杀手可以随时决定终止您的进程(托管服务和BR)。因此,除非您的BR是通过清单注册的(对于时间点,您不能这样做!),否则您不能保证您的进程保持不变。@larryschief您可以看到我的接收者是静态注册在清单文件中的。看文章的结尾。实际上,它并没有注册接收任何东西。没有意图过滤器,只有一个接收方声明。如果它是明显的或清楚的,我不会要求它。不,我没有。但是在RTC_唤醒中使用set()函数有什么问题?我想找出问题所在。奇怪的是,这个程序可以工作2到3天。就像set(int,long,pendingent)一样,除了你可以提供一个报警自动重复的周期。此警报将继续重复,直到使用“取消”(PendingEvent)明确删除。from:,long,long,android.app.pendingent)谢谢,但如果我想检查你的解决方案是否有效,我应该再等3天。但我想知道为什么我的代码几天后就停止工作了。如果我发现并理解了这个问题,我可以避免我的其他应用程序发生此类事件。我不想只找到一个解决方案来解决这个问题。@user2808671您找到解决方案了吗?由于我的应用程序警报在使用3天后停止工作,并且在3天内不使用应用程序。我使用广播接收器的原因是,如果我直接将服务而不是广播接收器传递到挂起的意图,那么如果设备处于睡眠模式,服务将无法成功完成其操作。请参考这些链接:但是关于上下文,我将使用getApplicationContext()而不是serviceContext来查看发生了什么。公平地说,我已经忘记了带服务的wakelock行为。祝你好运我的代码中还有其他问题,我成功地修复了它们,程序现在正在运行。无论如何,为了结束这个问题,我接受这个答案。谢谢buddy@user2808671您能说说您解决了哪些问题吗?@user2808671跟进,您发现了什么?