我有一个服务应该每1分钟运行一次。我使用了一个广播接收器和警报管理器来完成这项工作。我还调用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>

最佳答案

我怀疑你正处于一种竞争状态,在这种情况下,Service对象(Context)正在被清理和销毁,但却被用作ContextPendingIntent。有两种选择:
更改PendingIntent的创建以使用应用程序上下文。此上下文是发送PendingIntent的上下文。因此,如果使用瞬时上下文,比如Service对象本身,它可能不再有效。
修改此项以完全不使用BroadcastReceiver。您可以通过PendingIntent方法为您的Service创建PendingIntent.getService()。同样,在这里使用应用程序上下文,而不是Service对象本身。

关于android - 几天后AlarmManager停止工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25330826/

10-12 03:57