在 Android 开发中,动态获取当前 Activity 的类名是常见需求,无论是做页面路由校验、异常日志上报还是用户行为埋点,都需要准确拿到当前 Activity 的类信息。

在 Activity 内部直接获取
如果当前代码运行在 Activity 的上下文中,获取类名的方式最为简单,直接调用 Activity 自身的 getClass 方法即可。
// 在 Activity 内部调用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取当前 Activity 的类名
String className = this.getClass().getName();
// 如果需要获取简单类名(不带包名)
String simpleName = this.getClass().getSimpleName();
System.out.println("当前Activity类名:" + className);
System.out.println("当前Activity简单类名:" + simpleName);
}
}
通过 Application 全局监听获取
如果需要在应用全局范围内获取当前显示的 Activity 类名,比如在工具类中、非 Activity 组件中调用,可以通过注册 Application 的 Activity 生命周期回调来实现。
实现步骤
- 自定义 Application 类,实现 ActivityLifecycleCallbacks 接口
- 在回调中记录当前处于 onResume 状态的 Activity
- 提供对外方法获取记录的类名
public class MyApplication extends Application {
// 记录当前栈顶Activity
private Activity currentActivity;
@Override
public void onCreate() {
super.onCreate();
// 注册Activity生命周期监听
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityResumed(Activity activity) {
// Activity进入前台时更新记录
currentActivity = activity;
}
@Override
public void onActivityPaused(Activity activity) {
// 可选:如果只记录前台Activity,这里可以不做处理
}
// 其他生命周期回调方法空实现即可
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
@Override
public void onActivityStarted(Activity activity) {}
@Override
public void onActivityStopped(Activity activity) {}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
@Override
public void onActivityDestroyed(Activity activity) {
// 如果销毁的是当前记录的Activity,清空记录
if (currentActivity == activity) {
currentActivity = null;
}
}
});
}
// 对外提供获取当前Activity类名的方法
public String getCurrentActivityClassName() {
if (currentActivity != null) {
return currentActivity.getClass().getName();
}
return null;
}
// 获取简单类名的方法
public String getCurrentActivitySimpleName() {
if (currentActivity != null) {
return currentActivity.getClass().getSimpleName();
}
return null;
}
}
使用时需要在 AndroidManifest.xml 中配置自定义的 Application:
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
通过 ActivityManager 获取栈顶 Activity 类名
还可以通过系统的 ActivityManager 服务获取任务栈中的栈顶 Activity 信息,这种方式不需要自定义 Application,但是需要注意权限和系统版本限制。
public String getTopActivityClassName(Context context) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if (activityManager == null) {
return null;
}
// 获取正在运行的任务栈,最多获取1个
List<ActivityManager.RunningTaskInfo> taskInfoList = activityManager.getRunningTasks(1);
if (taskInfoList != null && !taskInfoList.isEmpty()) {
ActivityManager.RunningTaskInfo taskInfo = taskInfoList.get(0);
// 获取栈顶Activity的类名
return taskInfo.topActivity.getClassName();
}
return null;
}
注意:这种方式在 Android 5.0 及以上系统中,普通应用可能无法获取到准确的任务栈信息,而且需要声明 <uses-permission android:name="android.permission.GET_TASKS" /> 权限,因此不推荐作为首选方案。
不同方式对比
| 获取方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Activity 内部直接获取 | 仅在 Activity 内部使用 | 实现简单,无需额外配置 | 只能在 Activity 上下文使用,无法全局调用 |
| Application 生命周期监听 | 全局任意位置获取 | 兼容性好,不受系统版本限制 | 需要自定义 Application,实现稍复杂 |
| ActivityManager 获取 | 临时获取栈顶信息 | 无需自定义 Application | 高版本系统限制多,需要权限,兼容性差 |
注意事项
- 获取类名时,getName 方法返回的是包含完整包名的类名,getSimpleName 返回的是不包含包名的类名,按需选择即可
- 使用 Application 监听方式时,要注意 Activity 销毁时的引用清理,避免内存泄漏
- 不要在 Activity 的 onDestroy 方法中尝试获取当前 Activity 类名,此时 Activity 已经进入销毁流程,结果可能不准确