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>
布局就一个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>
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; } } }
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); } } }
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(); } } }
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; } } }
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()方法,你在这里面写添加活动到链表,就可以不在子类中重写了。