转发地址:http://www.aichengxu.com/view/1600364
Android中广播接收者的注册与释放
2015-04-06 16:44
浏览(331)
在Activity中注册广播接收者,接收来自Service的广播:
[code]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中并接收来自其他组件的广播:
[code] // 注册自定义的登陆结果广播接收者 loginRec = new LoginReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("com.whu.mobileoa.login_result"); registerReceiver(loginRec, filter);
在Service组件中定义并发送广播:
[code]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()时),需要释放之前注册的广播接收者:
[code]unregisterReceiver(this);//释放广播接收者