`
gaofen100
  • 浏览: 1227911 次
文章分类
社区版块
存档分类
最新评论

采用Singleton模式实现Android应用的完全退出

 
阅读更多

对于同时启动了很多Activity的Android应用的完美退出,网上最常用的有三种解决方案,但是每种都有不足之处,如下:

    第一种,Dalvik VM的本地方法。

1 android.os.Process.killProcess(android.os.Process.myPid());
2   
3 System.exit(0);

    个人理解这种方式只适合Task中始终只有一个Activity的情形,对于一个以上的情况,它就只能销毁当前的Activity了,而对于在Task中位于这个Activity之下的Activity,个人认为似乎是无能为力。

  第二种,任务管理器方法。

1 ActivityManager activityMgr = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
2 activityMgr.restartPackage(getPackageName());

    注意,这种方式只能用在Android 1.5 API 3以上才可以,同时需要如下权限,而且这种方式Google官方的最新版中好像已经不支持了,因为restartPackage这个方法好像没有了。

1 <uses-permission android:name="android.permission.RESTART_PACKAGES"/>

   第三种,历史栈。这种方式可以结合第一种方式来实现特定情形下的应用退出,这种方式的一个最显著地特点就是在启动Activity的Intent中加入Intent.FLAG_ACTIVITY_CLEAR_TOP标记,这个标记的主要作用就是会在task中将你启动的哪个Activity上面的Activity全部销毁掉,这适合于将退出操作放置在应用的第一个Activity中,其他Activity通过使用Intent.FLAG_ACTIVITY_CLEAR_TOP种方式到达第一个Activity后,再从第一个Activity来退出。而对于将退出操作不放在应用的第一个Activity中的这种情况,这种方式就没法解决了。

   第四种,采用Singleton模式来处理,这种方式可以说是目前为止最好的解决办法了,它的原理主要是将所有启动的Activity放入一个全局的静态堆栈中,而在程序退出时,一次性销毁堆栈中所有存在的Activity。下面是为了实现这种方式而写的类:

01 package cn.net.toms.client.common;
02   
03 import java.util.Stack;
04   
05 import android.app.Activity;
06   
07 public class ScreenManager {
08   
09     /**
10      * 视图管理器,用于完全退出
11      
12      * @return
13      */
14     public static ScreenManager getScreenManager() {
15         if (instance == null) {
16             instance = new ScreenManager();
17         }
18         return instance;
19     }
20   
21     /**
22      * 回收堆栈中指定的activity
23      
24      * @param activity
25      */
26     public void popActivity(Activity activity) {
27         if (activity != null) {
28             activity.finish();
29             activityStack.remove(activity);
30             activity = null;
31         }
32     }
33   
34     /**
35      * 获取堆栈的栈顶activity
36      
37      * @return 栈顶activity
38      */
39     private Activity currentActivity() {
40         Activity activity = null;
41         try {
42             if (!activityStack.isEmpty()) {
43                 activity = activityStack.pop();
44             }
45             return activity;
46         } catch (Exception ex) {
47             System.out.println("ScreenManager:currentActivity---->"
48                     + ex.getMessage());
49             return activity;
50         } finally {
51             activity = null;
52         }
53     }
54   
55     /**
56      * 将activity压入堆栈
57      
58      * @param activity
59      *            需要压入堆栈的activity
60      */
61     public void pushActivity(Activity activity) {
62         if (activityStack == null) {
63             activityStack = new Stack<Activity>();
64         }
65         activityStack.push(activity);
66     }
67   
68     /**
69      * 回收堆栈中所有Activity
70      */
71     public void popAllActivity() {
72         Activity activity = null;
73         try {
74             while (!activityStack.isEmpty()) {
75                 activity = currentActivity();
76                 if (activity != null) {
77                     popActivity(activity);
78                 }
79             }
80         } finally {
81             activity = null;
82         }
83     }
84   
85     private ScreenManager() {
86   
87     }
88   
89     private static Stack<Activity> activityStack;
90     private static ScreenManager instance;
91 }

 然后在每个Activity的onCreate方法中加入

1 ScreenManager.getScreenManager().pushActivity(this);

即可将所有Activity放入这个堆栈中。最后我们在程序退出时如下操作,即可完美的退出整个应用。

ScreenManager.getScreenManager().popAllActivity();

   注意,以上的四种方式都是在不考虑Activity的finish下的退出。

1
0
分享到:
评论

相关推荐

    list循环退出Activity,单例模式实现android的退出功能,代替广播,singleton

    通过将单例模式和Singleton类的实现方式结合起来,可以有效地管理Activity的生命周期,并且可以在应用程序的任何地方安全地退出所有Activity,甚至结束应用程序本身。这种方式在某些场景下非常有用,尤其是在需要...

    Android完美退出程序

    通过上述方法,我们可以有效地实现Android应用程序的完美退出。这种方式不仅能够确保所有的`Activity`都被正确关闭,还能根据不同的需求选择合适的退出策略。此外,通过使用单例模式来管理全局状态,使得整个实现...

    Android中人为改变程序生命周期的研究.pdf

    实现这一方法的关键在于设计和使用单态模式(Singleton Pattern)。单态模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。在Android应用中,可以创建一个单例类,该类负责引发未处理异常以关闭...

    安全退出activity方法(多种)

    在Android应用开发中,Activity是用户界面的基本组件,它负责展示屏幕上的交互元素并处理用户事件。当用户完成某个操作或者需要节省系统资源时,安全退出Activity是非常重要的。本篇文章将详细探讨多种安全退出...

    Android App调试内存泄露之Cursor.zip

    2. **避免使用静态变量持有Cursor**:尽量避免将Cursor存储在静态变量中,如果确实需要全局访问,考虑使用Singleton模式,并确保在适当的时候释放Cursor。 3. **正确管理后台线程中的Cursor**:在异步任务或其他...

    Android 平凡之路

    2. **懒汉式单例模式**:`volatile`变量可以用于实现线程安全的懒汉式单例模式。 ```java public class Singleton { private static volatile Singleton instance; private Singleton() {} public static ...

    android面试题

    【Android面试题】涵盖了许多Android开发中的核心知识点,包括线程与进程的区别、垃圾收集、字符串拼接、线程创建、ANR处理、代码分裂、Activity生命周期、Android四大组件、Service生命周期、权限管理、布局管理、...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    NativeApp 使用传统原生态Android SDK来实现的应用 WebApp 基于浏览器来实现的一种应用 HybridApp 一种可以下载的Native App,其用户界面的全部或者部分元素在嵌入式浏览器组件(WebView之类的)里面运行 优雅降级...

    Android实现Activities之间进行数据传递的方法

    在Android应用开发中,Activities是应用程序的基本构建块,它们代表用户可以交互的屏幕。Activities之间的数据传递是一个常见的需求,尤其在用户导航于多个界面时。本文将深入探讨如何在Android中实现Activities之间...

Global site tag (gtag.js) - Google Analytics