在Android,即Lollipop(api level 21)之前, 使用如下代码来获得当前运行的app,即所谓的top Activity:
<uses-permission android:name="android.permission.GET_TASKS" />
private String getRunningActivityName(){
ActivityManager activityManager=(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
String runningActivity=activityManager.getRunningTasks(1).get(0).topActivity.getClassName();
return runningActivity;
}
其中 获取包名、完整类名、类名可以这样做:
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
RunningTaskInfo info = manager.getRunningTasks(1).get(0);
String shortClassName = info.topActivity.getShortClassName(); //类名
String className = info.topActivity.getClassName(); //完整类名
String packageName = info.topActivity.getPackageName(); //包名
场景:收到消息根据不同activity添加不同的标签做区别,对应的最顶层即前台处理来处理。
就是getShortClassName()不起效,或者说不是想要的activity所在的类de名,查看了源码才知道:
/**
* Return the class name, either fully qualified or in a shortened form
* (with a leading '.') if it is a suffix of the package.
*/
public String getShortClassName() {
if (mClass.startsWith(mPackage)) {
int PN = mPackage.length();
int CN = mClass.length();
if (CN > PN && mClass.charAt(PN) == '.') {
return mClass.substring(PN, CN);
}
}
return mClass;
}
其中mPackage是包名,mClass是完整的类名,根据源码可以看出来是从完整中截取不是包名的部分如果开始不是 包名,那就返回完整路径(因为 Eclipse 项目没有 application id的概念 application id等同于 包名,但是 Android Studio 是可以不同的)
所以 最后改进的 方法为参考getClass().getSimpleName()
String simpleName = getName();
final int dot = simpleName.lastIndexOf(".");
if (dot > 0) {
return simpleName.substring(simpleName.lastIndexOf(".")+1); // strip the package name
}
0
if (runningTaskInfos != null) {
String ClassName = (runningTaskInfos.get(0).topActivity).getClassName();
//找到最后一个 '.'的位置来截取返回
int p = ClassName.lastIndexOf('.');
String ShortClassName= ClassName.substring(p+1, ClassName.length());
return ShortClassName;
}