zoukankan      html  css  js  c++  java
  • 如何获取系统的应用程序的相关信息

      有的时候我们需要获取系统的应用程序,比如说Home界面的时候,我们需要获取在Manifest里面注册的所有的应用的信息,并将这些应用的图标,名字显示出来,同时还要获取他们的action或者CompanentName,以便点击他们的时候可以跳转到相应的应用。

      下面就是一个例子:

      先上运行出来的效果图:

      

              

      

      很明显,这需要一个ListView,看一下layout文件:

      

     1 <?xml version="1.0" encoding="utf-8"?>
    2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3 android:orientation="vertical"
    4 android:layout_width="match_parent"
    5 android:layout_height="match_parent">
    6
    7 <TextView
    8 android:layout_width="match_parent"
    9 android:layout_height="wrap_content"
    10 android:text="@string/hello"
    11 android:textColor="@android:color/white"
    12 android:textSize="24sp"/>
    13
    14 <ListView
    15 android:id="@+id/mylist"
    16 android:layout_width="match_parent"
    17 android:layout_height="0dip"
    18 android:layout_weight="1"/>
    19 </LinearLayout>

      我们需要一个文件来显示应用程序的信息:比如应用的名字,图标,已经点击的Intent等,如下所示:

      

     1 package com.android.test;
    2
    3 import android.content.ComponentName;
    4 import android.graphics.drawable.Drawable;
    5
    6 public class ApplicationInfo {
    7
    8 String name;
    9 ComponentName intent;
    10 Drawable icon;
    11
    12 public String getName () {
    13 return name;
    14 }
    15
    16 public void setName (String name) {
    17 this.name = name;
    18 }
    19
    20 public ComponentName getIntent () {
    21 return intent;
    22 }
    23
    24 public void setIntent (ComponentName intent) {
    25 this.intent = intent;
    26 }
    27
    28 public Drawable getIcon () {
    29 return icon;
    30 }
    31
    32 public void setIcon (Drawable icon) {
    33 this.icon = icon;
    34 }
    35 }

      好了,现在我们要开始获取应用的信息了,并把获得的信息封装在一个List<ApplicationInfo>中,具体是这样的:

      

     1 private List<ApplicationInfo> loadAppInfomation(Context context) {
    2 List<ApplicationInfo> apps = new ArrayList<ApplicationInfo>();
    3 PackageManager pm = context.getPackageManager();
    4 Intent intent = new Intent(Intent.ACTION_MAIN, null);
    5 intent.addCategory(Intent.CATEGORY_LAUNCHER);
    6 List<ResolveInfo> infos = pm.queryIntentActivities(intent, 0);
    7 Collections.sort(infos, new ResolveInfo.DisplayNameComparator(pm));
    8 if(infos != null) {
    9 apps.clear();
    10 for(int i=0; i<infos.size(); i++) {
    11 ApplicationInfo app = new ApplicationInfo();
    12 ResolveInfo info = infos.get(i);
    13 app.setName(info.loadLabel(pm).toString());
    14 app.setIcon(info.loadIcon(pm));
    15 app.setIntent(new ComponentName(info.activityInfo.packageName, info.activityInfo.name));
    16 apps.add(app);
    17 }
    18 }
    19 return apps;
    20 }

      首先是拿到packageManager,然后扫描带有Action_main和Category_Launcher的Intent_filter.查询到的返回值是一个List<ResolveInfo>,里面的每一个ResolveInfo就是一个应用的信息。

      然后我们需要遍历这个List,拿到每一个应用的相关信息(我们需要的那些信息),然后将拿到的我们需要的信息放在一个ApplicationInfo对象中,然后讲所有的应用的ApplicationInfo放到一个List里面,这个List里面就是我们需要的数据。

      然后我们需要写一个Adapter,将数据传递进去,让ListView现实出我们需要显示的东西:

      Adapter如下:

      

     1 package com.android.test;
    2
    3 import java.util.List;
    4
    5 import android.content.Context;
    6 import android.view.LayoutInflater;
    7 import android.view.View;
    8 import android.view.ViewGroup;
    9 import android.widget.BaseAdapter;
    10 import android.widget.ImageView;
    11 import android.widget.TextView;
    12
    13 public class ApplicationAdapter extends BaseAdapter {
    14
    15 private List<ApplicationInfo> apps;
    16 private LayoutInflater inflater;
    17
    18 public ApplicationAdapter (Context context, List<ApplicationInfo> infos) {
    19 this.apps = infos;
    20 inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    21 }
    22
    23 @Override
    24 public int getCount () {
    25 return apps.size();
    26 }
    27
    28 @Override
    29 public Object getItem (int position) {
    30 return position;
    31 }
    32
    33 @Override
    34 public long getItemId (int position) {
    35 return position;
    36 }
    37
    38 @Override
    39 public View getView (int position, View convertView, ViewGroup parent) {
    40 ViewHolder holder;
    41 if(convertView == null) {
    42 holder = new ViewHolder();
    43 convertView = inflater.inflate(R.layout.app_adapter_list_item, null);
    44 holder.icon = (ImageView) convertView.findViewById(R.id.app_icon);
    45 holder.name = (TextView) convertView.findViewById(R.id.app_name);
    46 convertView.setTag(holder);
    47 } else {
    48 holder = (ViewHolder) convertView.getTag();
    49 }
    50 holder.icon.setImageDrawable(apps.get(position).getIcon());
    51 holder.name.setText(apps.get(position).getName());
    52 return convertView;
    53 }
    54
    55 class ViewHolder {
    56 ImageView icon;
    57 TextView name;
    58 }
    59 }

      Adapter里面就是getView里面显示每一个Item项,这里我就不在多废话了,这里我们需要显示应用的图标和名字,所以在布局中我们需要一个ImageView和一个TextView,Adapter的item项的布局文件如下:

      

     1 <?xml version="1.0" encoding="utf-8"?>
    2 <LinearLayout
    3 xmlns:android="http://schemas.android.com/apk/res/android"
    4 android:layout_width="match_parent"
    5 android:layout_height="match_parent"
    6 android:orientation="horizontal">
    7 <ImageView
    8 android:id="@+id/app_icon"
    9 android:layout_width="wrap_content"
    10 android:layout_height="wrap_content"/>
    11 <TextView
    12 android:id="@+id/app_name"
    13 android:layout_width="0dip"
    14 android:layout_weight="1"
    15 android:gravity="center"
    16 android:textColor="@android:color/white"
    17 android:textSize="20sp"
    18 android:layout_height="wrap_content"/>
    19 </LinearLayout>

     这里整个ListView就已经可以显示出来了,我们还需要写点击事件:

      

    1  @Override
    2 public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
    3 Intent intent = new Intent();
    4 intent.setComponent(apps.get(position).getIntent());
    5 startActivity(intent);
    6 }

      下面把主Activity放出来:

      

     1 package com.android.test;
    2
    3 import java.util.ArrayList;
    4 import java.util.Collections;
    5 import java.util.List;
    6
    7 import android.app.Activity;
    8 import android.content.ComponentName;
    9 import android.content.Context;
    10 import android.content.Intent;
    11 import android.content.pm.PackageManager;
    12 import android.content.pm.ResolveInfo;
    13 import android.os.Bundle;
    14 import android.view.View;
    15 import android.widget.AdapterView;
    16 import android.widget.AdapterView.OnItemClickListener;
    17 import android.widget.ListView;
    18
    19 public class GetApplicationOfSystem extends Activity implements OnItemClickListener {
    20
    21 private ListView mListView;
    22 private ApplicationAdapter mAdapter;
    23 private List<ApplicationInfo> apps;
    24
    25 @Override
    26 protected void onCreate (Bundle savedInstanceState) {
    27 super.onCreate(savedInstanceState);
    28 setContentView(R.layout.system_app);
    29
    30 mListView = (ListView) findViewById(R.id.mylist);
    31 mListView.setOnItemClickListener(this);
    32 apps = loadAppInfomation(this);
    33 mAdapter = new ApplicationAdapter(this, apps);
    34 mListView.setAdapter(mAdapter);
    35 }
    36
    37 private List<ApplicationInfo> loadAppInfomation(Context context) {
    38 List<ApplicationInfo> apps = new ArrayList<ApplicationInfo>();
    39 PackageManager pm = context.getPackageManager();
    40 Intent intent = new Intent(Intent.ACTION_MAIN, null);
    41 intent.addCategory(Intent.CATEGORY_LAUNCHER);
    42 List<ResolveInfo> infos = pm.queryIntentActivities(intent, 0);
    43 Collections.sort(infos, new ResolveInfo.DisplayNameComparator(pm));
    44 if(infos != null) {
    45 apps.clear();
    46 for(int i=0; i<infos.size(); i++) {
    47 ApplicationInfo app = new ApplicationInfo();
    48 ResolveInfo info = infos.get(i);
    49 app.setName(info.loadLabel(pm).toString());
    50 app.setIcon(info.loadIcon(pm));
    51 app.setIntent(new ComponentName(info.activityInfo.packageName, info.activityInfo.name));
    52 apps.add(app);
    53 }
    54 }
    55 return apps;
    56 }
    57
    58 @Override
    59 public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
    60 Intent intent = new Intent();
    61 intent.setComponent(apps.get(position).getIntent());
    62 startActivity(intent);
    63 }
    64 }

     

      还有一种情况是这样的,我们有时需要获取安装的应用的信息,而不是整个系统的应用的信息,

      这是需要换一种方式来获取安装的应用的信息:

      

     1 private List<PackageInfo> loadPackageInfo(Context context) {
    2 List<PackageInfo> apps = new ArrayList<PackageInfo>();
    3 PackageManager pm = context.getPackageManager();
    4 List<PackageInfo> packageList = pm.getInstalledPackages(0);
    5 for(int i=0; i<packageList.size(); i++) {
    6 PackageInfo info = packageList.get(i);
    7 if((info.applicationInfo.flags & info.applicationInfo.FLAG_SYSTEM) <= 0) {
    8 apps.add(info);
    9 }
    10 }
    11 return apps;
    12 }

     从本地的包中可以获取安装的包,注意,这里的安装的包是指说有的包,包括系统的包,我们只需要我们自己安装的,不需要系统的,怎么办呢,这时我们需要将系统的包过滤掉,我们可以做判断如果if((info.applicationInfo.flags & info.application.FLAG_SYSTEM) <= 0),就说明不是系统的包,是后来安装上去的,我们就可以把它加到List中去了。

      获取安装的包的Adapter:

      

     1 package com.android.test;
    2
    3 import java.util.List;
    4
    5 import android.content.Context;
    6 import android.content.pm.PackageInfo;
    7 import android.view.LayoutInflater;
    8 import android.view.View;
    9 import android.view.ViewGroup;
    10 import android.widget.BaseAdapter;
    11 import android.widget.ImageView;
    12 import android.widget.TextView;
    13
    14 public class InstalledPackageAdapter extends BaseAdapter {
    15
    16 private List<PackageInfo> mApps;
    17 private LayoutInflater inflater;
    18 private Context mContext;
    19
    20 public InstalledPackageAdapter (Context context, List<PackageInfo> infos) {
    21 this.mContext = context;
    22 this.mApps = infos;
    23 inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    24 }
    25
    26 @Override
    27 public int getCount () {
    28 return mApps.size();
    29 }
    30
    31 @Override
    32 public Object getItem (int position) {
    33 return position;
    34 }
    35
    36 @Override
    37 public long getItemId (int position) {
    38 return position;
    39 }
    40
    41 @Override
    42 public View getView (int position, View convertView, ViewGroup parent) {
    43 ViewHolder holder;
    44 if(convertView == null) {
    45 holder = new ViewHolder();
    46 convertView = inflater.inflate(R.layout.app_adapter_list_item, null);
    47 holder.icon = (ImageView) convertView.findViewById(R.id.app_icon);
    48 holder.name = (TextView) convertView.findViewById(R.id.app_name);
    49 convertView.setTag(holder);
    50 } else {
    51 holder = (ViewHolder) convertView.getTag();
    52 }
    53 holder.icon.setImageDrawable(mApps.get(position).applicationInfo.loadIcon(mContext.getPackageManager()));
    54 holder.name.setText(mApps.get(position).applicationInfo.loadLabel(mContext.getPackageManager()));
    55 return convertView;
    56 }
    57
    58 class ViewHolder {
    59 ImageView icon;
    60 TextView name;
    61 }
    62 }

     获取安装的应用的Activity:

      

     1 package com.android.test;
    2
    3 import java.util.ArrayList;
    4 import java.util.List;
    5
    6 import android.app.Activity;
    7 import android.content.Context;
    8 import android.content.Intent;
    9 import android.content.pm.PackageInfo;
    10 import android.content.pm.PackageManager;
    11 import android.os.Bundle;
    12 import android.view.View;
    13 import android.widget.AdapterView;
    14 import android.widget.AdapterView.OnItemClickListener;
    15 import android.widget.ListView;
    16
    17 public class GetApplicationOfInstalled extends Activity implements OnItemClickListener {
    18
    19 private ListView mListView;
    20 private InstalledPackageAdapter maAdapter;
    21 private List<PackageInfo> mApps;
    22
    23 @Override
    24 protected void onCreate (Bundle savedInstanceState) {
    25 super.onCreate(savedInstanceState);
    26 setContentView(R.layout.installed_app);
    27 mListView = (ListView) findViewById(R.id.mylist);
    28 mListView.setOnItemClickListener(this);
    29 mApps = loadPackageInfo(this);
    30 maAdapter = new InstalledPackageAdapter(this, mApps);
    31 mListView.setAdapter(maAdapter);
    32 }
    33
    34 private List<PackageInfo> loadPackageInfo(Context context) {
    35 List<PackageInfo> apps = new ArrayList<PackageInfo>();
    36 PackageManager pm = context.getPackageManager();
    37 List<PackageInfo> packageList = pm.getInstalledPackages(0);
    38 for(int i=0; i<packageList.size(); i++) {
    39 PackageInfo info = packageList.get(i);
    40 if((info.applicationInfo.flags & info.applicationInfo.FLAG_SYSTEM) <= 0) {
    41 apps.add(info);
    42 }
    43 }
    44 return apps;
    45 }
    46
    47 @Override
    48 public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
    49 Intent intent = new Intent();
    50 PackageInfo packageInfo = mApps.get(position);
    51 startActivity(intent);
    52 }
    53 }

      获取安装的应用的效果图:

      

      

       好了,就写这么多吧。。。

      源代码下载地址如下:

      点击我下载代码

  • 相关阅读:
    《基于UML的电子病案管理系统的设计》文献阅读随笔
    《暗时间》读书笔记
    《基于物联网技术的无纸化电子病案管理系统设计与应用》文献阅读随笔
    文献随笔目录
    C语言程序设计第一次作业
    python基础 day24 面向对象——封装
    python基础 day23 面向对象相关
    python基础 day22 面向对象初识
    python基础 day21 re模块及shutil、logging模块
    python基础 day20 正则表达式及re模块及装饰器
  • 原文地址:https://www.cnblogs.com/shang53880/p/2153223.html
Copyright © 2011-2022 走看看