1. 程式人生 > >Android獲取第三方程式的包名

Android獲取第三方程式的包名

前言

有時我們需要在自己的程式調起第三方程式,這個時候我們就需要知道第三方程式的包名和入口介面的Activity。
下面我們介紹幾種方式獲取第三方程式的包名及程式入口Activity。

1.使用adb指令獲取

配置了adb指令環境後,手機開啟除錯模式連線電腦(虛擬機器也行)直接在命令列中輸入如下指令:

adb shell dumpsys activity activities 

命令列會輸出當前執行的Activity的所有資訊,我們只需要關注如下圖標註的mFocusedActivity資訊即可。
第一個圈是包名,第二個就是當前的Activity名。

這裡寫圖片描述

2.PackageManager

ResolveInfo類的部分方法

  1. 獲取圖示:resolveInfo.activityInfo.loadIcon(packageManager)
  2. 獲取包名:resolveInfo.activityInfo.packageName
  3. 獲取程式入口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);
    }

}

這裡寫圖片描述

原始碼

參考