分享

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

 华 飞 鹰 2012-02-20

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

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

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

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

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

1
2
ActivityManager activityMgr = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
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。下面是为了实现这种方式而写的类:

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

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

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

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

ScreenManager.getScreenManager().popAllActivity();

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多