【Android Tip】
Android 获取当前Activity对象的方式:
背景:(当你不能使用this获取Activity对象)如何方便地当前Activity对象
思路:
1.维护一个Activity的対象栈,在每个Activity的生命手气方法执行的时候,控制add和remove,栈顶元素就是当前的Activity对象。为了代码的复用,这个操作可以
写在BaseActivity中,这个思路很正常。代码就不贴了。
2.使用反射来获取当前Activity对象。(个人认为是相对优雅和解耦的方式)
查看源码发现 Activity Thread 这个类管理着所有的Activity对象,也就持有所有的Activity对象,使用反射获得当前ActivityThread对象
,然后就能拿到当前的Activity对象
示例:
public static Activity getCurrentActivity () {
Class activityThreadClass = Class.forName("android.app.ActivityThread");
Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
activitiesField.setAccessible(true);
Map activities = (Map) activitiesField.get(activityThread);
for (Object activityRecord : activities.values()) {
Class activityRecordClass = activityRecord.getClass();
Field pausedField = activityRecordClass.getDeclaredField("paused");
pausedField.setAccessible(true);
if (!pausedField.getBoolean(activityRecord)) {
Field activityField = activityRecordClass.getDeclaredField("activity");
activityField.setAccessible(true);
Activity activity = (Activity) activityField.get(activityRecord);
return activity;
}
}
return null;
}
思路来自: stackoverflow