这个问题以前困扰啊,现在解决了。
在实际开发中,总有时候是希望当进入某个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