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);//释放广播接收者
依此类推,在其他组件中注册广播接收者,也需要在组件销毁前释放广播接收者。