1. 程式人生 > >安卓通過Application獲取當前Activity的例項(程式中不推薦儲存Activity的例項)

安卓通過Application獲取當前Activity的例項(程式中不推薦儲存Activity的例項)

在應用開發過程中,我們經常遇到在Module與App的互動,如果在Module裡收到一條訊息或指令,需要App程式中彈出全域性的dialog,往往通過廣播的方式,交由App中當前顯示的Activity來實現,但是專案過大,尤其對於程式碼量龐大,人員混雜的專案,沒有一個BaseActivity,無法獲取到當前的Activity,實現就比較困難,通過網上學習,找到了一種獲取Activity物件的例項的方法,程式碼如下


import android.app.Activity;

import java.lang.ref.WeakReference;

/**
 * 獲取當前顯示的Activity
 * Created by linfeifei on 2017/12/29.
 */

public class MyActivityManager {

    private static MyActivityManager sInstance = new MyActivityManager();
    private WeakReference<Activity> sCurrentActivityWeakRef;


    private MyActivityManager() {

    }

    public static MyActivityManager getInstance() {
        return sInstance;
    }

    public Activity getCurrentActivity() {
        Activity currentActivity = null;
        if (sCurrentActivityWeakRef != null) {
            currentActivity = sCurrentActivityWeakRef.get();
        }
        return currentActivity;
    }

    public void setCurrentActivity(Activity activity) {
        sCurrentActivityWeakRef = new WeakReference<>(activity);
    }


}
在Application類中, 實現Application.ActivityLifecycleCallbacks介面,呼叫registerActivityLifecycleCallbacks(this);方法,在如下程式碼中,將當前的Activity加入到manager中
@Override
	public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

	}

	@Override
	public void onActivityStarted(Activity activity) {

	}

	@Override
	public void onActivityResumed(Activity activity) {
		MyActivityManager.getInstance().setCurrentActivity(activity);
	}

	@Override
	public void onActivityPaused(Activity activity) {

	}

	@Override
	public void onActivityStopped(Activity activity) {

	}

	@Override
	public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

	}

	@Override
	public void onActivityDestroyed(Activity activity) {

	}

這樣獲取Activity的例項就可以通過Activity activity1  = MyActivityManager.getInstance().getCurrentActivity();來實現

---------------------------------------------------------------------------------分割線---------------------------------------------------------------------------------------------------------------------

重點來了,上面的程式碼可能適合快速開發,實現功能測試,但是儲存當前的Activity例項,會嚴重影響程式效能,並且導致記憶體洩漏!!!

同樣的需求,可以通過彈出一個全域性的Activity來實現,雖然同樣需要彈出對話方塊,我們可以在Activity裡將佈局繪製為對話方塊的樣式來實現,需要將彈出頁面設定到程式最上層,並且透明,可以增加style來實現

<style name="test_title" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <!-- 邊框 -->
        <item name="android:windowIsFloating">false</item>
        <!-- 是否浮現在activity之上 -->
        <item name="android:windowIsTranslucent">true</item>

        <item name="android:windowBackground">@android:color/transparent</item>
 </style>