Android中获取当前的Activity

本文介绍如何使用ActivityManager获取当前正在运行的任务及最顶层的Activity,通过调用getRunningTasks方法并传入特定参数,可以得到当前显示给用户的Activity实例。

ActivityManager里面可以获取到当前运行的所有任务,所有进程和所有服务,这是任务管理器的核心。

        仔细看getRunningTasks的文档,里面说获取的是系统中"running"的所有task,"running"状态包括已经被系统冻结的task。而且返回的这个列表是按照顺序排列的,也就是说第一个肯定比第二个后运行。
        getRunningTasks有个整型参数,表示返回列表的最大个数。那么,我们如果把1作为参数给进去,那么他返回的task就是当前运行的那个task,然后从task中获取到最顶层的activity,这个activity就是当前显示给用户的那个activity了。


代码实现:

  1. ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
  2. ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
  3. Log.d("", "pkg:"+cn.getPackageName());
  4. Log.d("", "cls:"+cn.getClassName());

AndroidActivity 里,直接用 `getWidth()` 这类方法往往不能获取到 View 的宽度,像在 `onCreate`、`onStart`、`onResume` 这些生命周期方法中获取宽度,结果通常是 0。这是由于 View 的 measure 过程和 Activity 的生命周期并非同步执行,无法保证在这些方法执行时 View 已完成测量 [^1][^2][^3][^4]。 下面有几种可行的获取当前 Activity 中 View 宽度的方法: ### 重写 View 的 `onSizeChanged` 方法 在自定义 View 时重写 `onSizeChanged` 方法,当 View 的大小改变时会触发此方法,在这里可以获取到 View 的宽度。 ```java public class CustomView extends View { public CustomView(Context context) { super(context); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); int width = w; // 这里可以使用获取到的宽度 } } ``` ### 使用 `ViewTreeObserver` 通过 `ViewTreeObserver` 的 `addOnGlobalLayoutListener` 监听 View 树的全局布局变化,当布局完成后获取 View 的宽度。 ```java View view = findViewById(R.id.your_view_id); ViewTreeObserver viewTreeObserver = view.getViewTreeObserver(); viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { view.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { view.getViewTreeObserver().removeGlobalOnLayoutListener(this); } int width = view.getWidth(); // 这里可以使用获取到的宽度 } }); ``` ### 利用 `post` 方法 使用 `post` 方法将获取宽度的操作放到消息队列的末尾,确保在 View 测量完成后执行。 ```java View view = findViewById(R.id.your_view_id); view.post(new Runnable() { @Override public void run() { int width = view.getWidth(); // 这里可以使用获取到的宽度 } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值