退出多个活动

1.使用广播。

写个基类活动,里面注册广播。

/**
 * 去除标题
 */
public class BasicActivity extends Activity {

	protected BroadcastReceiver broadcastrec = new BroadcastReceiver() {

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			finish();
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		// 去除标题栏
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		// 在当前的activity中注册广播
		IntentFilter filter = new IntentFilter();
		filter.addAction("ExitApp");
		this.registerReceiver(this.broadcastrec, filter);
	}

	protected void myExit() {
		Intent exitintent = new Intent();
		exitintent.setAction("ExitApp");
		this.sendBroadcast(exitintent);
		super.finish();
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		this.unregisterReceiver(this.broadcastrec);
	}
}

在要退出的时候,调用该方法:

this.myExit();

2.使用堆栈

     1.设定第一个页面的启动模式为,singletask。

 <activity
            android:name="cn.someactivity.FirstAcy"
            android:label="@string/app_name"
            android:launchMode="singleTask" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

     2.添加3个页面:

布局就一个button:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="返回" />

</LinearLayout>

页面1:

public class FirstAcy extends Activity implements OnClickListener {
	private Button back;
	private boolean isExit = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.acy_someacy);

		back = (Button) findViewById(R.id.btn_back);
		back.setText("跳转到第2个页面");
		back.setOnClickListener(this);

	}

	/**
	 * 第二次跳转到该页面时,执行该方法
	 */
	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		if (isExit == true) {
			this.finish();
		}

	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent;
		if (v == back) {
			intent = new Intent(this, SecondAcy.class);
			startActivity(intent);
			isExit = true;
		}
	}
}

页面2:

public class SecondAcy extends Activity implements OnClickListener {
	private Button back;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.acy_someacy);
		back = (Button) findViewById(R.id.btn_back);
		back.setText("跳转到第3个页面");
		back.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent;
		if (v == back) {
			intent = new Intent(this, ThirdAcy.class);
			startActivity(intent);
		}
	}
}

页面3:

public class ThirdAcy extends Activity implements OnClickListener {
	private Button back;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.acy_someacy);

		back = (Button) findViewById(R.id.btn_back);
		back.setText("退出所有界面");
		back.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent;
		if (v == back) {
			intent = new Intent(this, FirstAcy.class);
			startActivity(intent);
		}
	}
}

注意:

singletask解释:(本人的翻译水平一般,自己看官方的解释吧)

The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to existing instance through a call to its onNewIntent() method, rather than creating a new one.


3.使用链表:

重写application,因为android就一个application,所以可以将所有加入的活动放到里面,要退出的时候,就在里面直接kill掉。

   1.重写application:

public class MyApplication extends Application {
	private List acyList = new LinkedList();

	/**
	 * 添加活动
	 */
	public void addAcy(Activity acy) {
		acyList.add(acy);
	}

	/**
	 * 退出所有的活动
	 */
	public void exitAcy() {
		Iterator iter = acyList.iterator();
		while (iter.hasNext()) {
			((Activity) iter.next()).finish();
		}
	}
}

     2.添加活动到链表中:

public class FirstAcy extends Activity implements OnClickListener {
	private Button back;
	private boolean isExit = false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.acy_someacy);
		
		// 将该活动添加到链表中
		((MyApplication) this.getApplication()).addAcy(this);

		back = (Button) findViewById(R.id.btn_back);
		back.setText("跳转到第2个页面");
		back.setOnClickListener(this);

	}

	/**
	 * 第二次跳转到该页面时,执行该方法
	 */
	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		if (isExit == true) {
			this.finish();
		}

	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent;
		if (v == back) {
			intent = new Intent(this, SecondAcy.class);
			startActivity(intent);
			isExit = true;
		}
	}
}

       3.要退出的时候,调用退出方法:

public class ThirdAcy extends Activity implements OnClickListener {
	private Button back;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.acy_someacy);
		((MyApplication) this.getApplication()).addAcy(this);

		back = (Button) findViewById(R.id.btn_back);
		back.setText("退出所有界面");
		back.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent;
		if (v == back) {
			
			// 退出所有的活动
			((MyApplication) this.getApplication()).exitAcy();
		}
	}
}

注意:

这种方法,我看到网上的做法是,把application写成单例模式,这里我改了下,因为我觉得没必要写成单例,android就一个application。

其实这种方法,还可以再改良下。写一个基类活动,因为一般不会重写onstart(),onresume()方法,你在这里面写添加活动到链表,就可以不在子类中重写了。




你可能感兴趣的:(filter)