在做项目的时候会碰到应用无法完全退出的问题,网上搜索了一下,比较流行的是将每个activity加到一个栈里面,退出的时候清空这个栈。下面给出一个完整的类,包含相应的方法,需要用的时候直接调用即可。
在每个activity内实例化一个对象,然后通过addActivity()方法 将每个activity压入到栈内。在需要退出的时候调用exit()方法
大家需要用的时候可以直接拷贝以下代码,修改一下类名即可
比如我要将activity入栈只需要MyApplication.getInstance().addActivity(activity)
退出直接调用MyApplication.getInstance().exit()或其他方法
public class MyApplication extends Application { public List<Fragment> mGetGoldCoinsFragments; public long mLoginTime; private static MyApplication instance; private static final String tag = "myApplication"; private static Context appContext; // 判断Home Activity是否为Stop状态 private final List<Activity> activityList = new LinkedList<Activity>(); private long mExitTime; public static MyApplication getInstance() { if (null == instance) { instance = new MyApplication(); } return instance; } /** * 添加Activity到容器中 * * @param activity */ public void addActivity(Activity activity) { activityList.add(activity); } /** * 遍历所有的Activity并finish * * @param isDirectExit * isDirectExit 是否直接退出 */ public void exit(boolean isDirectExit) { if ((System.currentTimeMillis() - mExitTime) > 2000) { Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); mExitTime = System.currentTimeMillis(); } else { if (isDirectExit) { // 退出其它应用 for (Activity activity : activityList) { Log.i(tag, "activity.getPackageName(): " + activity.getPackageName()); if (!(activity.isFinishing())) { activity.finish(); } } activityList.clear(); // 停止日志服务 Log.d(tag, "stopping log srvice"); // 判断sdk版本 int sdkVersion = Integer.parseInt(VERSION.SDK); if (sdkVersion >= 8) { android.os.Process.killProcess(android.os.Process.myPid()); } else { ActivityManager activityMgr = (ActivityManager) this .getSystemService(ACTIVITY_SERVICE); activityMgr.restartPackage(getPackageName()); } // 跳转到桌面 Intent intent = new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); System.exit(0); } else { exit(); } } } /** * 遍历所有的Activity并finish */ public void exit() { if ((System.currentTimeMillis() - mExitTime) > 2000) { Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show(); mExitTime = System.currentTimeMillis(); } else { // 退出其它应用 for (Activity activity : activityList) { Log.i(tag, "activity.getPackageName(): " + activity.getClassLoader().getClass().getName()); // if (!(activity.isFinishing())) { activity.finish(); // } } activityList.clear(); // 停止日志服务 Log.d(tag, "stopping log srvice"); // 判断sdk版本 int sdkVersion = Integer.parseInt(VERSION.SDK); if (sdkVersion >= 8) { android.os.Process.killProcess(android.os.Process.myPid()); } else { ActivityManager activityMgr = (ActivityManager) this .getSystemService(ACTIVITY_SERVICE); activityMgr.restartPackage(getPackageName()); } // 跳转到桌面 Intent intent = new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); System.exit(0); } } /** * 返回桌面 */ public void backToHome() { // 跳转到桌面 Intent intent = new Intent(Intent.ACTION_MAIN); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addCategory(Intent.CATEGORY_HOME); startActivity(intent); } /** * 从容器中删除Activity * * @param activity */ public void removeActivity(Activity activity) { activityList.remove(activity); } /** * 清除所有Activity */ public void removeAllActivity() { // 退出其它应用 for (Activity activity : activityList) { Log.i(tag, "activity.getPackageName(): " + activity.getClassLoader().getClass().getName()); // if (!(activity.isFinishing())) { activity.finish(); // } } activityList.clear(); } /** * 判断容器中是否存在这个Activity * * @param activity * @return */ public boolean isActivityContain(Activity activity) { return activityList.contains(activity); } @Override public void onCreate() { super.onCreate(); appContext = getApplicationContext(); } }
Android 完全退出应用
时间: 2024-10-29 02:44:01