在我们接手一个新项目,或者是拿到一份android程序源码的时候,要快速找到需要的代码,该从何下手呢?当然是从看得见的部分——Activity和Fragment下手。如果app的每个功能页面,你都能知道是在哪个Activity或者Fragment中,那就能快速的找到相关的代码了。这就是今天要介绍的获取当前Activity及Fragment名字的技巧。由于Activity和Fragment的情况十分相似,下面主要以Activity为例。
一、项目已有BaseActivity
什么是BaseActivity呢?从它的名字(当然了,名字不是固定的)可以看出,它就是一个基本的Activity,作为其他Activity的父类,用于定义一些基本变量及实现一些基础的功能。所以只要在该BaseActivity的onResume方法加入Log或者Toast表明当前Activity即可:
二、项目中没有BaseActivity
如果项目中原本没有BaseActivity该怎么办呢?没有就自己建一个咯!新建一个BaseActivity如下:
但是光建好了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的,所以少数几个无法获取名字也没太大关系了。