- 浏览: 697899 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
utyujin:
作者你好,首先自我注释一下我是一名UI设计师,最近在写关于屏幕 ...
android中的dp,px深度解析 -
eagledame:
<data android:scheme="p ...
Android利用系统广播---监听应用程序安装和卸载[转] -
圣经未来:
虽然帖子距今已有三年,但是我还是来评论一下。对于这段话: 这句 ...
android中的dp,px深度解析 -
passerby_whu:
如果Activity中已经有了很多id了。怎么样保证你指定的i ...
Android Layout 之 RelativeLayout,代码实现相对布局 -
passerby_whu:
u013023750 写道楼主你好 ...
android中的dp,px深度解析
在一个项目中,要退出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
最后发现其实只要在从一个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的密度独立性
2013-06-17 10:24 1807前言 安卓是一个只 ... -
滑动操作的维度研究
2013-06-13 10:44 1150提示:这篇文章 ... -
移动开发高价值资料参考[持续更新中]
2013-06-13 09:56 1497做人要厚道转载请注明出处:http://zhangkun71 ... -
手机产品设计之用户引导
2013-06-10 20:21 1373在手机产品的设计过程中,由于手机界面 ... -
Android 设计的几处硬伤
2013-06-08 11:31 1530[核心提示] 一些 Andro ... -
Android开发大牛们的博客[持续更新中]
2013-05-31 08:40 27做人要厚道转载请注明出处:http://zhangk ... -
LocalActivityManager的内部机制详解
2013-05-27 15:56 5125LocalActivityManager的内部 ... -
App调试内存泄露之Cursor深入研究
2013-05-24 15:20 0最近在工作中处 ... -
Android设计模式系列(6)--SDK源码之享元模式
2013-05-24 13:12 886享元模式,给我的感 ... -
Android设计模式系列(5)--SDK源码之备忘录模式
2013-05-24 11:15 1040定义(源于GoF《设计模式》):在不破坏封闭的前提下,捕获 ... -
Android设计模式系列(4)--SDK源码之模板方法模式
2013-05-24 10:39 856模板方法,和单例模 ... -
Android设计模式系列(3)--SDK源码之单例模式
2013-05-24 09:43 972单例模式,可以说是GOF的23种设计模式中最简单的一个。这 ... -
Android设计模式系列(2)--SDK源码之观察者模式
2013-05-23 17:41 1273观察者模式,是一种非常常见的设计模式,在很多系统中随处可见 ... -
Android设计模式系列(1)--SDK源码之组合模式
2013-05-23 17:12 836Android中对组合模式的应用,可谓是泛滥成粥,随处可见, ... -
Android设计模式系列(0)--开篇
2013-05-23 17:11 1169有时候,最难的是坚持;有时候缺少的是信念。 看了很多 ... -
Android Design与Holo Theme详解
2013-05-22 14:06 1501在 国内,有个很有意思的现状。一方面,几个国内最大的公司/企 ... -
GitHub上最火的Android开源项目(完结篇)
2013-05-22 09:22 7643摘要:截至目前,在GitHub“最受欢迎的开源项目”系列文 ... -
二十六个月Android学习工作总结
2013-05-21 16:52 2370本文转自http://www.cnblog ... -
Android中的Layout_weight终极研究
2013-05-17 14:08 3918以前在做UI布局时,也经常用Layout_weight属性 ... -
谷歌I/O大会给开发者带来福音:推出最新Android Studio开发工具
2013-05-17 08:59 1344摘要:在Android Studio发布之后,无论国内外, ...
相关推荐
如果想退出Android程序,一般都是调用finish()、System.exit(0)android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,...
android退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效。如果有A,B,C三个Activity,而想在B或C中...
Android怎样才能完全退出程序? 本Android程序解决了完全退出,引用context未释放引起的oom等问题。
主要介绍了Android完全退出应用程序的方法,实例分析了Android退出应用程序的相关方法与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
Android应用开发多个activity完全退出程序方法,亲测可用
有一种需要,我们在菜单项中点击退出应用程序,应用程序就退出,不需要回到MainActivity设计:有两个应用界面MainActivity和BActivity,以及用于程序的通用类ExitUtil ... } // 完全退出应用程序 p
Android中实现再按一次返回键退出应用程序,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/64234676
Android彻底退出应用程序.doc
如果想退出Android程序,一般都是调用finish()、System.exit(0)、android.os.Process.killProcess(android.os.Process.myPid())等方法来实现退出程序功能,可是在实际开发中,并不能达到完全退出应用程序的效果,...
Android中实现一键退出应用程序,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/62104900
2 设置入口activity的启动模式android:launchMode="singleTask",重写onNewIntent方法, 在退出activity时,设置intent.setAction("exit_app");然后跳转到栈底activity, 这样就可以清除栈底之外的所有activity,...
Android 返回键退出代码,第一次提示用户再按一次返回键退出,两秒钟内再按一次则退出程序,否则认为用户取消了退出操作!下下来就可以用,绝对好用哦~~~!!
实现完全退出应用程序功能,停止所有应用程序的Activity,停止Service
使用android:process和Process.killProcess和UncaughtExceptionHandler完成Android应用程序不异常退出
Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A。在B中如何关闭整个Android应用程序呢?本人总结了几种比较简单的实现方法
Android应用源码完全退出程序的方法.zip
Android中一键退出应用程序.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。