乐者为王

Do one thing, and do it well.

在ListView中显示已安装应用的名字和包名

通过PackageManager获取手机中已安装应用的信息,具体代码如下:

1
2
PackageManager packageManager = this.getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);

通过以上方法,可以得到所有已安装的应用程序,既包括了手动安装的应用程序的信息,也包括了系统预装的应用程序的信息。要区分这两类应用可使用以下方法:

  1. 从packageInfoList获取的packageInfo,再通过packageInfo.applicationInfo获取applicationInfo;
  2. 判断applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM的值,该值大于0时,表示获取的应用为系统预装的应用,反之则为手动安装的应用。

列表的显示需要三个元素:

  1. 用来显示数据的ListView;
  2. 需要显示的数据;
  3. 绑定数据和ListView的Adapter。

Adapter通常有ArrayAdapter、SimpleAdapter和CursorAdapter等。其中SimpleAdapter有最好的扩充性,可以自定义出各种效果。

1
2
SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
              int resource, String[] from, int[] to)

参数解释:

  1. context:上下文;
  2. data:数据列表。列表里的每一项都是一个Map对象,都和ListView里的一项进行数据绑定;
  3. resource:布局资源。可以引用系统提供的,也可以自定义;
  4. from:名字数组。每个名字都是用来索引数据列表中每个Map里的Object;
  5. to:资源索引数组,以R.id.xxx的形式表示。

main.xml布局代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/app_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="22px" />
    <TextView
        android:id="@+id/app_package"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

上面代码中的android:orientation="vertical"很重要,没有它两个TextView就不会显示成两行。

继承了ListActivity的MainActivity代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.ListActivity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.widget.SimpleAdapter;

public class MainActivity extends ListActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SimpleAdapter adapter = new SimpleAdapter(this,
                getInstalledApps(false),
                R.layout.main,
                new String[] {"app_title", "app_package"},
                new int[] {R.id.app_title, R.id.app_package});
        setListAdapter(adapter);
    }

    private List<HashMap<String, Object>> getInstalledApps(boolean getSysPackages) {
        List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();

        List<PackageInfo> pkgs = getPackageManager().getInstalledPackages(0);
        for (int i = 0; i< pkgs.size(); i++) {
            PackageInfo pkg = pkgs.get(i);
            if (!getSysPackages
                    && (pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) {
                continue;
            }
            String label = pkg.applicationInfo.loadLabel(getPackageManager()).toString();
            String version = pkg.versionName;
            String pkgName = pkg.packageName;

            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("app_title", label + " " + version);
            map.put("app_package", pkgName);
            list.add(map);
        }
        return list;
    }
}

Comments