Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AlarmManager在几天后停止工作_Android - Fatal编程技术网

Android AlarmManager在几天后停止工作

Android AlarmManager在几天后停止工作,android,Android,我有一个服务,例如每1分钟运行一次。我使用广播接收器和AlarmManager来实现这一点。我还调用PowerManger.aquire()以确保cpu在服务启动前不会休眠。在最初的2到3天内,应用程序运行正常,但之后服务就无法启动。听起来alarmManager没有启动它。知道为什么吗 public class MyReceiver extends BroadcastReceiver { PowerManager pawerManager; public static Powe

我有一个服务,例如每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>

您是否尝试过设置重复

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跟进,您发现了什么?