您的位置:首页 > 移动开发

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: