android怎么关掉所有的程序,退出Android程序时清除所有activity的实现方法

本文实例讲述了退出Android程序时清除所有activity的方法。分享给大家供大家参考,具体如下:

在一个项目中,要退出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 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();

}

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的完全退出。

希望本文所述对大家Android程序设计有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值