android完美退出程序

还有一种比较流行的Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,并且容易理解、易于操作,非常不错!
MyApplication类(储存每一个Activity,并实现关闭所有Activity的操作)
public
class MyApplication extends Application {

private List<Activity>
activityList = new LinkedList<Activity>();
private static
MyApplication instance;

            private
MyApplication()
            {
            }
            
//单例模式中获取唯一的MyApplication实例
             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 exit()
            
{
                          for(Activity
activity:activityList)
                        
{
                           activity.finish();
                        
}
                           System.exit(0);
           
}
}
在每一个Activity中的onCreate方法里添加该Activity到MyApplication对象实例容器中
MyApplication.getInstance().addActivity(this);
在需要结束所有Activity的时候调用exit方法
MyApplication.getInstance().exit();




我对其他一些退出方法进行的一点介绍和点评(不到之处还请指正):
@restartPackage(getPackageName())(具体就不介绍了)
我在SDK2.1版本下开发的一款小软件,放到Android2.2或2.3操作系统上无法退出,因为restartPackage方法在SDK2.1以后版本已经被废弃不用了,理由是因为它不安全,可能关闭同其他应用程序共享的Service,而这个Service别人还要用呢,你给别人关了就不对了。

@有人说的终极退出方法:
          
Intent startMain = new Intent(Intent.ACTION_MAIN);
          
startMain.addCategory(Intent.CATEGORY_HOME);
          
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          
startActivity(startMain);
          
System.exit(0);
实际上这种方法只是返回了Home页面,如果你再次进入应用,你会发现进入的首界面是你先前没有关闭的Activity。

@调用系统隐藏forceStopPackage方法,这里是通过映射调用(也有其他方法)
       
Method method = null;
        ActivityManager manager = (ActivityManager)
getSystemService(ACTIVITY_SERVICE);
        try {
         method =
Class.forName("android.app.ActivityManager").getMethod("forceStopPackage",
String.class);
         method.invoke(manager,getPackageName());
        }
catch (Exception e) {
         Log.d("force",e.getMessage());   
       
}
我在SDK2.2和2.3的测试结果是,出现NULLPointerException,弹出错误窗口,程序被迫关闭,和预想的正常退出有差别。不过我们可以通过修改基类实现自己的Thread.UncaughtExceptionHandler接口的uncaughtException方法,这样就不会有错误窗口弹出。程序完全退出。

@和上面一样,不过这是故意制造异常退出(上边是无意制造的异常),但我认为这毕竟是下策。
posted @ 2012-08-31 11:02  子福当自强  阅读(198)  评论(0编辑  收藏  举报
悟道