1. 程式人生 > >Android Tip : Android 獲取當前Activity物件的方式:

Android Tip : Android 獲取當前Activity物件的方式:

【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; }