如何干净彻底地退出Android应用程序,是很多开发者的心头痒。如何干净地关闭所有已打开的Activity? 如何关闭指定的Activity? 如何关闭一类Activity? 这里,我们提出一种通过实现对Application的扩展,实现了一种高效管理Activity,实现Android干净彻底地退出应用程序。

exit app


首先,我们将管理Activity的功能通过一个扩展的Application类来实现。

复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 public class MyApplication extends Application { private static Stack<Activity> activityStack; private static MyApplication singleton; @Override public void onCreate() { super .onCreate(); singleton= this ; } // Returns the application instance public static MyApplication getInstance() { return singleton; } /** * add Activity 添加Activity到栈 */ public void addActivity(Activity activity){ if (activityStack == null ){ activityStack = new Stack<Activity>(); } activityStack.add(activity); } /** * get current Activity 获取当前Activity(栈中最后一个压入的) */ public Activity currentActivity() { Activity activity = activityStack.lastElement(); return activity; } /** * 结束当前Activity(栈中最后一个压入的) */ public void finishActivity() { Activity activity = activityStack.lastElement(); finishActivity(activity); } /** * 结束指定的Activity */ public void finishActivity(Activity activity) { if (activity != null ) { activityStack.remove(activity); activity.finish(); activity = null ; } } /** * 结束指定类名的Activity */ public void finishActivity(Class<?> cls) { for (Activity activity : activityStack) { if (activity.getClass().equals(cls)) { finishActivity(activity); } } } /** * 结束所有Activity */ public void finishAllActivity() { for ( int i = 0 , size = activityStack.size(); i < size; i++) { if ( null != activityStack. get (i)) { activityStack. get (i).finish(); } } activityStack.clear(); } /** * 退出应用程序 */ public void AppExit() { try { finishAllActivity(); } catch (Exception e) { } } }

注意,为了在我们自己的应用程序中使用这个自定义的Application类,而不是默认的Application类。需要在Manifest文件中修改一下<Application>的属性( android:name)

例如:

1<application2android: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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class BaseActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState){ super .onCreate(savedInstanceState); //添加Activity到堆栈 MyApplication.getInstance().addActivity( this ); } @Override protected void onDestroy(){ super .onDestroy(); //结束Activity&从栈中移除该Activity MyApplication.getInstance().finishActivity( this ); } }


后续的Activity 都集成这个BaseActivity就可以了。

Android的官方文档中写到”没有必要自定义Application类”

There is normally no need to subclass Application.

但事实上,通过逆向工程国际大厂的Android应用,我发现各厂都自定义了Application类用以实现Global变量操作和Activity管理。所以我们也学习一下吧~(你也有兴趣通过逆向工程来借鉴一下别人的Android应用?别急,后续的教程里会陆续介绍的。)

以上的代码只是基本的Activity管理方案,以此为框架,我们可以加入更多关于Acitivity的管理方法以及其他全局变量的操作。

欢迎访问 http://www.mobiletuts.me 一个及时更新的Android开发教程网站


更多相关文章

  1. Android ListView动画实现方法
  2. ADB连接Android设备的三种方法
  3. Android通过Alpha实现渐变效果的几个方法
  4. Android中AVD(Android Virtual Device)不能启动的处理方法
  5. Android多个Activity切换时其生命周期中的方法执行顺序

随机推荐

  1. 手机QQ桌面2.0(Android)发布:新增主题模式
  2. Android(安卓)ListView一些应该知道的事
  3. android利用post方式与web服务器通信
  4. Android中通过gradle脚本做的一些小事情
  5. Facebook Buck和xctool:针对Android和iOS
  6. [Android] 为Android安装BusyBox —— 完
  7. 【Unity3d】Unity5与Android交互通信(使用
  8. Android人脸识别app——基于Face++,MVP+Re
  9. [Android] ListView (普通列表控件) 的基
  10. Android自学笔记-3-ADB的常用命令