获取当前活动的activity

获取Android前台Activity
打印出来的结果就是包路径加类名
代码:

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

List<RunningTaskInfo> runningTasks = am.getRunningTasks(1);

RunningTaskInfo rti = runningTasks.get(0);
ComponentName component = rti.topActivity;

Log.i("tracy", component.getClassName());


记得要加个权限:
<uses-permission android:name="android.permission.GET_TASKS"></uses-permission>
Android 开发中,获取当前正在运行的 `Activity` 实例是一个常见的需求,尤其是在需要访问当前界面状态或执行与界面相关的操作时。以下是几种常用的方法: ### 1. 使用全局管理类保存当前 `Activity` 实例 可以通过一个全局的管理类来保存当前的 `Activity` 实例。这种方法利用了 `WeakReference` 来避免内存泄漏,确保 `Activity` 在不需要时可以被垃圾回收器回收。 ```java import android.app.Activity; import java.lang.ref.WeakReference; 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 && sCurrentActivityWeakRef.get() != null) { currentActivity = sCurrentActivityWeakRef.get(); } return currentActivity; } public void setCurrentActivity(Activity activity) { sCurrentActivityWeakRef = new WeakReference<>(activity); } } ``` 在每个 `Activity` 的 `onResume` 方法中调用 `MyActivityManager.getInstance().setCurrentActivity(this)`,并在 `onPause` 方法中调用 `MyActivityManager.getInstance().setCurrentActivity(null)`,这样可以确保始终持有当前的 `Activity` 实例[^1]。 ### 2. 使用 `ActivityLifecycleCallbacks` 监听生命周期 通过注册 `ActivityLifecycleCallbacks`,可以在应用的生命周期中跟踪每个 `Activity` 的创建和销毁过程,从而获取当前的 `Activity` 实例。 ```java import android.app.Activity; import android.app.Application; import android.os.Bundle; public class MyApplication extends Application { private Activity currentActivity; @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { currentActivity = activity; } @Override public void onActivityPaused(Activity activity) { if (currentActivity == activity) { currentActivity = null; } } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } }); } public Activity getCurrentActivity() { return currentActivity; } } ``` 这种方法的优势在于它可以自动跟踪所有 `Activity` 的生命周期变化,而不需要手动在每个 `Activity` 中进行设置[^2]。 ### 3. 使用 `ActivityStack` 管理 `Activity` 可以手写一个 `Activity` 管理栈,使用 `Stack` 或 `List` 存储已经执行了 `onCreate` 或 `onResume` 方法的 `Activity`,并在 `onPause` 或 `onDestroy` 中移除它们。 ```java import android.app.Activity; import java.util.Stack; public class ActivityStack { private static Stack<Activity> activityStack = new Stack<>(); public static void addActivity(Activity activity) { activityStack.add(activity); } public static void removeActivity(Activity activity) { activityStack.remove(activity); } public static Activity getCurrentActivity() { if (!activityStack.isEmpty()) { return activityStack.peek(); } else { return null; } } } ``` 在每个 `Activity` 的 `onCreate` 方法中调用 `ActivityStack.addActivity(this)`,并在 `onDestroy` 方法中调用 `ActivityStack.removeActivity(this)`,这样可以确保始终获取到最新的 `Activity` 实例[^3]。 ### 4. 使用 `Instrumentation` 获取当前 `Activity`(适用于测试) 在测试环境中,可以使用 `Instrumentation` 类来获取当前的 `Activity` 实例。 ```java import android.app.Instrumentation; import android.os.Bundle; public class MyTest extends InstrumentationTestCase { public void testGetCurrentActivity() throws Exception { Instrumentation instrumentation = getInstrumentation(); Activity currentActivity = instrumentation.waitForIdleSync(); assertNotNull(currentActivity); } } ``` 这种方法主要用于单元测试,不适合在生产代码中使用。 ### 总结 以上方法各有优劣,选择合适的方法取决于具体的应用场景和需求。对于大多数应用来说,使用全局管理类或 `ActivityLifecycleCallbacks` 是较为推荐的方式,因为它们可以有效地管理 `Activity` 的生命周期并避免内存泄漏问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值