Android中广播接收者的注册与释放

Android中常常利用广播机制来在各个组件之间传递消息,例如在Activity和Service之间。
在Activity中注册广播接收者,接收来自Service的广播:

public class LoginReceiver extends BroadcastReceiver {
        private boolean loginResult = false;
        @Override
        public void onReceive(Context context, Intent intent) {
            // String cmdAction = intent.getAction();
            unregisterReceiver(this);//释放广播接收者
            loginResult = intent.getBooleanExtra("login_result", false);
            if (loginResult) {
                Intent loginIntent = new Intent(LoginActivity.this,MainActivity.class);
                startActivity(loginIntent);
                Log.d("IntoMainActivity", "进入主Activity");
                LoginActivity.this.finish();
                Log.d("FinishLoginActivity", "结束登陆Activity");
            } else {

            }
        }

    }

其中的onReceive()方法是继承BroadcastReceiver时必须实现的方法,当接收到指定的广播时,调用该方法。
将自定义的广播接收者注册到Activity中并接收来自其他组件的广播:

        // 注册自定义的登陆结果广播接收者
        loginRec = new LoginReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.whu.mobileoa.login_result");
        registerReceiver(loginRec, filter);

在Service组件中定义并发送广播:

Intent loginReltInt = new Intent();
if (loginResult == 0) {                     loginReltInt.putExtra("login_result", false);// 登陆验证失败
} else {                        loginReltInt.putExtra("login_result", true);// 登陆验证成功
}                   loginReltInt.setAction("com.whu.mobileoa.login_result");
sendBroadcast(loginReltInt);

我在这里要进行的操作是,当接收到广播并进行判断后,需要跳转到其他的Activity,并关闭当前的Activity。如果在关闭当前Activity之前没有释放注册到它那里的广播接收者,会报广播接收者泄露的错误:
Activity…… has leaked IntentReceiver…… that was originally registered here. Are you missing a call to unregisterReceiver()?
出现这个错误的原因在当前Activity被销毁前,没有释放注册的广播接收者。
因此在接收并处理完广播消息后(即回调了onReceive()时),需要释放之前注册的广播接收者:

unregisterReceiver(this);//释放广播接收者

依此类推,在其他组件中注册广播接收者,也需要在组件销毁前释放广播接收者。

猜你喜欢

转载自blog.csdn.net/whurs/article/details/44903251