首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AlarmManager LifeCycle与对消错误

AlarmManager LifeCycle与对消错误
EN

Stack Overflow用户
提问于 2012-03-04 21:55:24
回答 1查看 814关注 0票数 1

我有一个已经有widget的应用程序,并且有一个service,它每5秒更新一次这个小部件。

这是我的AppWidgetProvider

代码语言:javascript
复制
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();
    }
}

还有我的Service

代码语言:javascript
复制
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;
    }

}

Service和其他东西都很好。但我还有几个关于这些东西的问题:

  1. SystemClock.elapsedRealtime()setRepeating方法中的一个参数,它是什么?是指什么时候开始吗?
  2. 当我尝试删除小部件时,我得到了一些错误(在下面),不幸的是,AlarmManager仍然不能工作,不能取消。我遗漏了什么?
  3. 在初始化(或调用)小部件之前,我需要做一些网络操作。小部件应该有一些来自服务器的数据。我应该使用AsyncTask还是什么?

当我尝试删除小部件时,得到:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-04 22:18:45

  1. 正如您所拥有的一样,SystemClock.elapsedRealTime()当前在triggerAtTime参数中,这意味着您放置的任何数字都是您希望警报发出的时间。自系统启动以来,elapsedRealtime()以毫秒为单位计算,包括深度睡眠。在测量可能跨越系统睡眠周期的时间间隔时,应使用此时钟。
  2. 在您的onDisabled方法中,需要重新创建整个PendingIntent。我猜它是空的,因为当您调用onDisabled时它实际上并不存在,而只存在于onUpdate中。因此,重新创建service变量PendingIntent的方式与以前完全相同,然后调用cancel,就像您已经做的那样。
  3. AsyncTask对这样的事情很有好处。AsyncTask在后台生成托管线程并在UI线程继续运行时工作,然后在完成时可以更新UI线程。因此,如果你有很多沉重的网络要做,一个AsyncTask会处理得很好。AsyncTask上的文档非常有用。找到他们这里。这方面有很多选择,取决于你在做什么,所以你必须用更多的细节来解释你的第三点问题,才能得到一个更有针对性的答案。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9559194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档