本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
先上图,没有图一律当水贴处理
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>