需求: 点击手机桌面的应用,然后获取应用的应用名.
(1)手机上点击应用的快捷图标,启动应用.
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
(2)应用启动时,都会经过一下代码
private int startActivityAsUser(IApplicationThread caller, String callingPackage,
@Nullable String callingFeatureId, Intent intent, String resolvedType,
IBinder resultTo, String resultWho, int requestCode, int startFlags,
ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
assertPackageMatchesCallingUid(callingPackage);
enforceNotIsolatedCaller("startActivityAsUser");
userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
// TODO: Switch to user app stacks here.
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setCallingFeatureId(callingFeatureId)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setUserId(userId)
.execute();
}
(3)所以,可以在该函数内,获取待启动应用的包名,然后调用getAppLabel()就可以获得待启动的应用的应用名称.
private int startActivityAsUser(IApplicationThread caller, String callingPackage,
@Nullable String callingFeatureId, Intent intent, String resolvedType,
IBinder resultTo, String resultWho, int requestCode, int startFlags,
ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
//add by zc
//通过intent参数,获取包名
String packageName=intent.getComponent().getPackageName();
//把获取到的packageName作为参数,获取待启动的应用的应用名称
String appName=getAppLabel(packageName);
Log.d(TAG,"应用名称为:appName="+appName);
//end by zc
assertPackageMatchesCallingUid(callingPackage);
enforceNotIsolatedCaller("startActivityAsUser");
userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
// TODO: Switch to user app stacks here.
return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
.setCaller(caller)
.setCallingPackage(callingPackage)
.setCallingFeatureId(callingFeatureId)
.setResolvedType(resolvedType)
.setResultTo(resultTo)
.setResultWho(resultWho)
.setRequestCode(requestCode)
.setStartFlags(startFlags)
.setProfilerInfo(profilerInfo)
.setActivityOptions(bOptions)
.setUserId(userId)
.execute();
}
(4)下面是通过包名获取应用名称的方法.
private String getAppLabel(String packageName){
try{
PackageManager pm=mContext.getPackageManager();
PackageInfo info=pm.getPackageInfo(packageName,PackageManager.GET_ACTIVITIES);
return info.applicationInfo.loadLabel(pm).toString();
}catch (Exception e){
e.printStackTrace();
}
return " ";
}
(5) 运行结果为: