1. 程式人生 > >android中以自定義廣播的形式銷燬棧中的任意的Activity

android中以自定義廣播的形式銷燬棧中的任意的Activity

        在做專案的時候,很多時候我們會因為需求的原因去銷燬不在棧頂中的Activity,實現不同的跳轉邏輯。今天我們就一起來學習一下如何用自定義的廣播來實現銷燬處於棧中但不是棧頂的Activity。首先我先新建一個專案,第一個activity啟動之後裡面有一個按鈕,點選後回跳轉到第二個activity。此時第一個activity會處於棧中,第二個activity會處於棧頂。在第二個activity裡面動態註冊一個自定義的廣播用於控制第二個activity的銷燬。然後第二個activity跳轉到第三個activity。此時第二個activity也會處於棧中,第三個activity會處於棧頂。在第三個activity傳送對應的第二個activity註冊的廣播事件,這時候就能控制第二個activity銷燬。點選手機的返回鍵在正常情況下是第三個activity會被銷燬然後跳轉到第二個activity。但當第三個activity傳送了對應的廣播後因為第二個activity已經被銷燬了,所以點選返回鍵直接會跳轉到第一個activity。下面就是對應的實現程式碼。

BaseActivity.java

public abstract class BaseActivity extends Activity implements View.OnClickListener {
    public Button mButton;
    public Context mContext;
    public TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        mContext = this
; initView();//初始化View baseOnCreate(); } //初始化View private void initView() { mButton = (Button) findViewById(R.id.btn_goto_next); mTextView = (TextView) findViewById(R.id.tv_text); mButton.setOnClickListener(this); } @Override public void
onClick(View v) { switch (v.getId()) { case R.id.btn_goto_next: buttonClickEvent(); break; } } public abstract void baseOnCreate(); public abstract void buttonClickEvent(); }
FirstActivity.java

public class FirstActivity extends BaseActivity {
    @Override
    public void baseOnCreate() {
        mButton.setText("Go to SecondActivity");
        mTextView.setText("Hello I am FirstActivity");
        mButton.setBackgroundColor(getResources().getColor(R.color.red));
        mTextView.setTextColor(getResources().getColor(R.color.red));
    }

    @Override
    public void buttonClickEvent() {
        Intent intent = new Intent(mContext, SecondActivity.class);
        startActivity(intent);
    }
}
SecondActivity.java

public class SecondActivity extends BaseActivity {
    private FinshReceiver mFinsh;

    @Override
    public void baseOnCreate() {
        mFinsh = new FinshReceiver();
        registerReceiver(mFinsh, new IntentFilter("FinishActivity"));//動態註冊一個自定義的廣播,Action為FinishActivity
        mButton.setText("Go to ThirdActivity");
        mTextView.setText("Hello I am SecondActivity");
        mButton.setBackgroundColor(getResources().getColor(R.color.green));
        mTextView.setTextColor(getResources().getColor(R.color.green));

    }

    @Override
    public void buttonClickEvent() {
        Intent intent = new Intent(mContext, ThirdActivity.class);
        startActivity(intent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mFinsh);//登出動態註冊的廣播
    }

    //廣播接收事件
    private class FinshReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            finish();
        }
    }
}
ThirdActivity.java

public class ThirdActivity extends BaseActivity {

    @Override
    public void baseOnCreate() {
        mButton.setText("Finish SecondActivity");
        mTextView.setText("Hello I am ThirdActivity");
        mButton.setBackgroundColor(getResources().getColor(R.color.blue));
        mTextView.setTextColor(getResources().getColor(R.color.blue));
    }

    @Override
    public void buttonClickEvent() {
        Intent intent = new Intent("FinishActivity");
        sendBroadcast(intent);//傳送對應的廣播
    }
}