在应用开发过程中,我们经常遇到在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>