推荐!!好方便!!
基本逻辑就是:定义一个BaseActivity,在这个Activity中绑定广播,在广播的onReceive方法中调用finish();然后以后的Activity都继承这个Activity,退出时发送广播,退出BaseActivity,父activity都退出了,子activity肯定退出。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; public class BaseActivity extends AppCompatActivity { protected BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { finish(); } }; @Override public void onResume() { super .onResume(); // 在当前的activity中注册广播 IntentFilter filter = new IntentFilter(); filter.addAction( "ExitApp" ); this .registerReceiver( this .broadcastReceiver, filter); } @Override protected void onDestroy() { // TODO Auto-generated method stub super .onDestroy(); //解除绑定 this .unregisterReceiver( this .broadcastReceiver); } } |
一个Activity实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.Button; import android.widget.Toast; public class ActivityC extends BaseActivity { Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_activity_c); SysApplication.getInstance().addActivity( this ); btn = (Button) findViewById(R.id.acticityc_btn); //关闭所有的activity btn.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { } }); } /** * 捕获手机物理菜单键 */ private long exitTime = 0 ; @Override public boolean onKeyDown( int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK){ //&& event.getAction() == KeyEvent.ACTION_DOWN if ((System.currentTimeMillis()-exitTime) > 2000 ){ Toast.makeText(getApplicationContext(), "再按一次退出程序" , Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { myExit(); } return true ; } return super .onKeyDown(keyCode, event); } protected void myExit() { //第二种退出方法 // SysApplication.getInstance().exit(); Intent intent = new Intent(); intent.setAction( "ExitApp" ); this .sendBroadcast(intent); //super.finish(); } @Override protected void onStop() { super .onStop(); Log.i( "tag" , "ActivityC-onStop" ); } @Override protected void onDestroy() { super .onDestroy(); Log.i( "tag" , "ActivityC-onDestroy" ); } } |
就是在退出的地方调用这个:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
private long exitTime = 0 ; @Override public boolean onKeyDown( int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK){ //&& event.getAction() == KeyEvent.ACTION_DOWN if ((System.currentTimeMillis()-exitTime) > 2000 ){ Toast.makeText(getApplicationContext(), "再按一次退出程序" , Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { myExit(); } return true ; } return super .onKeyDown(keyCode, event); } protected void myExit() { //第二种退出方法 // SysApplication.getInstance().exit(); Intent intent = new Intent(); intent.setAction( "ExitApp" ); this .sendBroadcast(intent); //super.finish(); } |
优点:方便,方便!!只需要在退出的地方发送广播就可以!!
这是我的退出时的输出:
1
2
3
4
5
6
|
08 - 09 15 : 33 : 48.869 26919 - 26919 /example.com.closeapp I/tag: MainActivity-onPause 08 - 09 15 : 33 : 49.279 26919 - 26919 /example.com.closeapp I/tag: MainActivity-onStop 08 - 09 15 : 33 : 51.569 26919 - 26959 /example.com.closeapp D/OpenGLRenderer: endAllStagingAnimators on 0x55850598b0 (RippleDrawable) with handle 0x5585041510 08 - 09 15 : 33 : 56.079 26919 - 26919 /example.com.closeapp I/tag: MainActivity-onDestroy 08 - 09 15 : 33 : 56.089 26919 - 26919 /example.com.closeapp I/tag: ActivityB-onDestroy 08 - 09 15 : 33 : 56.399 26919 - 26919 /example.com.closeapp I/tag: ActivityC-onDestroy |
用list保存activity实例,然后逐一干掉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.content.DialogInterface; import android.content.Intent; public class SysApplication extends Application { private List<Activity> mList = new LinkedList<Activity>(); private static SysApplication instance; private SysApplication() { } public synchronized static SysApplication getInstance() { if ( null == instance) { instance = new SysApplication(); } return instance; } // add Activity public void addActivity(Activity activity) { mList.add(activity); } public void exit() { try { for (Activity activity : mList) { if (activity != null ) activity.finish(); } } catch (Exception e) { e.printStackTrace(); } finally { // System.exit(0);//去掉这个 } } @Override public void onLowMemory() { super .onLowMemory(); System.gc(); } } 在每个Activity的onCreate方法中添加类似代码: public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); SysApplication.getInstance().addActivity( this ); } |
在需要退出程序的时候,调用:
1
|
SysApplication.getInstance().exit(); |
简而言之,通过单例模式把每个Activity 的引用添加到一个全局链表中,每次退出程序调用System.exit(0)时,先调用链表中Activity 的finish方法
优点:实现简单,逻辑清晰
Android退出多个activity的两种方法转载http://www.codesocang.com/anzhuoyuanma/boke/33693.html