Android 之退出应用
16lz
2021-01-23
一个Android 的应用通常有多个Activity构成,但是过多的Activity仅仅用系统自带的几个Flag来处理就太局限了,因此,就自己准备写一个Activity的管理类,于是上网找了下,找到一篇转载比较广的一篇。代码如下:
package com.chinaonenet.yizhengtong.main;import android.app.Activity;import android.content.Context;import java.util.Stack;public class AppManager { private static Stack<Activity> activityStack; private static AppManager instance; private AppManager(){ } /** * 单例模式 */ public static AppManager getAppManager(){ if(instance==null){ instance = new AppManager(); } return instance; } /** * 添加Activity到堆栈 */ public void addActivityStack(Activity activity){ if(activityStack==null){ activityStack=new Stack<Activity>(); } activityStack.add(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) { // TODO Auto-generated method stub if(activity!=null && !activity.isFinishing()){ activityStack.remove(activity); activity.finish(); activity=null; } } /** * 结束指定类名activity */ public void finishActivity(Class<?> cla){ for(Activity activity:activityStack){ if(activity.getClass().equals(cla)){ activity.finish(); activity=null; break; } } } /** * 结束所有activity */ public void finishAllActivity(){ for(int i=0;i<activityStack.size();i++){ if(null != activityStack.get(i)){ finishActivity(activityStack.get(i)); break; } } activityStack.clear(); } /** * 获取指定的activity */ public Activity getActivity(Class<?> cla){ if(activityStack!=null){ for(Activity activity:activityStack){ if(activity.getClass().equals(cla)){ return activity; } } } return null; } /** * 退出应用程序 */ public void AppExit(Context context){ try{ finishAllActivity(); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); }catch (Exception e){ } }}
但是引入到工程当中之后完全不是那么回事!这段代码还是oschina客户端里面的一部分,其实在外部调用AppExit是没办法退出的,也就是说不能退出!!不能退出!!!不能退出!!! 重要的事说3遍! 不知道源代码的作者有没有做过测试,我自己起了一个工程,新建了3个Activity来测试,发现调用AppExit的时候根本不会回调onDestroy方法。如果通过finish方法结束了一个Activity的话,那么根据Activity的生命周期,一定会自动调用Activity的销毁方法onDestory(),但是用了android.os.Process.killProcess(android.os.Process.myPid())这个方法,Activity中的onDestory()不会执行。因为android.os.Process.killProcess(android.os.Process.myPid())属于强制关闭,完全绕过了Activity的生命周期。当然这种方法需要加上权限: android.permission.KILL_BACKGROUND_PROCESSES
想起了一句词:竟无语凝噎!!
不过奇怪的是,既然Activity被强制退出了,为何Stack里面还能有Activity? 更奇怪的是我在C里面调用了AppExit,却只kill掉了A,有没有高手给指点下?会不会跟Stack有关系?
后面找到了另外一种用AndroidManager来退出应用的办法:
/** * 退出应用程序 */public void AppExit(Context context){ try{ finishAllActivity(); ActivityManager activityMgr = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); activityMgr.restartPackage(context.getPackageName()); }catch (Exception e){ }}
直接用ActivityManager来退出,这个基本没问题了,但是该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限android.permission.RESTART_PACKAGES,也要看情况综合使用。
然后用我自己的笨办法:
public class AppManager { private static List<Activity> activityStack; private static AppManager instance; private AppManager(){ } /** * 单例模式 */ public static AppManager getAppManager(){ if(instance==null){ instance = new AppManager(); } return instance; } /** * 添加Activity到堆栈 */ public void addActivityStack(Activity activity){ if(activityStack==null){ activityStack= new ArrayList<Activity>(); } activityStack.add(activity); } /** * 结束所有activity */ public void finishAllActivity(){ for(int i=0;i<activityStack.size();i++){ if(null != activityStack.get(i) && !activityStack.get(i).isFinishing()){ activityStack.get(i).finish(); } } activityStack.clear(); } /** * 退出应用程序 */ public void AppExit(Context context){ try{ finishAllActivity(); }catch (Exception e){ } }}
直接用List来管理,我不知道会不会有什么漏洞,但是如果仅仅是用来退出应用应该是没啥的问题的
附上测试工程:http://download.csdn.net/detail/hj563308597/9404002
更多相关文章
- 【Android】Android中Button的OnClickListener实现方法
- Android webview中定制js的alert,confirm和prompt对话框的方法 (
- Android 性能优化的一些方法(转)
- 消除“Unfortunately, System UI has stopped”的方法
- android 调用系统相机或者系统相册功能时,onActivityResult方法不
- andorid中Html.fromHtml方法