Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 接收器未注册异常错误?_Android_Broadcastreceiver_Illegalargumentexception - Fatal编程技术网

Android 接收器未注册异常错误?

Android 接收器未注册异常错误?,android,broadcastreceiver,illegalargumentexception,Android,Broadcastreceiver,Illegalargumentexception,在我的开发者控制台中,人们不断报告一个错误,我无法在任何手机上重现。一个人留言说,当他们试图打开我的电池服务设置屏幕时,他收到了。从错误中可以看出,它表示接收器未注册 java.lang.RuntimeException: Unable to stop service .BatteryService@4616d688: java.lang.IllegalArgumentException: Receiver not registered: com.app.notifyme.BatterySer

在我的开发者控制台中,人们不断报告一个错误,我无法在任何手机上重现。一个人留言说,当他们试图打开我的电池服务设置屏幕时,他收到了。从错误中可以看出,它表示接收器未注册

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);
    }       
}
专用最终类BatteryNotifyReceiver扩展了BroadcastReceiver{
布尔连通;
@凌驾
公共void onReceive(上下文、意图){
SharedReferences prefs=PreferenceManager.GetDefaultSharedReferences(上下文);
SharedReferences.Editor edit=prefs.edit();
更新引用(prefs);
level=intent.getIntExtra(BatteryManager.EXTRA_level,-1);
if(intent.getAction().equals(intent.ACTION\u POWER\u CONNECTED)){
连接=真;
}else if(intent.getAction().equals(intent.ACTION\u POWER\u DISCONNECTED)){
连接=错误;
}else if(intent.getAction().equals(intent.ACTION\u电池更换)){
如果(级别<最后级别){
如果(级别>40){
edit.putBoolean(“first”,false).commit();
edit.putBoolean(“second”,false).commit();
edit.putBoolean(“第三个”,false).commit();
edit.putBoolean(“第四个”,false).commit();
edit.putBoolean(“第五”,false).commit();
}
如果(级别==40){
如果(!第一个){
通知(上下文、battColor、battBlink、battVib、battSound);
edit.putBoolean(“first”,true).commit();
}
}否则,如果(级别==30){
如果(!秒){
通知(上下文、battColor、battBlink、battVib、battSound);
edit.putBoolean(“second”,true).commit();
}
}否则,如果(级别==20){
如果(!第三){
通知(上下文、battColor、battBlink、battVib、battSound);
edit.putBoolean(“第三个”,true).commit();
}
}否则,如果(级别==15){
如果(!第四){
通知(上下文、battColor、battBlink、battVib、battSound);
edit.putBoolean(“第四个”,true).commit();
}
}否则,如果(级别==5){
如果(!第五){
通知(上下文、battColor、battBlink、battVib、battSound);
edit.putBoolean(“第五个”,true).commit();
}
}
最后一级=温度;
}
}           
意图i=新意图(上下文,BatteryNotifyReceiver.class);
启动服务(一);
}       
}

知道他们为什么会出现这种错误吗?

问题的根源在于:

 unregisterReceiver(batteryNotifyReceiver);
如果接收者已经取消注册(可能是在本文未包含的代码中)或未注册,则调用
unregisterReceiver
throws
IllegalArgumentException
。在您的情况下,您只需为该异常设置特殊的try/catch并忽略它(假设您不能或不想控制在同一个接收器上调用
unregisterReceiver
的次数)。

编辑:这是inazaruk和electrichead的答案。。。我遇到了一个与他们类似的问题,并发现如下。。。 此问题存在一个长期存在的bug:

看起来它是从Android2.1开始的,从那时起,它就出现在所有Android2.x版本中。不过,我不确定安卓3.x或4.x是否仍然存在问题

无论如何,这篇StackOverflow文章解释了如何正确地解决这个问题(从URL上看,它看起来不相关,但我保证它是相关的)


如其他答案中所述,引发异常是因为对
registerReceiver
的每次调用都没有与对
unregisterReceiver
的一次调用匹配。为什么不呢

活动
并不总是对每个
onCreate
调用都有一个匹配的
onestory
调用。如果系统内存不足,您的应用程序将在不调用onDestroy的情况下退出

放置
registerReceiver
调用的正确位置是
onResume
调用中,以及
onPause
调用中的
unregisterReceiver
。这对呼叫总是匹配的。有关更多详细信息,请参见活动生命周期图。

您的代码将更改为:

SharedPreferences mPref
IntentFilter mFilter;

@Override
public void onCreate(){
    super.onCreate();
    mPref = PreferenceManager.getDefaultSharedPreferences(this);
    mFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    filter.addAction(Intent.ACTION_POWER_CONNECTED);
    filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
 }

@Override
public void onResume() {
    registerReceiver(batteryNotifyReceiver,mFilter);
    mPref.registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause(){
     unregisterReceiver(batteryNotifyReceiver, mFilter);
     mPref.unregisterOnSharedPreferenceChangeListener(this);
}

将receiver声明为null,然后将register和unregister方法分别放在活动的onResume()和onPause()中

@Override
protected void onResume() {
    super.onResume();
    if (receiver == null) {
        filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        receiver = new ResponseReceiver();
        registerReceiver(receiver, filter);
    }
}      

@Override
protected void onPause() {
    super.onPause();
    if (receiver != null) {
        unregisterReceiver(receiver);
        receiver = null;
    }
}

对于未注册的接收者,请在任何地方使用此代码:

if(电池通知接收器!=null){
未注册接收器(电池通知接收器);
batteryNotifyReceiver=null;
}

我使用了一个try-catch块来临时解决这个问题

// Unregister Observer - Stop monitoring the underlying data source.
        if (mDataSetChangeObserver != null) {
            // Sometimes the Fragment onDestroy() unregisters the observer before calling below code
            // See <a>http://stackoverflow.com/questions/6165070/receiver-not-registered-exception-error</a>
            try  {
                getContext().unregisterReceiver(mDataSetChangeObserver);
                mDataSetChangeObserver = null;
            }
            catch (IllegalArgumentException e) {
                // Check wether we are in debug mode
                if (BuildConfig.IS_DEBUG_MODE) {
                    e.printStackTrace();
                }
            }
        }
//注销观察者-停止监视基础数据源。
if(mDataSetChangeObserver!=null){
//有时,片段onDestroy()会在调用下面的代码之前注销观察者
//看http://stackoverflow.com/questions/6165070/receiver-not-registered-exception-error
试一试{
getContext().unregisterReceiver(mDataSetChangeObserver);
mDataSetChangeObserver=null;
}
捕获(IllegalArgumentException e){
//检查我们是否处于调试模式
if(BuildConfig.IS_DEBUG_模式){
e、 printStackTrace();
}
LocalBroadcastManager.getInstance(this).registerReceiver()
 unregisterReceiver()
LocalBroadcastManager.getInstance(this).unregisterReceiver()
private LocalBroadcastManager lbman;
lbman.registerReceiver(bReceiver);
lbman.unregisterReceiver(bReceiver);
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        // your code

    }
};
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(broadcastReceiver);
unregisterReceiver(broadcastReceiver);
getActivity().unregisterReceiver(broadcastReceiver);
    try {
        unregisterReceiver(receiver);
    } catch (IllegalArgumentException e) {
        System.out.printf(e.getMessage());
    }