安卓通过Application获取当前Activity的实例(程序中不推荐保存Activity的实例)

在大型安卓项目中,当Module需与App交互并弹出全局dialog时,通常面临获取当前显示Activity实例的挑战。文章介绍了通过Application获取Activity实例的技巧,但警告这种方法可能导致性能下降和内存泄漏。建议采用弹出全局Activity并设定为对话框样式来避免问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值