在一个项目中,要退出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的完全退出。

更多相关文章

  1. 项目中的Activity统一管理 方便完全退出程序
  2. Android(安卓)MMS 源码目录结构
  3. android 启动 service 的两种方法
  4. 准备☞Android(安卓)异步消息分发机制
  5. Android属性动画之ObjectAnimator控制
  6. Android(安卓)Studio3.4.0,新建项目出现“Invalid escape sequenc
  7. Android(安卓)WebView由于重定向造成的goBack()无效的问题解决
  8. Android(安卓)的 Application 初始化
  9. Android利用activity-alias动态更新图标icon,标题label

随机推荐

  1. 2011.09.23(2)——— android sample之Note
  2. android 按钮按下效果(文字颜色和按钮同时
  3. android 主线程和子线程之间的消息传递
  4. How to destroy an Activity in android
  5. Android(安卓)Studio 1.5.1最新版下载地
  6. Android(安卓)Material Design : Collaps
  7. android 中让activity全屏幕显示
  8. android之针对fragment多次调用onCreateV
  9. Android应用程序键盘(Keyboard)消息处理机
  10. retrofit2+RxJava简单使用