Android中廣播接收者的註冊與釋放
阿新 • • 發佈:2019-02-02
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);//釋放廣播接收者
依此類推,在其他元件中註冊廣播接收者,也需要在元件銷燬前釋放廣播接收者。