我有一个服务应该每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
)正在被清理和销毁,但却被用作Context
的PendingIntent
。有两种选择:
更改PendingIntent
的创建以使用应用程序上下文。此上下文是发送PendingIntent
的上下文。因此,如果使用瞬时上下文,比如Service
对象本身,它可能不再有效。
修改此项以完全不使用BroadcastReceiver
。您可以通过PendingIntent
方法为您的Service
创建PendingIntent.getService()
。同样,在这里使用应用程序上下文,而不是Service
对象本身。
关于android - 几天后AlarmManager停止工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25330826/