1. 程式人生 > >Android中廣播接收者的註冊與釋放

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);//釋放廣播接收者

依此類推,在其他元件中註冊廣播接收者,也需要在元件銷燬前釋放廣播接收者。