如何干净彻底地退出Android应用程序,是很多开发者的心头痒。如何干净地关闭所有已打开的Activity? 如何关闭指定的Activity? 如何关闭一类Activity? 这里,我们提出一种通过实现对Application的扩展,实现了一种高效管理Activity,实现Android干净彻底地退出应用程序。
class="alignnone size-medium wp-image-161" src="/Upload/Images/2013101822/F76EC9DCBCA57949.jpeg" alt="exit app" />
首先,我们将管理Activity的功能通过一个扩展的Application类来实现。
1 publicclassMyApplicationextendsApplication{ 2 privatestaticStack<Activity>activityStack; 3 4 /** 5 *单例模式(Singleton Pattern),使用private构造函数,使得外部不能实例化该类 6 */ 7 privateMyApplication(){ 8 } 9 publicstaticMyApplication getInstance(){ 10 returnExitHolder.instance; 11 } 12 /** 13 *内部类,当ExitApplication被加载的时候,内部类不会被初始化,只有当getinstance方法被调用才加载此类,取得instance实例. 14 *由于instance在类初始化的时候完成,天生对线程友好,所以不需要使用同步 15 */ 16 privatestaticclassExitHolder{ 17 privatestaticMyApplication instance=newMyApplication(); 18 } 19 /** 20 * add Activity 添加Activity到栈 21 */ 22 publicvoidaddActivity(Activity activity){ 23 if(activityStack==null){ 24 activityStack=newStack<Activity>(); 25 } 26 activityStack.add(activity); 27 } 28 /** 29 * get current Activity 获取当前Activity(栈中最后一个压入的) 30 */ 31 publicActivity currentActivity(){ 32 Activity activity=activityStack.lastElement(); 33 returnactivity; 34 } 35 /** 36 * 结束当前Activity(栈中最后一个压入的) 37 */ 38 publicvoidfinishActivity(){ 39 Activity activity=activityStack.lastElement(); 40 finishActivity(activity); 41 } 42 43 /** 44 * 结束指定的Activity 45 */ 46 publicvoidfinishActivity(Activity activity){ 47 if(activity!=null){ 48 activityStack.remove(activity); 49 activity.finish(); 50 activity=null; 51 } 52 } 53 54 /** 55 * 结束指定类名的Activity 56 */ 57 publicvoidfinishActivity(Class<?>cls){ 58 for(Activity activity:activityStack){ 59 if(activity.getClass().equals(cls)){ 60 finishActivity(activity); 61 } 62 } 63 } 64 65 /** 66 * 结束所有Activity 67 */ 68 publicvoidfinishAllActivity(){ 69 for(inti=0,size=activityStack.size();i<size;i++){ 70 if(null!=activityStack.get(i)){ 71 activityStack.get(i).finish(); 72 } 73 } 74 activityStack.clear(); 75 } 76 77 /** 78 * 退出应用程序 79 */ 80 publicvoidAppExit(){ 81 try{ 82 finishAllActivity(); 83 }catch(Exceptione){ 84 } 85 } 86 87 }
注意,为了在我们自己的应用程序中使用这个自定义的Application类,而不是默认的Application类。需要在Manifest文件中修改一下<Application>的属性( android:name)
例如:
1 <application 2 android:icon="@drawable/icon" 3 android:label="@string/app_name" 4 android:name="your_package_name_here.MyApplication">
使用方法:
方法1: 之后我们在所有的activity的oncreate方法中通过getinstance得到一个MyApplication的实例,然后调用addActivity方法把当前的activity加入到stack中,如果要退出应用程序只需要调用AppExit方法即可。
方法2: 自定义一个继承Activity类的BaseActivity
1 publicclassBaseActivityextendsActivity{ 2 @Override 3 protectedvoidonCreate(Bundle savedInstanceState){ 4 super.onCreate(savedInstanceState); 5 //添加Activity到堆栈 6 MyApplication.getInstance().addActivity(this); 7 } 8 9 @Override 10 protectedvoidonDestroy(){ 11 super.onDestroy(); 12 //结束Activity&从栈中移除该Activity 13 MyApplication.getInstance().finishActivity(this); 14 } 15 16 }
后续的Activity 都集成这个BaseActivity就可以了。
Android的官方文档中写到”没有必要自定义Application类”
There is normally no need to subclass Application.
但事实上,通过逆向工程国际大厂的Android应用,我发现各厂都自定义了Application类用以实现Global变量操作和Activity管理。所以我们也学习一下吧~(你也有兴趣通过逆向工程来借鉴一下别人的Android应用?别急,后续的教程里会陆续介绍的。)
以上的代码只是基本的Activity管理方案,以此为框架,我们可以加入更多关于Acitivity的管理方法以及其他全局变量的操作。
欢迎访问 http://www.mobiletuts.me 一个及时更新的Android开发教程网站