1. 程式人生 > >獲取整機應用資訊以及啟動介面(通過adb啟動應用)

獲取整機應用資訊以及啟動介面(通過adb啟動應用)

通過Context.getPackgeManager來獲取你關心的應用資訊,包括icon、應用名、版本號等。

但是如果要讓你的指令碼能夠在任何介面下不通過點選圖示而啟動應用,除了包名之外還需要主Activity的資訊,以下的AppInfo中,通過配置Intent,過濾出了主Activity資訊。

最後,可以通過如下方式啟動被測應用(我的應用背景是自己寫一個Android應用,把整機所有的應用都放到一個spinner中供使用者選擇,使用者點選被測應用,則進入該應用):

初始化spinner

//獲取應用資訊
ArrayList<AppInfo> appList = AppInfo.getAllAppsInfo();
//介面卡
AppAdapter adapter = new AppAdapter(this, appList);
//載入介面卡
app_spi.setAdapter(adapter);
//獲取被選中的應用
AppInfo appInfo = (AppInfo) app_spi.getSelectedItem();
//獲取被測應用資訊
String pkgName=appInfo.packageName;
String actName=AppInfo.getLancherActvity(appInfo.packageName);




執行adb命令:


 am start -n pkgName+"/"+actName

以下是AppInfo.java檔案

import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;

import com.meitu.travelapk.SharedApplication;

import java.util.ArrayList;
import java.util.List;

/**
 * 應用資訊
 * Created by CrystalChen on 2016/1/6.
 */
public class AppInfo {
    public String appName = "";
    public String packageName = "";
    public String versionName = "";
    public int versionCode = 0;
    public Drawable appIcon = null;

    /**
     * 通過包名,獲取主Activity資訊
     * @param pkgName 包名
     * @return 主Activity資訊
     */
    public static String getLancherActvity(String pkgName){
        String name="";
        Context context= SharedApplication.context;
        Intent intent = new Intent(Intent.ACTION_MAIN, null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> apps = context.getPackageManager().queryIntentActivities(intent, 0);
        for (int i = 0; i < apps.size(); i++) {
            if (apps.get(i).activityInfo.packageName.equals(pkgName)){
                name = apps.get(i).activityInfo.name;//得到所有app的主Activitivy,
            }
        }

        return  name;

    }

    /**
     * 獲取裝置上所有的應用資訊,包括系統應用
     * @return 應用資訊
     */
    public static ArrayList<AppInfo> getAllAppsInfo() {
        Context context= SharedApplication.context;
        //獲取應用資訊
        ArrayList<AppInfo> appList = new ArrayList<>(); //用來儲存獲取的應用資訊資料
        List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0);

        for (int i = 0; i < packages.size(); i++) {
            PackageInfo packageInfo = packages.get(i);
            AppInfo tmpInfo = new AppInfo();
            tmpInfo.appName = packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString();
            tmpInfo.packageName = packageInfo.packageName;
            tmpInfo.versionName = packageInfo.versionName;
            tmpInfo.versionCode = packageInfo.versionCode;
            tmpInfo.appIcon = packageInfo.applicationInfo.loadIcon(context.getPackageManager());
            appList.add(tmpInfo);
        }
        return appList;
    }

    /**
     * 獲取裝置上所有的非系統級應用資訊
     * @return 應用資訊
     */
    public static ArrayList<AppInfo> getNonSystemAppsInfo() {
        Context context= SharedApplication.context;
        //獲取應用資訊
        ArrayList<AppInfo> appList = new ArrayList<>(); //用來儲存獲取的應用資訊資料
        List<PackageInfo> packages = context.getPackageManager().getInstalledPackages(0);

        for (int i = 0; i < packages.size(); i++) {
            PackageInfo packageInfo = packages.get(i);
            // 非系統應用
            if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_EXTRACT_NATIVE_LIBS) == 0) {
                AppInfo tmpInfo = new AppInfo();
                tmpInfo.appName = packageInfo.applicationInfo.loadLabel(context.getPackageManager()).toString();
                tmpInfo.packageName = packageInfo.packageName;
                tmpInfo.versionName = packageInfo.versionName;
                tmpInfo.versionCode = packageInfo.versionCode;
                tmpInfo.appIcon = packageInfo.applicationInfo.loadIcon(context.getPackageManager());
                appList.add(tmpInfo);
            }
        }
        return appList;
    }
}