在我们接手一个新项目,或者是拿到一份android程序源码的时候,要快速找到需要的代码,该从何下手呢?当然是从看得见的部分——Activity和Fragment下手。如果app的每个功能页面,你都能知道是在哪个Activity或者Fragment中,那就能快速的找到相关的代码了。这就是今天要介绍的获取当前Activity及Fragment名字的技巧。由于Activity和Fragment的情况十分相似,下面主要以Activity为例。
一、项目已有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
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
三、补充
- 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,这个还没试验过,不知是否可行;如果可行的话,就可以克服上面所提到的缺点了。