1

ブロードキャストを取得し、インテントの一意の ID を返すサービスがあります。

PendingIntent pi;

public int Setup()
    {
        static AtomicInteger nextId = new AtomicInteger();
        int Id =  nextId.incrementAndGet();

        Intent i = new Intent("INTENT_" + String.valueOf(Id));
        pi = PendingIntent.getBroadcast(this, Id, i, PendingIntent.FLAG_UPDATE_CURRENT);
            //rest of code goes here
        return alarm.Id;
    }

メイン アクティビティのクリック イベントからそのメソッドを呼び出し、そこでブロードキャストも登録します。(サービスはバインドされ、すべて)。すべて正常に動作します:

private Service service;
       BroadcastReceiver br;

       private void onClickSet(View v)
       {
           final int id = service.Setup();

            br = new BroadcastReceiver() {
                @Override
                public void onReceive(Context c, Intent i) {
                    Toast.makeText(c, "text goes here", Toast.LENGTH_SHORT).show();
                    if (br != null)
                    {
                        Toast.makeText(c, "Unregistering previous receiver...", Toast.LENGTH_SHORT).show();
                        c.unregisterReceiver(br);
                    }
                }
            };

            registerReceiver(br, new IntentFilter("INTENT_" + String.valueOf(id)));
       }

私が言うように、すべてが正常に機能しています。クリックを10回繰り返しても、問題はボタンをクリックするのが速すぎると、「ボタンを複数回すばやくクリックするとブロードキャストを受信中にエラーが発生する」ということです。スタック トレースは次のとおりです。

09-24 09:46:25.756: D/AndroidRuntime(1382): Shutting down VM
09-24 09:46:25.756: W/dalvikvm(1382): threadid=1: thread exiting with uncaught exception (group=0x414c4700)
09-24 09:46:25.854: E/AndroidRuntime(1382): FATAL EXCEPTION: main
09-24 09:46:25.854: E/AndroidRuntime(1382): java.lang.RuntimeException: Error receiving broadcast Intent { act=INTENT_2 flg=0x14 (has extras) } in com.example.project.Activity1$3@41753618
09-24 09:46:25.854: E/AndroidRuntime(1382):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:773)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at android.os.Handler.handleCallback(Handler.java:730)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at android.os.Looper.loop(Looper.java:137)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at android.app.ActivityThread.main(ActivityThread.java:5103)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at java.lang.reflect.Method.invokeNative(Native Method)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at java.lang.reflect.Method.invoke(Method.java:525)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at dalvik.system.NativeStart.main(Native Method)
09-24 09:46:25.854: E/AndroidRuntime(1382): Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.example.project.Activity1$3@41788d60
09-24 09:46:25.854: E/AndroidRuntime(1382):     at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:662)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1372)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:468)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at com.example.project.Activity1$3.onReceive(Activity1.java:131)
09-24 09:46:25.854: E/AndroidRuntime(1382):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:763)
09-24 09:46:25.854: E/AndroidRuntime(1382):     ... 9 more
09-24 09:51:25.964: I/Process(1382): Sending signal. PID: 1382 SIG: 9
4

0 に答える 0