转http://blog.sina.com.cn/s/blog_5da93c8f0101772p.html解释了退出方法的一些限制

android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效。

如果有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{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);\MyApplication.getInstance().addActivity(this);}}

在退出时调用exitApp方法。


1.killbackgroundprocesses-no-working

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

转自http://stackoverflow.com/questions/19604097/killbackgroundprocesses-no-working

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://zengyan2012.iteye.com/blog/1125429

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());


}


5.其他解决方案的文章

http://blog.csdn.net/caiwenfeng_for_23/article/details/12710617


更多相关文章

  1. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  2. Android第六个功能:XmlPullParser解析XML文件
  3. 【Dialer】自定义暗码进入测试模式
  4. Android(安卓)IPC进程间通讯机制
  5. Android(安卓)-- 基础
  6. Android(安卓)textview 不使用ScrollView也可滚动的方法
  7. Android(安卓)四大组件 - 进程的 fork 创建过程
  8. 关于如何获取android状态栏高度
  9. Android(安卓)Okhttp + Android提交post表单乱码问题

随机推荐

  1. 来自.Net的Zipped Streams问题并从Java读
  2. Java记录 -88- 利用反射机制调用对象的私
  3. java客户端调用 https 的webservice
  4. Java基础小常识(4)
  5. 「小程序JAVA实战」小程序头像图片上传(中
  6. 一个简单的java网络爬虫(spider)
  7. 如何修改代码,使其仅打印单元格E和F?
  8. 今年暑假不AC (JAVA)
  9. java lang涉及抽象类的NullPointerExcept
  10. 在命令行下编译单个带包名的java类的方法