简体   繁体   English

在Android中取消注册BroadcastReceiver

[英]Unregister BroadcastReceiver in android

i am working on service, what actually i want is to call some event every minute, suppose i want to print log at every minute, what code i did its working fine but only when the activity is on foreground, when i am minimizing the app or closing it, it gives error as below : 我正在使用服务,实际上我想要的是每分钟调用一次事件,假设我想每分钟打印一次日志,什么代码我可以正常工作,但是只有当活动处于前台时,当我最小化应用程序时或关闭它,它会给出如下错误:

08-19 17:31:33.936: E/AndroidRuntime(14264): FATAL EXCEPTION: main
08-19 17:31:33.936: E/AndroidRuntime(14264): java.lang.RuntimeException: Unable to stop activity    {com.example/com.example.MainActivity}: java.lang.IllegalArgumentException: Receiver not registered:   com.example.MainActivity$1@41117730
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3629)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3675)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.ActivityThread.access$900(ActivityThread.java:162)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.os.Looper.loop(Looper.java:158)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.ActivityThread.main(ActivityThread.java:5751)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at java.lang.reflect.Method.invokeNative(Native Method)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at java.lang.reflect.Method.invoke(Method.java:511)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1083)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at dalvik.system.NativeStart.main(Native Method)
08-19 17:31:33.936: E/AndroidRuntime(14264): Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.example.MainActivity$1@41117730
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:719)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1620)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:445)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at com.example.MainActivity.onStop(MainActivity.java:143)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1305)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.Activity.performStop(Activity.java:5338)
08-19 17:31:33.936: E/AndroidRuntime(14264):    at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3626)
08-19 17:31:33.936: E/AndroidRuntime(14264):    ... 11 more

My code in activity is as below: 我的活动代码如下:

public class MainActivity extends Activity 
{


BroadcastReceiver mBroadcastTime;

@Override
public void onCreate(Bundle savedInstanceState) 
{

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


mBroadcastTime = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent service1 = new Intent(context, MyAlarmService.class);
        context.startService(service1);
    }

};

IntentFilter mTime = new IntentFilter(Intent.ACTION_TIME_TICK);
registerReceiver(mBroadcastTime, mTime);


}

@Override
public void onPause()
{
  super.onPause();
  if(mBroadcastTime != null){
      unregisterReceiver(mBroadcastTime);
      Log.v("BROADCAST ON PAUSE", "UNREGISTERED");
  }
}

@Override
public void onStop()
{
  super.onStop();
  if(mBroadcastTime != null){
      unregisterReceiver(mBroadcastTime);
      Log.v("BROADCAST ON STOP", "UNREGISTERED");
  }
}

@Override
public void onDestroy()
{
  super.onDestroy();
  if(mBroadcastTime != null){
      unregisterReceiver(mBroadcastTime);
      Log.v("BROADCAST ON DESTROY", "UNREGISTERED");
  }
}

} }

The problem is that you are trying to unregister more than once broadcast receiver. 问题是您要尝试注销一次以上的广播接收器。 You should check two things: Is object null or not Is registered or not 您应该检查两件事:对象是否为null是否已注册

Please follow to this question or siply remove unregister method from onStop() and onDestroy() 请关注此问题或从onStop()onDestroy()删除注销方法

Remeber also that if you unregister broadcast at onPause you should register it once again in onResume() 还请记住,如果您在onPause上取消注册广播,则应在onResume()再次进行注册。

So simplest way IMO is to: IMO最简单的方法是:

  • remove unregister from onStrop() and onDestroy() onStrop()onDestroy()取消注销
  • move register broadcast from onCreate() to onResume() 将广播的寄存器从onCreate()移到onResume()

Please take a look into activity lifecycle in Android - that should know every Android Developer ;) - here everything you need 请研究一下Android中的活动生命周期-应该了解每个Android开发人员;)- 这里您需要的一切

You register your receiver in onCreate and u unregister it in onPause. 您可以在onCreate中注册接收者,而在onPause中取消注册。 The problem is that in onCreate is registered only once. 问题在于,在onCreate中仅注册一次。 So if the onPause is called at least once then you wont be able to unregister it twice. 因此,如果onPause至少被调用一次,那么您将无法注销两次。 So best thing to do is register your receiver in onResume 所以最好的办法是在onResume中注册您的接收器

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM