我有一项服务,应该每隔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>
答案 0 :(得分:2)
我怀疑您遇到了Service
对象(Context
)正在被清理和销毁的竞争状态,但是被用作Context
PendingIntent
。以下是几个选项:
更改PendingIntent
的创建以使用应用程序上下文。此上下文是您PendingIntent
发送的上下文。因此,如果您使用瞬态上下文,例如Service
对象本身,它可能不再有效。
将其修改为根本不使用BroadcastReceiver
。您可以通过PendingIntent
方法为Service
创建PendingIntent.getService()
。同样,请在此处使用您的应用程序上下文,而不是Service
对象本身。
答案 1 :(得分:1)
您是否尝试过使用setRepeating?
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
1000 * 60, alarmIntent);