0

Intent.ACTION_TIME_TICK によって更新されるウィジェットを作成しています。

だから私はレシーバー(私のAppWidgetProvider)を登録しました:

private IntentFilter intentFilter = new IntentFilter(Intent.ACTION_TIME_TICK);

@Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        context.getApplicationContext().registerReceiver(this, intentFilter);   
    }

すべて正常に動作します。しかし、レシーバーの登録を解除しようとすると、アプリがクラッシュします。

@Override
public void onDisabled(Context context) {   
    context.getApplicationContext().unregisterReceiver(this);  
    super.onDisabled(context);
}

投げる

java.lang.IllegalArgumentException: Receiver not registered:
com.holoware.holoclock.HoloClockWidgetProvider@41a3a3e8

ログ:

D/AndroidRuntime( 3937): Shutting down VM
W/dalvikvm( 3937): threadid=1: thread exiting with uncaught exception (group=0x4
19e8300)
E/AndroidRuntime( 3937): FATAL EXCEPTION: main
E/AndroidRuntime( 3937): java.lang.RuntimeException: Unable to start receiver co
m.holoware.holoclock.HoloClockWidgetProvider: java.lang.IllegalArgumentException
: Receiver not registered: com.holoware.holoclock.HoloClockWidgetProvider@41d616
20
E/AndroidRuntime( 3937):        at android.app.ActivityThread.handleReceiver(Act
ivityThread.java:2362)
E/AndroidRuntime( 3937):        at android.app.ActivityThread.access$1500(Activi
tyThread.java:142)
E/AndroidRuntime( 3937):        at android.app.ActivityThread$H.handleMessage(Ac
tivityThread.java:1284)
E/AndroidRuntime( 3937):        at android.os.Handler.dispatchMessage(Handler.ja
va:99)
E/AndroidRuntime( 3937):        at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 3937):        at android.app.ActivityThread.main(ActivityThrea
d.java:4931)
E/AndroidRuntime( 3937):        at java.lang.reflect.Method.invokeNative(Native
Method)
E/AndroidRuntime( 3937):        at java.lang.reflect.Method.invoke(Method.java:5
11)
E/AndroidRuntime( 3937):        at com.android.internal.os.ZygoteInit$MethodAndA
rgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 3937):        at com.android.internal.os.ZygoteInit.main(Zygot
eInit.java:558)
E/AndroidRuntime( 3937):        at dalvik.system.NativeStart.main(Native Method)

E/AndroidRuntime( 3937): Caused by: java.lang.IllegalArgumentException: Receiver
 not registered: com.holoware.holoclock.HoloClockWidgetProvider@41d61620
E/AndroidRuntime( 3937):        at android.app.LoadedApk.forgetReceiverDispatche
r(LoadedApk.java:654)
E/AndroidRuntime( 3937):        at android.app.ContextImpl.unregisterReceiver(Co
ntextImpl.java:1166)
E/AndroidRuntime( 3937):        at android.content.ContextWrapper.unregisterRece
iver(ContextWrapper.java:378)
E/AndroidRuntime( 3937):        at com.holoware.holoclock.HoloClockWidgetProvide
r.onDisabled(HoloClockWidgetProvider.java:53)
E/AndroidRuntime( 3937):        at android.appwidget.AppWidgetProvider.onReceive
(AppWidgetProvider.java:91)
E/AndroidRuntime( 3937):        at com.holoware.holoclock.HoloClockWidgetProvide
r.onReceive(HoloClockWidgetProvider.java:63)
E/AndroidRuntime( 3937):        at android.app.ActivityThread.handleReceiver(Act
ivityThread.java:2355)
E/AndroidRuntime( 3937):        ... 10 more
4

2 に答える 2

0

が2回呼び出されていないことを確認し、onDisabled()他の方法で受信者の登録を解除していないかどうかも確認してください...

次のコードのように、登録解除コードをtrycatchに入れてみてください。

@Override
    public void onDisabled(Context context) {       
        try{
                context.getApplicationContext().unregisterReceiver(this);
         } catch(Exception e){}
        super.onDisabled(context);
    }
于 2012-10-31T18:43:36.583 に答える
0

問題は、onEnabled()最初のウィジェットが追加されたときにのみ呼び出されることです。ウィジェットが既に追加されていて、アプリケーションを起動した場合、onEnabled()は呼び出されません。そのため、受信者が登録されておらず、登録を解除すると例外が発生します。この方法で作成することをお勧めしますIntent

    Intent intent = new Intent(context, YourAppWidgetProvider.class);
    intent.setAction(action);
于 2012-11-02T14:33:34.403 に答える