Android Tip : Android 獲取當前Activity物件的方式:
阿新 • • 發佈:2019-01-06
【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;
}