这个问题以前困扰啊,现在解决了。

    在实际开发中,总有时候是希望当进入某个Activity后,点击手机back键(或者其他操作),就能直接把连前面的几个Activity一起结束掉。曾经一种做法就是每启动一个新Activity就finish()掉上一个,但是这种做法有违本来的意愿啊。

    现在采用Android的广播机制来实现,其实现起来很简单。

    步骤大概是:

    1.首先写一个类包含广播的注册、注销、接收后的实现;

    2.在你希望一次性关掉的多个Activity中,启动时调用注册广播的方法,结束时调用注销广播的方法;    

    3.在你想触发关掉多个Activity的那个Activity中捕捉back按钮的事件,并在这个事件中实现发送广播          sendBroadcast();

    主要写了下面一个可重复使用类,提供注册广播、注销广播、内部类实现接到广播后的操作。

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

public class BroadcastControl {

public static String FINISH_ACTIVITY = "finish";

Context context;

Activity activity;

MyBroadcastReceiver receiver;

public BroadcastControl(Context context,Activity activity){

this.context = context;

this.activity = activity;

}

//此方法是注册广播

public void registBroad(String actionType){

receiver = new MyBroadcastReceiver();

//自己定义一个Filter

IntentFilter filter = new IntentFilter(actionType);

context.registerReceiver(receiver, filter);

}

//此方法是注销广播

public void unregistBroad(){

context.unregisterReceiver(receiver);

}

class MyBroadcastReceiver extends BroadcastReceiver{

//此方法为收到广播后的操作

@Override

public void onReceive(Context con, Intent intent) {

String action = intent.getAction();

if(action.equals(FINISH_ACTIVITY)){

activity.finish();

}

}

}

}

这里举例,加入需要一次性关掉的Activity有两个,那么这两个Activity都要注册广播。

第一个:

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class Activity01 extends Activity {

BroadcastControl receiver;

Button b;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        b = (Button)findViewById(R.id.button01);

        b.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Intent i = new Intent(Activity01.this , Activity02.class);

startActivity(i);

}

});

        receiver = new BroadcastControl(this , this);

        receiver.registBroad(BroadcastControl.FINISH_ACTIVITY);

    }

    

@Override

protected void onDestroy() {

super.onDestroy();

receiver.unregistBroad();

}

    

}

第二个:

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class Activity02 extends Activity {

BroadcastControl receiver;

Button b;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity02);

b = (Button) findViewById(R.id.button01);

b.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

Intent i = new Intent(Activity02.this, Activity03.class);

startActivity(i);

}

});

receiver = new BroadcastControl(this , this);

receiver.registBroad(BroadcastControl.FINISH_ACTIVITY);

}

@Override

protected void onDestroy() {

super.onDestroy();

receiver.unregistBroad();

}

}

最后是发送广播的Activity,在这里捕捉back按钮事件来发送广播。

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.KeyEvent;

public class Activity03 extends Activity{

BroadcastControl receiver;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity03);

receiver = new BroadcastControl(this , this);

receiver.registBroad(BroadcastControl.FINISH_ACTIVITY);

}

@Override

protected void onDestroy() {

super.onDestroy();

receiver.unregistBroad();

}

@Override

public boolean dispatchKeyEvent(KeyEvent event) {

super.dispatchKeyEvent(event);

switch(event.getKeyCode()){

case KeyEvent.KEYCODE_BACK:

Log.e("Wayne", "----OK----");

Intent i = new Intent(BroadcastControl.FINISH_ACTIVITY);

this.sendBroadcast(i);

}

return true;

}

}

    如果不仅想一次性关掉多个Activity的功能,还想通过广播实现其他功能,可以在BroadcastControl 类中添加新的Filter,其动作自由定义。然后在接收广播后的onReceive()回调方法添加其广播功能的实现就行了。当然,需要在你打算能接收到广播的Activity中注册广播。

【转】http://blog.sina.com.cn/s/blog_71d26ff00100rvov.html