下文来自:

http://blog.csdn.net/sgl870927/archive/2011/03/27/6281971.aspx

--------------------------------------------------------------------------------------------------

在一个项目中,要退出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. android实践项目八做一个下载读条
  2. Android保持屏幕常亮的方法
  3. Android(安卓)Studio常见错误及解决方法汇总
  4. android 控件属性
  5. Android(安卓)动态设置全屏,退出全屏
  6. android 4.0.3 dhcpcd使用方法
  7. Android(安卓)网络下载图片
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. The Android Versions History : Cupcake
  2. Android studio 3.0和unity交互 Manifest
  3. Android Studio & HTTP Proxy
  4. android 获取系统默认路径
  5. android点击实现图片放大缩小
  6. Android AESUtils 工具类与调用方法
  7. XE7 Android 中使用 MessageDlg 范例
  8. Android Root SuperUser su相关资源
  9. ubuntu下Android源码下载编译运行,单独编
  10. 获得root权限