Android AlarmManager生命周期和取消错误
我有一个应用程序,它已经有一个Android AlarmManager生命周期和取消错误,android,alarmmanager,Android,Alarmmanager,我有一个应用程序,它已经有一个小部件,还有一个服务,每5秒钟更新一次小部件 这是我的AppWidgetProvider: public class MyWidget extends AppWidgetProvider { PendingIntent service = null; AlarmManager alarmManager; @Override public void onUpdate(Context context, AppWidgetManager
小部件
,还有一个服务
,每5秒钟更新一次小部件
这是我的AppWidgetProvider
:
public class MyWidget extends AppWidgetProvider {
PendingIntent service = null;
AlarmManager alarmManager;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
final Intent i = new Intent(context, MyService.class);
if(service == null) {
service = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
}
alarmManager.setRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime(), 1000*5, service);
}
@Override
public void onDisabled(Context context) {
Log.d("LogTag", "onDisabled");
alarmManager.cancel(service);
service.cancel();
}
}
和我的服务
:
public class MyService extends Service {
int b = 5;
@Override
public void onCreate() { super.onCreate(); }
public int onStartCommand(Intent intent, int flags, int startId) {
this.buildUpdate();
return 0;
}
private void buildUpdate() {
Log.d("AAA", "Update is coming");
RemoteViews rmViews = new RemoteViews(getPackageName(), R.layout.widget_layout);
rmViews.setTextViewText(R.id.hello, "Iterator: " + Integer.toString(b));
ComponentName thisWidget = new ComponentName(this, MyWidget.class);
AppWidgetManager manager = AppWidgetManager.getInstance(this);
manager.updateAppWidget(thisWidget, rmViews);
b++;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
服务
和其他事情都很好。但我仍然有一些关于这些东西的问题:
SystemClock.elapsedRealtime()
方法中的参数是什么?它指出什么时候开始吗AlarmManager
仍然无法取消。我错过了什么AsyncTask
还是什么03-04 23:39:51.428: E/AndroidRuntime(5646): Uncaught handler: thread main exiting due to uncaught exception
03-04 23:39:51.438: E/AndroidRuntime(5646): java.lang.RuntimeException: Unable to start receiver com.example.widget.MyWidget: java.lang.NullPointerException
03-04 23:39:51.438: E/AndroidRuntime(5646): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2646)
03-04 23:39:51.438: E/AndroidRuntime(5646): at android.app.ActivityThread.access$3100(ActivityThread.java:119)
03-04 23:39:51.438: E/AndroidRuntime(5646): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1913)
03-04 23:39:51.438: E/AndroidRuntime(5646): at android.os.Handler.dispatchMessage(Handler.java:99)
03-04 23:39:51.438: E/AndroidRuntime(5646): at android.os.Looper.loop(Looper.java:123)
03-04 23:39:51.438: E/AndroidRuntime(5646): at android.app.ActivityThread.main(ActivityThread.java:4363)
03-04 23:39:51.438: E/AndroidRuntime(5646): at java.lang.reflect.Method.invokeNative(Native Method)
03-04 23:39:51.438: E/AndroidRuntime(5646): at java.lang.reflect.Method.invoke(Method.java:521)
03-04 23:39:51.438: E/AndroidRuntime(5646): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
03-04 23:39:51.438: E/AndroidRuntime(5646): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
03-04 23:39:51.438: E/AndroidRuntime(5646): at dalvik.system.NativeStart.main(Native Method)
03-04 23:39:51.438: E/AndroidRuntime(5646): Caused by: java.lang.NullPointerException
03-04 23:39:51.438: E/AndroidRuntime(5646): at com.example.widget.MyWidget(MyWidget.java:33)
03-04 23:39:51.438: E/AndroidRuntime(5646): at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:76)
03-04 23:39:51.438: E/AndroidRuntime(5646): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2637)
03-04 23:39:51.438: E/AndroidRuntime(5646): ... 10 more
SystemClock.elapsedRealTime()
当前位于triggerAtTime
参数中,这意味着您在那里输入的任何数字都是您希望闹钟响起的时间elapsedRealtime()
自系统启动以来以毫秒计,包括深度睡眠。当测量可能跨越系统睡眠周期的时间间隔时,应使用该时钟onDisabled
方法中,需要重新创建整个pendingent
。我猜它在那里是空的,因为当您调用onDisabled
时它实际上并不存在,而只存在于onUpdate
中。因此,以与之前完全相同的方式重新创建服务
变量pendingent
,然后按原样调用cancelAsyncTask
s适用于类似的事情。AsyncTask
在后台生成一个托管线程,并在UI线程继续运行时工作,然后可以在完成时更新UI线程。因此,如果你有很多繁重的网络工作要做,一个AsyncTask
可以很好地处理这些工作。AsyncTask
上的文档非常有用。找到他们。这取决于你在做什么,有很多选择,因此你必须在第三点上更详细地解释你的问题,以获得更为量身定制的答案非常感谢。还没有尝试异步任务,但得到了一些线索。