获取当前Activity及Fragment名字

在我们接手一个新项目,或者是拿到一份android程序源码的时候,要快速找到需要的代码,该从何下手呢?当然是从看得见的部分——Activity和Fragment下手。如果app的每个功能页面,你都能知道是在哪个Activity或者Fragment中,那就能快速的找到相关的代码了。这就是今天要介绍的获取当前Activity及Fragment名字的技巧。由于Activity和Fragment的情况十分相似,下面主要以Activity为例。


一、项目已有BaseActivity

什么是BaseActivity呢?从它的名字(当然了,名字不是固定的)可以看出,它就是一个基本的Activity,作为其他Activity的父类,用于定义一些基本变量及实现一些基础的功能。所以只要在该BaseActivity的onResume方法加入Log或者Toast表明当前Activity即可:
    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "This is " + getClass().getSimpleName());
        Toast.makeText(this, "This is " + getClass().getSimpleName(), Toast.LENGTH_SHORT).show();
    }


二、项目中没有BaseActivity

如果项目中原本没有BaseActivity该怎么办呢?没有就自己建一个咯!新建一个BaseActivity如下:
public class BaseActivity extends Activity {

    protected final String TAG = "BaseActivity";

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "This is " + getClass().getSimpleName());
        Toast.makeText(this, "This is " + getClass().getSimpleName(), Toast.LENGTH_SHORT).show();
    }
}
但是光建好了BaseActivity还不行,还要让我们程序里的Activity都继承于它才行,这里我们利用IDE的替换功能来实现。

1.使用Android Studio

对着目录结构的java(在src-main下)右键,选择“replace in path”,如下图所示:

查找“extends Activity”,替换为“extends BaseActivity”,然后确定。这时会弹出对话框,选择Review:

我们发现,BaseActivity里面的“extends Activity”也被查找到了,这显然不是我们要的,对上图中的BaseActivity右键-Exclude;然后选择Replace All,这样就大功告成了!

2.使用Eclipse

好久没用Eclipse了,有空试一下再补上吧。。。

三、补充

  • getClass().getSimpleName()可以改为getClass().getName(),这样会连Activity的包名一块输出,这在工程里有同名的Activity时比较有用。
  • 也许你会有疑问:如果子类没有调用父类的super.onResume(),是否就不会执行BaseActivity中的函数了?其实不用担心,因为Activity子类的onResume(),必须调用super.onResume(),否则运行时会报错:E/AndroidRuntime:  Caused by: android.util.SuperNotCalledException: Activity {com.lzm.getcurrentactivity/com.lzm.getcurrentactivity.MainActivity} did not call through to super.onResume()。由此我们可以反过来推断出,程序中原本继承于Activity的所有Activity都调用了父类的super.onResume(),所以改为继承于BaseActivity后,自然也会执行其中的函数了。


四、缺点

对于不是直接继承于Activity的(如FragmentActivity)的类无效;但自己写的类除外,比如我们的程序里面写了一个DrawerActivity,该Activity继承于BaseActivity;然后我们有个HomeActivity继承于DrawerActivity,那么HomeActivity也是可以正确获取到的,因为它还是间接继承于BaseActivity。

虽然有这样的缺点,不过一般来说还是够用了,毕竟我们大部分的Activity都是继承于原生的Activity的,所以少数几个无法获取名字也没太大关系了。


五、拓展

利用悬浮按钮或者通知栏,直接获取当前的Activity,这个还没试验过,不知是否可行;如果可行的话,就可以克服上面所提到的缺点了。可能用到的方法参考如下博客: 获得当前正在显示的activity的类名

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值