• Android完全退出应用程序(一)


    在一个项目中,要退出android程序,试了restartPackage、 killBackgroundProcesses 、通过异常并在Application的子类中重新注册Thread的 Thread.UncaughtExceptionHandler接口+异常方式,等等,都没有效果。

    最后发现其实只要在从一个activity A 跳到另一个activity B 时,调用了A的finish方法,程序就能退出,但这样不能实现Back操作了,最后想一个办法:我们为什么不自己控制程序创建的activity呢?比如我们可以把程序创建的avtivity放在一个全局变量里,在退出程序的时候取出每个还存在的activity,并对每个activity依次调用finish最后程序就正常退出了。

    先做以下几点说明:

    1)我们可以重写一个Activity管理类ActivityManager,里面有一个堆栈结构,用来存放用户显示的activity,并暴露几个方法,一个向堆栈结构中加入Activity,它主要用来当新建一个Activity时加入堆栈,另外一个从堆栈结构中取出一个Activity,当用户调用Back按键时,要从堆栈中删除无用的activity,最后定义一个系统退出时清空activity方法,并在清空Activity时调用每个Activity的finish方法完成内存资源的释放。
    (2)为了共享复杂的数据类型,我们可以采用重写Application类的方法,在这个类里面定义一个成员---Activity管理类ActivityManager,这样它就可以被所有的Activity共享了。
    (3)在适当的时候我们调用ActivityManager的入堆栈操作和出堆栈操作就行了。比如,在我的需求里,我在onCreate时调用入堆栈操作,在用户进行点击Back按键时进行出堆栈操作。
    (4)为了减少代码的重复性,我们可以在实际操作时,自定义一个Activity基类,重写里面的onCreate()方法和onBackPressed方法,onCreate方法里我们把当前的Activity放入自定义ActivityManager,onBackPressed我们将当前Activity从ActivityManager中弹出。
     
    先看ActivityManager类主要代码。
    import java.util.Stack;
    public class ActivityManager {     private static Stack<Activity> activityStack;     private static ActivityManager instance;
        private ActivityManager() {     }
        public static ActivityManager getScreenManager() {         if (instance == null) {             instance = new ActivityManager();         }         return instance;     }
        //退出栈顶Activity     public void popActivity(Activity activity) {         if (activity != null) {
               //在从自定义集合中取出当前Activity时,也进行了Activity的关闭操作             activity.finish();             activityStack.remove(activity);             activity = null;         }     }
        //获得当前栈顶Activity     public Activity currentActivity() {         Activity activity = null;        if(!activityStack.empty())          activity= activityStack.lastElement();         return activity;     }
        //将当前Activity推入栈中     public void pushActivity(Activity activity) {         if (activityStack == null) {             activityStack = new Stack<Activity>();         }         activityStack.add(activity);     }
        //退出栈中所有Activity     public void popAllActivityExceptOne(Class cls) {         while (true) {             Activity activity = currentActivity();             if (activity == null) {                 break;             }             if (activity.getClass().equals(cls)) {                 break;             }             popActivity(activity);         }     } }
     
    再看看自定义的Application类,有关网络连接处理的代码可以忽略不管。
    public class ApplicationEx extends Application {
        private static final String TAG = "ApplicationEx";     private HttpClient httpClient; //采用apache网络连接组件     private ActivityManager activityManager = null;
        public ApplicationEx() {     }
        public ActivityManager getActivityManager() {         return activityManager;     }
        public void setActivityManager(ActivityManager activityManager) {         this.activityManager = activityManager;     }
        @Override     public void onCreate() {
            super.onCreate();         httpClient = createHttpClient();
          //初始化自定义Activity管理器         activityManager = ActivityManager.getScreenManager();     }
        @Override     public void onLowMemory() {         super.onLowMemory();         shutdownHttpClient();     }
        @Override     public void onTerminate() {         super.onTerminate();         shutdownHttpClient();     }
        private void shutdownHttpClient() {         if (httpClient != null && httpClient.getConnectionManager() != null) {             httpClient.getConnectionManager().shutdown();         }     }
        private HttpClient createHttpClient() {         Log.d(TAG, "createHttpClient()...");         HttpParams params = new BasicHttpParams();         HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);         HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);         HttpProtocolParams.setUseExpectContinue(params, true);
            SchemeRegistry schReg = new SchemeRegistry();         schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));         schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
           //解决多线程访问安全问题         ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params, schReg);         return new DefaultHttpClient(connectionManager, params);     }
        public HttpClient getHttpClient() {         if (httpClient != null) {             return httpClient;         } else {             return createHttpClient();         }     }
    }
    再看看我们自定义的一个Acitivity基类。
    public abstract class AbstractTemplateActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         ApplicationEx application = (ApplicationEx) this.getApplication();         application.getActivityManager().pushActivity(this);           }
          @Override     public void onBackPressed() {         super.onBackPressed();         ApplicationEx application = (ApplicationEx) getApplication();         application.getActivityManager().popActivity(this);     }
       }
    这样只我们的Activity都继承AbstractTemplateActivity ,我们就不需要在每个Activity中写    ApplicationEx application = (ApplicationEx) this.getApplication();       application.getActivityManager().pushActivity(this); 等相关代码了。

    在android 2.1以上的版本都能实现Activity的完全退出。

    原文链接:http://blog.csdn.net/sgl870927/article/details/6281971

     

  • 相关阅读:
    线程学习笔记
    mac系统在配置navicat时连接数据的时候提示can't connect to mysql server on '127.0.0.1'
    启动apache 提示Starting httpd: AH00558
    使用block的时候,导致的内存泄漏
    如何调整cell的大小
    代码控制打电话、发短信、发邮件、打开手机app等操作
    汇编学习--第九天
    汇编学习--第八天
    原码一位乘法与补码一位乘法
    定点整数的加减法
  • 原文地址:https://www.cnblogs.com/shiqi/p/2377245.html
Copyright © 2020-2023  润新知