Android獲取第三方程式的包名
阿新 • • 發佈:2019-01-29
前言
有時我們需要在自己的程式調起第三方程式,這個時候我們就需要知道第三方程式的包名和入口介面的Activity。
下面我們介紹幾種方式獲取第三方程式的包名及程式入口Activity。
1.使用adb指令獲取
配置了adb指令環境後,手機開啟除錯模式連線電腦(虛擬機器也行)直接在命令列中輸入如下指令:
adb shell dumpsys activity activities
命令列會輸出當前執行的Activity的所有資訊,我們只需要關注如下圖標註的mFocusedActivity資訊即可。
第一個圈是包名,第二個就是當前的Activity名。
2.PackageManager
ResolveInfo類的部分方法
- 獲取圖示:resolveInfo.activityInfo.loadIcon(packageManager)
- 獲取包名:resolveInfo.activityInfo.packageName
- 獲取程式入口activity:resolveInfo.activityInfo.name
程式碼
/**
* Created by Derek on 2017/3/31 0031.
* 根據應用程式的名稱獲取對應的資訊
*
* @param context
* @param appLabel 程式的名稱
* @return
*/
public ResolveInfo findInstallAppDetails(Context context, String appLabel) {
PackageManager packageManager = context.getPackageManager();
//匹配程式的入口
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
//查詢
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0);
for (int i = 0; i < resolveInfos.size(); i++) {
String appName = resolveInfos.get(i).loadLabel(packageManager).toString();
if (appLabel.equals(appName)) {
return resolveInfos.get(i);
}
}
return null;
}
ActivityManager
核心程式碼
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(); //包名
因為ActivityManager獲取的是topActivity的資訊,所以為了獲取第三方應用的包名,我們需要在Service中執行這段程式碼,然後開啟第三方應用,在控制檯輸出第三方應用的資訊。
為了及時獲取最新的Activity,我們需要使用子執行緒不斷重新整理。
Service
public class SoftService extends Service {
private ActivityManager activityManager = null;
private Handler handler = new Handler();
private String activityName = null;
private Runnable runnable = new Runnable() {
@Override
public void run() {
List<ActivityManager.RunningTaskInfo> runningTaskInfo = activityManager.getRunningTasks(1);
activityName = (runningTaskInfo.get(0).topActivity).toString();
Log.i("ActivityManager: ", "當前activity是---->" + activityName);
handler.postDelayed(runnable, 5000);//每5秒重新整理一次
}
};
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handler.post(runnable);//開啟子執行緒
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
super.onCreate();
activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onDestroy() {
handler.removeCallbacks(runnable);
}
}