安卓通過Application獲取當前Activity的例項(程式中不推薦儲存Activity的例項)
阿新 • • 發佈:2019-02-03
在應用開發過程中,我們經常遇到在Module與App的互動,如果在Module裡收到一條訊息或指令,需要App程式中彈出全域性的dialog,往往通過廣播的方式,交由App中當前顯示的Activity來實現,但是專案過大,尤其對於程式碼量龐大,人員混雜的專案,沒有一個BaseActivity,無法獲取到當前的Activity,實現就比較困難,通過網上學習,找到了一種獲取Activity物件的例項的方法,程式碼如下
在Application類中, 實現Application.ActivityLifecycleCallbacks介面,呼叫registerActivityLifecycleCallbacks(this);方法,在如下程式碼中,將當前的Activity加入到manager中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); } }
@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>