Android 获取所有Activity,这里演示了用户按两次back键退出app

来源:互联网 发布:怎么进windows pe 编辑:程序博客网 时间:2024/06/06 19:41
    @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;    }
原创粉丝点击