Di konsol pengembang saya, orang-orang terus melaporkan kesalahan yang tidak dapat saya buat ulang di ponsel mana pun yang saya miliki. Satu orang meninggalkan pesan yang mengatakan dia mengerti ketika mereka mencoba membuka layar pengaturan layanan baterai saya. Seperti yang Anda lihat dari kesalahan, dikatakan bahwa penerima tidak terdaftar.
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)
Saya mendaftar di onCreate saya
@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);
}
Batalkan pendaftaran di onDestroy dan juga dengan pendengar preferensi
@Override
public void onDestroy(){
super.onDestroy();
unregisterReceiver(batteryNotifyReceiver);
}
dan ini adalah penerima saya dalam layanan ini
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);
}
}
tahu mengapa mereka mendapatkan kesalahan itu?
LocalBroadcastManager.getInstance(context).unregisterReceiver()
ataucontext.unregisterReceiver()
Hati-hati, saat Anda mendaftar pada
Anda tidak dapat membatalkan pendaftaran pada
Anda harus menggunakan
atau aplikasi akan macet, log sebagai berikut:
sumber
Gunakan kode ini di mana saja untuk unregisterReceiver:
sumber
Seperti yang disebutkan dalam jawaban lain, pengecualian diberikan karena setiap panggilan ke
registerReceiver
tidak dicocokkan dengan satu panggilan ke persisunregisterReceiver
. Kenapa tidak?Sebuah
Activity
tidak selalu memiliki pencocokanonDestroy
panggilan untuk setiaponCreate
panggilan. Jika sistem kehabisan memori, aplikasi Anda akan dikeluarkan tanpa panggilanonDestroy
.Tempat yang benar untuk melakukan
registerReceiver
panggilan adalah di dalamonResume
danunregisterReceiver
di dalamonPause
. Pasangan panggilan ini selalu cocok. Lihat diagram siklus hidup Aktivitas untuk lebih jelasnya. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycleKode Anda akan berubah menjadi:
sumber
EDIT: Ini adalah jawaban untuk inazaruk dan electrichead ... Saya telah mengalami masalah serupa dengan mereka dan menemukan yang berikut ...
Ada bug lama untuk masalah ini di sini: http://code.google.com/p/android/issues/detail?id=6191
Sepertinya ini dimulai sekitar Android 2.1 dan telah hadir di semua rilis Android 2.x. Saya tidak yakin apakah itu masih menjadi masalah di Android 3.x atau 4.x.
Bagaimanapun, posting StackOverflow ini menjelaskan cara mengatasi masalah dengan benar (ini tidak terlihat relevan dengan URL tetapi saya berjanji itu)
Mengapa keyboard-slide merusak aplikasi saya?
sumber
Saya menggunakan blok coba-tangkap untuk menyelesaikan masalah sementara.
sumber
Deklarasikan penerima sebagai null lalu Masukkan metode register dan unregister di onResume () dan onPause () aktivitas masing-masing.
sumber
Ketika komponen UI yang mendaftarkan BR dimusnahkan, BR juga. Oleh karena itu, saat kode tersebut dibatalkan pendaftarannya, BR mungkin telah dihancurkan.
sumber
Bagi siapa saja yang akan menemukan masalah ini dan mereka mencoba semua yang disarankan dan tidak ada yang masih berfungsi, ini adalah cara saya mengurutkan masalah saya, daripada melakukan
LocalBroadcastManager.getInstance(this).registerReceiver(...)
saya pertama kali membuat variabel lokal tipe LocalBroadcastManager,Dan menggunakan variabel ini untuk melakukan registering dan unregistering pada broadcastreceiver
dan
sumber
Mari kita asumsikan Anda
broadcastReceiver
didefinisikan seperti ini:Jika Anda menggunakan
LocalBroadcast
dalam suatu Aktivitas, berikut cara Anda membatalkan pendaftaran:Jika Anda menggunakan
LocalBroadcast
di Fragment, berikut cara Anda membatalkan pendaftaran:Jika Anda menggunakan siaran normal dalam suatu Aktivitas, berikut cara Anda membatalkan pendaftaran:
Jika Anda menggunakan siaran normal dalam Fragmen, berikut cara Anda membatalkan pendaftaran:
sumber