android 完全退出应用程序

发布于 2022-10-15 04:14:28 字数 9264 浏览 14 评论 0

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类主要代码。

  1. import java.util.Stack;
  2. public class ActivityManager {
  3.     private static Stack<Activity> activityStack;
  4.     private static ActivityManager instance;
  5.     private ActivityManager() {
  6.     }
  7.     public static ActivityManager getScreenManager() {
  8.         if (instance == null) {
  9.             instance = new ActivityManager();
  10.         }
  11.         return instance;
  12.     }
  13.     //退出栈顶Activity
  14.     public void popActivity(Activity activity) {
  15.         if (activity != null) {
  16.            //在从自定义集合中取出当前Activity时,也进行了Activity的关闭操作
  17.             activity.finish();
  18.             activityStack.remove(activity);
  19.             activity = null;
  20.         }
  21.     }
  22.     //获得当前栈顶Activity
  23.     public Activity currentActivity() {
  24.         Activity activity = null;
  25.        if(!activityStack.empty())
  26.          activity= activityStack.lastElement();
  27.         return activity;
  28.     }
  29.     //将当前Activity推入栈中
  30.     public void pushActivity(Activity activity) {
  31.         if (activityStack == null) {
  32.             activityStack = new Stack<Activity>();
  33.         }
  34.         activityStack.add(activity);
  35.     }
  36.     //退出栈中所有Activity
  37.     public void popAllActivityExceptOne(Class cls) {
  38.         while (true) {
  39.             Activity activity = currentActivity();
  40.             if (activity == null) {
  41.                 break;
  42.             }
  43.             if (activity.getClass().equals(cls)) {
  44.                 break;
  45.             }
  46.             popActivity(activity);
  47.         }
  48.     }
  49. }
  50. 再看看自定义的Application类,有关网络连接处理的代码可以忽略不管。
  51. public class ApplicationEx extends Application {
  52.     private static final String TAG = "ApplicationEx";
  53.     private HttpClient httpClient; //采用apache网络连接组件
  54.     private ActivityManager activityManager = null;
  55.     public ApplicationEx() {
  56.     }
  57.     public ActivityManager getActivityManager() {
  58.         return activityManager;
  59.     }
  60.     public void setActivityManager(ActivityManager activityManager) {
  61.         this.activityManager = activityManager;
  62.     }
  63.     @Override
  64.     public void onCreate() {
  65.         super.onCreate();
  66.         httpClient = createHttpClient();
  67.       //初始化自定义Activity管理器
  68.         activityManager = ActivityManager.getScreenManager();
  69.     }
  70.     @Override
  71.     public void onLowMemory() {
  72.         super.onLowMemory();
  73.         shutdownHttpClient();
  74.     }
  75.     @Override
  76.     public void onTerminate() {
  77.         super.onTerminate();
  78.         shutdownHttpClient();
  79.     }
  80.     private void shutdownHttpClient() {
  81.         if (httpClient != null && httpClient.getConnectionManager() != null) {
  82.             httpClient.getConnectionManager().shutdown();
  83.         }
  84.     }
  85.     private HttpClient createHttpClient() {
  86.         Log.d(TAG, "createHttpClient()...");
  87.         HttpParams params = new BasicHttpParams();
  88.         HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
  89.         HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
  90.         HttpProtocolParams.setUseExpectContinue(params, true);
  91.         SchemeRegistry schReg = new SchemeRegistry();
  92.         schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
  93.         schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
  94.        //解决多线程访问安全问题
  95.         ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params, schReg);
  96.         return new DefaultHttpClient(connectionManager, params);
  97.     }
  98.     public HttpClient getHttpClient() {
  99.         if (httpClient != null) {
  100.             return httpClient;
  101.         } else {
  102.             return createHttpClient();
  103.         }
  104.     }
  105. }
  106. 再看看我们自定义的一个Acitivity基类。
  107. public abstract class AbstractTemplateActivity extends Activity {
  108.     public void onCreate(Bundle savedInstanceState) {
  109.         super.onCreate(savedInstanceState);
  110.         ApplicationEx application = (ApplicationEx) this.getApplication();
  111.         application.getActivityManager().pushActivity(this);
  112.      
  113.     }
  114.     @Override
  115.     public void onBackPressed() {
  116.         super.onBackPressed();
  117.         ApplicationEx application = (ApplicationEx) getApplication();
  118.         application.getActivityManager().popActivity(this);
  119.     }
  120.   
  121. }

复制代码这样只我们的Activity都继承AbstractTemplateActivity ,我们就不需要在每个Activity中写    ApplicationEx application = (ApplicationEx) this.getApplication();       application.getActivityManager().pushActivity(this); 等相关代码了。
在android 2.1以上的版本都能实现Activity的完全退出。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文