`
亚当爱上java
  • 浏览: 705833 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解决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
分享到:
评论

相关推荐

    Android完全退出应用demo

    在Android开发中,完全退出应用程序通常指的是关闭所有与应用相关的活动(Activities)和释放系统资源。这不仅是用户体验的一部分,也可能在某些情况下是必要的,比如在内存紧张时优化系统性能。以下是一个关于如何...

    ANDROID 应用完全退出

    在Android平台上,应用程序的退出方式并不像桌面操作系统那样简单,因为Android系统会自动管理应用程序的生命周期,以便在需要时高效地使用系统资源。然而,有时开发者或用户可能希望应用程序能够完全退出,以防止...

    android 完全退出应用程序实现代码

    在Android开发中,完全退出应用程序并不像在桌面操作系统中简单地关闭窗口那样直观。由于Android的设计理念强调用户体验和后台进程的高效利用,因此系统通常不会允许应用自行彻底退出,而是将其保留在内存中以便快速...

    怎样完全退出android程序

    如果想退出Android程序,一般都是调用finish()、System.exit(0)android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,...

    android 如何完全退出程序

    当用户在任何Activity中选择退出应用程序时,只需调用`ExitApplication.getInstance().exit()`即可确保所有Activity被正确关闭,应用程序得以完全退出。 通过上述方法,开发者可以有效地控制应用程序的生命周期,...

    android 完全退出程序

    在退出应用时,可以使用一个特殊的Intent启动系统设置,让用户选择关闭应用。例如,可以创建一个BroadcastReceiver监听特定的Intent,并在接收到Intent时执行退出操作。 5. **后台服务与广播接收器** 如果应用包含...

    Android应用开发多个activity完全退出程序方法

    注意,频繁地完全退出应用可能会对用户体验造成影响,因为Android系统通常能够有效地管理后台应用的内存占用。只有在特定场景下,如隐私保护或资源节省,才需要考虑完全退出应用。同时,遵循Android的设计原则和最佳...

    Android中实现再按一次返回键退出应用程序

    在Android应用开发中,通常我们希望用户在按下返回键时能够退出应用程序,但为了提供更好的用户体验,Android系统并不推荐直接在用户第一次点击返回键时就退出。为了实现“再按一次返回键退出应用程序”的功能,我们...

    解决android退出整个应用的例子

    在Android开发中,退出整个应用是一项常见的需求,尤其是在用户完成所有操作后希望彻底退出应用时。这个主题主要涉及Android应用程序的生命周期、Activity栈管理和进程管理。以下是对这一问题的详细阐述: 首先,...

    Android 完全退出程序,关闭所有Activity

    在Android应用开发中,完全退出程序意味着结束所有与应用程序相关的活动(Activity)并释放系统资源。用户通常期望点击“退出”按钮后,整个应用程序能够完全关闭,而不是仅仅停留在后台运行。下面我们将详细讨论...

    Android完全退出应用程序的方法

    在Android应用开发中,完全退出应用程序并不像在其他操作系统中那样简单,因为Android系统的设计理念是尽可能保持应用的后台状态,以便用户能快速恢复到之前的状态。然而,有些情况下开发者可能需要提供一个完全退出...

    Android 完全退出应用程序的解决方法

    有一种需要,我们在菜单项中点击退出应用程序,应用程序就退出,不需要回到MainActivity设计:有两个应用界面MainActivity和BActivity,以及用于程序的通用类ExitUtil ... } // 完全退出应用程序 p

    Android彻底退出应用程序.doc

    Android彻底退出应用程序.doc

    Android中一键退出应用程序

    在Android系统中,由于其设计原则,通常不鼓励开发者实现一键退出应用的功能,因为系统会自动管理应用程序的内存资源。然而,用户有时可能有需求快速退出应用,这就涉及到如何在Android程序中实现这一功能。本篇文章...

    使用Application做android完全退出系统实例

    在Android开发中,有时我们需要实现一个功能,使得用户在点击某个按钮后,应用程序能够完全退出,包括清除所有活动栈中的Activity以及停止后台服务。这里我们将深入探讨如何利用`Application`类来实现这一功能,以及...

    Android完全退出程序方法

    5. **优化用户体验**:通常,我们不建议强制用户完全退出应用,因为Android系统会自动管理应用的内存资源。然而,如果确实需要提供这种功能,确保在提示用户时清晰说明,并考虑提供一种非侵入性的退出方式,如多次...

    退出android应用程序Demo

    在Android开发中,退出应用程序是一个常见的需求,尤其是在某些特定的应用场景下,用户可能希望完全关闭应用,而不是简单地退回到后台。本示例"退出Android应用程序Demo"将讲解如何实现这个功能,涉及到的关键知识点...

Global site tag (gtag.js) - Google Analytics