[解決済み] Receiver not registered exception error?
2022-05-13 04:49:56
質問
私の開発者コンソールで、私が持っているどの電話機でも再現できないエラーが報告され続けています。ある人は、私のバッテリー サービスの設定画面を開こうとするとこのエラーが発生するというメッセージを残しました。エラーからわかるように、受信機が登録されていないと言っています。
java.lang.RuntimeException: Unable to stop service .BatteryService@4616d688: java.lang.IllegalArgumentException: Receiver not registered: com.app.notifyme.BatteryService$BatteryNotifyReceiver@4616d9d0
at android.app.ActivityThread.handleStopService(ActivityThread.java:3164)
at android.app.ActivityThread.access$3900(ActivityThread.java:129)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2173)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Receiver not registered:com..BatteryService$BatteryNotifyReceiver@4616d9d0
at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:805)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:859)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331)
at com.app.notifyme.BatteryService.onDestroy(BatteryService.java:128)
at android.app.ActivityThread.handleStopService(ActivityThread.java:3150)
登録はonCreateで行っています。
@Override
public void onCreate(){
super.onCreate();
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
registerReceiver(batteryNotifyReceiver,filter);
pref.registerOnSharedPreferenceChangeListener(this);
}
onDestroyで登録解除、プリファレンスリスナーでも登録解除
@Override
public void onDestroy(){
super.onDestroy();
unregisterReceiver(batteryNotifyReceiver);
}
そしてこれがサービス内の私のレシーバーです
private final class BatteryNotifyReceiver extends BroadcastReceiver {
boolean connected;
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit = prefs.edit();
updatePreferences(prefs);
level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
if(intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)){
connected = true;
}else if(intent.getAction().equals(Intent.ACTION_POWER_DISCONNECTED)){
connected = false;
}else if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){
if(level < lastLevel){
if(level > 40){
edit.putBoolean("first", false).commit();
edit.putBoolean("second", false).commit();
edit.putBoolean("third", false).commit();
edit.putBoolean("fourth",false).commit();
edit.putBoolean("fifth", false).commit();
}
if(level == 40){
if(!first){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("first", true).commit();
}
}else if(level == 30){
if(!second){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("second", true).commit();
}
}else if(level == 20){
if(!third){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("third", true).commit();
}
}else if(level == 15){
if(!fourth){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("fourth", true).commit();
}
}else if(level == 5){
if(!fifth){
notification(context,battColor,battBlink,battVib,battSound);
edit.putBoolean("fifth", true).commit();
}
}
lastLevel = temp;
}
}
Intent i = new Intent(context,BatteryNotifyReceiver.class);
context.startService(i);
}
}
なぜこのようなエラーが発生するのか、心当たりはありますか?
どのように解決するのですか?
問題の根源はここにあります。
unregisterReceiver(batteryNotifyReceiver);
受信者がすでに未登録であった場合(おそらくこの投稿に含まれていないコードで)、または登録されていなかった場合、呼び出しは
unregisterReceiver
を投げる
IllegalArgumentException
. あなたの場合、この例外のために特別な try/catch を置き、それを無視する必要があります(もし、あなたが
unregisterReceiver
を呼び出す回数を制御できない、あるいは制御したくないと仮定します)。
関連
-
[解決済み】Android 8:クリアテキストのHTTPトラフィックが許可されない
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み] Rが解決できない - Androidエラー
-
[解決済み】AndroidでReceiverが登録されているかどうかを確認する方法は?
-
[解決済み] Android Debug Bridgeでアプリケーションのインストール時にINSTALL_FAILED_VERSION_DOWNGRADEを無視する方法はありますか?
-
[解決済み] アンドロイドアプリのユーザーデータを消去する
-
[解決済み] アンドロイドでビットマップのサイズを変更する最もメモリ効率の良い方法とは?
-
[解決済み] プログラムによるセレクタ画像の置き換え
-
[解決済み] AndroidでNode.Jsを動作させる
-
[解決済み] android:fontFamily="sans-serif-light "と同等の機能をJavaコードで実現するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] エラーです。ステータス{statusCode=DEVELOPER_ERROR, resolution=null}.
-
[解決済み] カスタムレイアウトとEditTextを持つAlertDialog.Builderは、ビューにアクセスすることができません。
-
[解決済み] EclipseでADTを更新するにはどうしたらいいですか?
-
[解決済み] 制約条件 レイアウト 垂直中央揃え
-
[解決済み] DialogFragment の setCancelable プロパティが機能しない
-
[解決済み] 複数のローダーを持つLoaderManager: 正しいカーソルローダーを取得する方法
-
[解決済み] Android Studioのユニットテスト: データ(入力)ファイルの読み込み
-
[解決済み] Android Studio 1.0とエラー "Library projects cannot set applicationId "について
-
[解決済み] PreferenceFragmentCompatはpreferenceThemeが設定されている必要があります。