ブロードキャストを取得し、インテントの一意の 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