Android 获取所有Activity,这里演示了用户按两次back键退出app
2017-12-01 09:01
796 查看
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { exit(); return true; } return super.onKeyDown(keyCode, event); } private void exit() { Log.d(TAG, "exit: "+(System.currentTimeMillis() - clickTime)); if ((System.currentTimeMillis() - clickTime) > 2000) { Toast.makeText(getApplicationContext(), "再按一次后退键退出程序", Toast.LENGTH_SHORT).show(); clickTime = System.currentTimeMillis(); } else { Log.e(TAG, "exit application"); AppData.setloginUser(this,""); // this.finish(); List<Activity> la = getActivitiesByApplication(getApplication()); for (int x=0;x<la.size();x++){ la.get(x).finish(); } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); } } private static List<Activity> getActivitiesByApplication(Application application) { List<Activity> list = new ArrayList<>(); try { Class<Application> applicationClass = Application.class; Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk"); mLoadedApkField.setAccessible(true); Object mLoadedApk = mLoadedApkField.get(application); Class<?> mLoadedApkClass = mLoadedApk.getClass(); Field mActivityThreadField = mLoadedApkClass.getDeclaredField("mActivityThread"); mActivityThreadField.setAccessible(true); Object mActivityThread = mActivityThreadField.get(mLoadedApk); Class<?> mActivityThreadClass = mActivityThread.getClass(); Field mActivitiesField = mActivityThreadClass.getDeclaredField("mActivities"); mActivitiesField.setAccessible(true); Object mActivities = mActivitiesField.get(mActivityThread); // 注意这里一定写成Map,低版本这里用的是HashMap,高版本用的是ArrayMap if (mActivities instanceof Map) { @SuppressWarnings("unchecked") Map<Object, Object> arrayMap = (Map<Object, Object>) mActivities; for (Map.Entry<Object, Object> entry : arrayMap.entrySet()) { Object value = entry.getValue(); Class<?> activityClientRecordClass = value.getClass(); Field activityField = activityClientRecordClass.getDeclaredField("activity"); activityField.setAccessible(true); Object o = activityField.get(value); list.add((Activity) o); } } } catch (Exception e) { e.printStackTrace(); list = null; } return list; }
相关文章推荐
- Android例子—关闭所有Activity_完全退出App的方法
- unity在android显示界面(UnityPlayerActivity)不重复加载且app退出杀掉所有界面的两种方法
- Android 小技巧: 这里涵盖了所有实现 “一键退出 App” 的方法
- Android用户点击返回按钮两次退出整个APP
- 如何获取一个Android App APK的所有Activity类名?
- Android简单实现连点两次Back键退出App
- Android实现点击两次back退出APP
- android 完全退出app,退出所有activity
- Android 如何在一个app中随时退出所有活动,不用一直按back
- Android开发之点击两次Back键退出App
- Android用户点击返回按钮两次退出整个APP
- android 点击两次back 键退出app
- android 连按两次Back键退出 (单Activity多Fragment,保留根Fragment)
- Android小技巧: 这里涵盖了所有实现 “一键退出 App” 的方法
- back 键两次退出app
- android TabActivity 重写dispatchKeyEvent方法 按返回键back 执行两次的解决方法
- Android连续点击两次Back键退出程序
- 如何获取android app的Activity
- Android--关闭所有Activity、退出…
- Android开发---按两次Back键退出