【问题标题】:Unregister BroadcastReceiver in android在android中注销BroadcastReceiver
【发布时间】:2014-08-19 12:15:27
【问题描述】:

我正在从事服务工作,实际上我想要的是每分钟调用一次事件,假设我想每分钟打印一次日志,我的哪些代码工作正常但只有当活动在前台时,当我在最小化应用程序或关闭它,它会给出如下错误:

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

我的活动代码如下:

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");
  }
}

}

【问题讨论】:

  • 好吧,但为什么你有 3 次相同的代码?
  • 我每 3 种方法检查一次。如果我错了,请纠正我
  • 根据 Activity LifeCycle onPause 然后 onStop 然后 onDestory 你只需要做一次。
  • 好的,我做到了,现在它没有给出任何错误,但我想要的是如果我关闭我的应用程序应该运行该服务,它应该每分钟触发一些事件(无论我想要什么)。为此我该怎么办?

标签: android broadcastreceiver


【解决方案1】:

问题是您试图多次注销广播接收器。你应该检查两件事: 对象是否为空 是否注册

请关注this question 或从onStop()onDestroy() 中删除注销方法

还请记住,如果您在 onPause 取消注册广播,您应该在 onResume() 重新注册一次

IMO 最简单的方法是:

  • onStrop()onDestroy() 中删除注销
  • 将注册广播从onCreate()移动到onResume()

请查看 Android 中的活动生命周期 - 每个 Android 开发人员都应该知道 ;) - here 你需要的一切

【讨论】:

  • 好的,我做到了,现在它没有给出任何错误,但我想要的是如果我关闭我的应用程序应该运行该服务,它应该每分钟触发一些事件(无论我想要什么)。为此我该怎么办?
  • 如果您调用 startService,您将启动和绑定两个版本的服务 - 因为您应该在后台运行,但您没有注册的广播接收器。此外,没有 100% 保证该服务不会被 android 杀死。为了增加服务不会被终止的机会,请创建带有通知的服务。
  • 好的,如果您认为这个问题对其他人有用,请投票。感谢您的帮助。
【解决方案2】:

您在 onCreate 中注册您的接收器,然后在 onPause 中取消注册。问题是 onCreate 只注册了一次。因此,如果至少调用一次 onPause,那么您将无法取消注册它两次。所以最好的办法是在 onResume 中注册你的接收者

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多