如果有A,B,C三个Activity,而想在B 或C 中Activity 退出,调用上面的方法,往往会销毁当前的Activity 返回上一个Activity。


当然也可以逐个返回上一个Activity,直到跳转到入口的Activity,最后退出应用程序。但这样比较麻烦,而且逐个返回的体验并不友好。

     网上比较流行的方法是定义栈,写一个ExitApplication 类,利用单例模式管理Activity,在每个在Activity 的onCreate()方法中调用          MyApplication .getInstance().addActivity(this)方法,在退出时调用MyApplication .getInstance().exitApp()方法,就可以完全退出应用程序了。

public class MyApplication extends Application {
private List<Activity> activityList = new LinkedList<Activity>();
private static MyApplication instance;


/**
* 单例模式中获取唯一的AppContext实例
*/
public static MyApplication getInstance() {
if (null == instance) {
instance = new MyApplication();
}
return instance;
}                                                                                                                                   // 添加Activity到容器中
public void addActivity(Activity activity) {
activityList.add(activity);
}




/**
* 遍历所有Activity并finish
*/
public void exitApp() {
for (Activity activity : activityList) {
if (activity != null) {
activity.finish();
}
}
System.exit(0);
}

                                                                                                     }

在父类Activity中调用。addActivity.


public abstract class BaseActivity extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);\
		MyApplication.getInstance().addActivity(this);
	}
}



在退出时调用exitApp方法。


1.killbackgroundprocesses-no-working
//经测试此方法不可行,经测试只关闭了当前Activity,先前打开未关闭的Activity不关闭。


private void killApp(String packageName) {
    ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(ACTIVITY_SERVICE);
    Log.d(TAG, "Trying to kill app " + packageName);
    am.killBackgroundProcesses(packageName);
}



/Android will not kill the app or process when it is displaying on screen i.e active view. so switch to home screen and then kill the app or process you want/

//经测试以下方法存在问题,退出后,再次进入界面,进入的首界面是先前没有关闭的Activity.

public void KillApplication(String KillPackage)
{
    ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);    

    Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    this.startActivity(startMain);



    am.killBackgroundProcesses(KillPackage);
    Toast.makeText(getBaseContext(),"Process Killed : " + KillPackage  ,Toast.LENGTH_LONG).show();       
}



2.注册发送关闭命令的广播

public abstract class EnterActivity extends BaseActivity {  
...  
    // 写一个广播的内部类,当收到动作时,结束activity  
    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {  
        @Override  
        public void onReceive(Context context, Intent intent) {  
            close();  
            unregisterReceiver(this); // 这句话必须要写要不会报错,虽然能关闭,不过会报一堆错  
        }  
    };  
  
    @Override  
    public void onResume() {  
        super.onResume();  
  
        // 在当前的activity中注册广播  
        IntentFilter filter = new IntentFilter();  
        filter.addAction(Attribute.PAGENAME);  
        registerReceiver(this.broadcastReceiver, filter); // 注册  
    }  
  
    /** 
     * 关闭 
     */  
    public void close() {  
        Intent intent = new Intent();  
        intent.setAction(Attribute.PAGENAME); // 说明动作  
        sendBroadcast(intent);// 该函数用于发送广播  
        finish();  
    }  
...  
}



3.根据Activity的声明周期

  我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。


  在A窗口中使用下面的代码调用B窗口
  Intent intent = new Intent();
  intent.setClass(A.this, B.class);
  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置
  startActivity(intent);
  接下来在B窗口中需要退出时直接使用finish方法即可全部退出。

未测试不知是否通用



4.此方法同1,我自己未测试过。

http://www.eoeandroid.com/thread-52223-1-3.html

     由于android 是 基于liux 操作系统的, 所以 一般情况下 我们 使用 
     android.os.Process.killProcess(android.os.Process.myPid()); 这个方法就可以杀掉进程,
    不过当 activity 多的时候,而且当我们忘记finish 其中的某几个,或者说,你对 AndroidMainfest.xml 中的 每个 Activity 中 android:launchMode , android:alwaysRetainTaskState 这些都不是很清楚时,就会出现 应用的 关闭不完全,

    主要原因是由于 残留的 Activity 本身是一个进程,所以系统又把这个Activity提到了最前面,就会使我们的程序没有完全关闭, 

        那么 再 1.5---2.1  用了一个 方法,都可以成功的解决这个问题,那就是
             final ActivityManager am = (ActivityManager) ACTIVITY
                                .getSystemService(Context.ACTIVITY_SERVICE);
                am.restartPackage(ACTIVITY.getPackageName());
       但是到了 2.2 的时候, 这个方法,就不奏效了, 那么我想请问 各位同仁们,有没有 什么通用的办法呢~~~~  

           这个问题,网上的童鞋,也是有非常多做法,android123 也给我们提供了,非常多的解决办法, 但是小弟不才,他们提供的方法,有些时候,不管用,所以很费脑~~~~
          现在我将我 这个方法 分享给大家, 这个方法在 1.5--2.3 的机器上都测试过,是可以完全杀死进程的

       该方法需要两个必要条件
      条件一:  一个自己管理Activity 的列表, 网上很多用 ArryList 来存储acitivity
      条件二: 需要一段,重新开启堆栈,跳转到 Home界面,并且 用liux的杀掉进程的方法

      代码如下
      

protected void quit()
      {
             int size = activityManager.activityStackCount();
            for(int i =size-1 ; i > 0 ;i--)
              {
                Activity activity =  activityManager.allTaskActivity().get(i);
                 activityManager.popActivity(activity);
              }
              activityManager = null;
             getActivity().finish();            //单独使用以下方法存在问题,退出后,再次进入界面,进入的首界面是先前没有关闭的Activity.
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
           android.os.Process.killProcess(android.os.Process.myPid());  
     }