PackageManager应用名(程序名)获取应用包名

1,421 阅读1分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

先上图,没有图一律当水贴处理 image.png Android系统为我们提供了很多服务管理的类,PackageManager类它的主要职责是管理应用程序包。 通过它,我们就可以获取应用程序信息,系统提供的PackageInfo实体类 常用字段:\

public int icon            获得该资源图片在R文件中的值 (对应于android:icon属性)

public int labelRes      获得该label在R文件中的值(对应于android:label属性)

public String name    获得该节点的name值 (对应于android:name属性)

public String packagename    获得该应用程序的包名 (对应于android:packagename属性)

常用字段:

public String    packageName                    包名

public ActivityInfo[]     activities                    所有<activity>节点信息

public ApplicationInfo applicationInfo        <application>节点信息,只有一个

public ActivityInfo[]    receivers                   所有<receiver>节点信息,多个

public ServiceInfo[]    services                  所有<service>节点信息 ,多个

手机上已安装的应用程序信息 。才可以通过getPackageManager()方法获得。

关键代码 List<PackageInfo> piList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES | PackageManager.GET_CONFIGURATIONS | PackageManager.GET_GIDS | PackageManager.GET_INSTRUMENTATION | PackageManager.GET_INTENT_FILTERS | PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS | PackageManager.GET_PROVIDERS | PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES | PackageManager.GET_SHARED_LIBRARY_FILES | PackageManager.GET_SIGNATURES | PackageManager.GET_URI_PERMISSION_PATTERNS);
怎么显示出来嘞:首先用HashMap包名和信息在放进listView里
遍历PackageInfo是很耗时的,所以要在子线程里面获取
关注我,下一篇优雅实现线程返回值
java

/**
 * /**
 * Create by JIULANG on 2020
 */
public class MainActivity extends Activity 
{
	Button btn ;
	EditText et;
	ListView listView;
	List<String> listdata= new ArrayList<>();
	
	private LinkedHashMap<String,String>  map= new LinkedHashMap<>();
	
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
		btn = findViewById(R.id.mainButton1);
		et = findViewById(R.id.mainEditText1);
		btn.setText("查询");
		btn.setOnClickListener(new View.OnClickListener(){

				@Override
				public void onClick(View p1)
				{


					String edit = et.getText().toString();

					et.setText("");
					long startTime =  System.currentTimeMillis();

					et.setHint(edit + " :" + getpackageName(edit));


					long endTime =  System.currentTimeMillis();
					long usedTime = (endTime - startTime);

					Toast.makeText(MainActivity.this, "耗时: " + usedTime + "ms", Toast.LENGTH_SHORT).show();



				}		
			});
		long startTime =  System.currentTimeMillis();

		map=getAppInfo();

		long endTime =  System.currentTimeMillis();
		long usedTime = (endTime - startTime);

		Toast.makeText(this,"耗时"+ usedTime + "ms", Toast.LENGTH_SHORT).show();
		
		et.setHint("应用计数: " + listdata.size() + "个");
		final String strdata[] = new String[listdata.size() - 1];//假数据
        for (int i=0;i < listdata.size() - 1;i++)
		{
			strdata[i] = listdata.get(i) ;
        }
		//放个ListView可视化
		listView = findViewById(R.id.List1);
		//List适配器
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, strdata);//新建并配置ArrayAapeter
        listView.setAdapter(adapter);


    }

	private String getpackageName(String Name)
	{
		//LinkedHashMap<String,String> map =getAppInfo();
		if (map != null)
		{
			//位置计数
            int index = 0;
            boolean hasContains = false;

			//Map遍历
            Object[] keys = map.keySet().toArray();
            for (int i = 0; i < keys.length; i++)
			{

                String key = (String) keys[i];
                if (key.equals(Name))
				{
                    index = i;
                    hasContains = true;
                    break;
                }
            }
            if (hasContains)
			{
				//返回包名
				return (String)map.values().toArray()[index];
			}
		}

		return "该应用不存在!";
	}
	private LinkedHashMap<String,String> getAppInfo()
	{
		//Map
		LinkedHashMap<String,String> packagesmap = new LinkedHashMap<>();

		//包管理器
		PackageManager  pm = this.getPackageManager();
        List<PackageInfo> piList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES |
														   PackageManager.GET_CONFIGURATIONS |
														   PackageManager.GET_GIDS |
														   PackageManager.GET_INSTRUMENTATION |
														   PackageManager.GET_INTENT_FILTERS |
														   PackageManager.GET_META_DATA |
														   PackageManager.GET_PERMISSIONS |
														   PackageManager.GET_PROVIDERS |
														   PackageManager.GET_RECEIVERS |
														   PackageManager.GET_SERVICES |
														   PackageManager.GET_SHARED_LIBRARY_FILES |
														   PackageManager.GET_SIGNATURES |
														   PackageManager.GET_URI_PERMISSION_PATTERNS);

        if (piList != null)
		{
            for (PackageInfo pi : piList)
			{		
				listdata.add("程序名: " + pi.applicationInfo.loadLabel(pm).toString() + "\n" + "包名:" + pi.packageName + "\n" + "包共享user id" + pi.sharedUserId);
				//Map插入
                packagesmap.put(pi.applicationInfo.loadLabel(pm).toString(),/*包名*/pi.packageName);
			}
		}
		return packagesmap;
	}
}

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:gravity="center"
	android:orientation="vertical">

	<EditText
		android:layout_width="wrap_content"
		android:ems="10"
		android:layout_height="wrap_content"
		android:id="@+id/mainEditText1"/>

	<Button
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:id="@+id/mainButton1"/>

	<ListView
		android:layout_width="wrap_content"
		android:layout_height="match_parent"
		android:id="@+id/List1"/>

</LinearLayout>