1 way one
public void getAllActivity() {
PackageManager packageManager = getPackageManager();
PackageInfo packageInfo = null;
try {
packageInfo = packageManager.getPackageInfo(
getPackageName(), PackageManager.GET_ACTIVITIES);
ActivityInfo[] activities = packageInfo.activities;
for (ActivityInfo activity :activities ) {
Class<?> aClass = Class.forName(activity.name);
}
} catch (PackageManager.NameNotFoundException | ClassNotFoundException e) {
e.printStackTrace();
}
}
2 way 2 reflection
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);
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;
}
3 Get the Activity at the top of the stack
public static String getTopActivityNameAndProcessName(Context context) {
String processName = null;
String topActivityName = null;
ActivityManager activityManager =
(ActivityManager) (context.getSystemService(android.content.Context.ACTIVITY_SERVICE));
List<ActivityManager.RunningTaskInfo> runningTaskInfos = activityManager.getRunningTasks(1);
if (runningTaskInfos != null) {
ActivityManager.RunningTaskInfo runningTaskInfo = runningTaskInfos.get(0);
ComponentName f = runningTaskInfo.topActivity;
String topActivityClassName = f.getClassName();
String temp[] = topActivityClassName.split("\\.");
topActivityName = temp[temp.length - 1];
int index = topActivityClassName.lastIndexOf(".");
processName = topActivityClassName.substring(0, index);
System.out.println("---->topActivityName=" + topActivityName + ",processName=" + processName);
}
return topActivityName;
}