在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;
}