Android中获取应用程序(包)的信息----------PackageManager的使用一

来源:互联网 发布:淘宝小号 浮云网 编辑:程序博客网 时间:2024/06/17 15:05

如何获取Android系统中应用程序的信息,主要包括packagename,label,icon,占用大小等。具体分为两部分:

1:获取应用程序的packagename,label,icon等;
2:获取应用程序的占用大小,包括:缓存大小(cachsize),数据大小(datasize)。

开发Launcher时,会更多的使用,Android系统为我们提供了很多服务管理的类,如ActivityManager,PowerManager,AudioManager,PackagerManager,NotificationManager等等。
而PackageManager主要职责是管理应用程序包。通过它,可以获取应用程序信息.

AndroidManifest.xml文件节点说明:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.simple.launcher"><application    android:supportsRtl="true" >    <activity        android:name=".Launcher"        android:launchMode="singleTask"        android:screenOrientation="portrait"        android:theme="@style/activity_Theme">        <intent-filter>            <action android:name="android.intent.action.MAIN" />            <category android:name="android.intent.category.LAUNCHER" />            <category android:name="android.intent.category.HOME" />            <category android:name="android.intent.category.DEFAULT" />            <category android:name="android.intent.category.MONKEY" />        </intent-filter>    </activity></application></manifest>

一: 相关类:

总包括的就是PackageInfo,提供了节点的基类的基本信息:a label,icon,meta-data。而它由子类继承然后调用相应的方法.

常用字段:

  public int icon           获得该资源图片在R文件中的值 (对应于android:icon属性)  public int labelRes     获得该label在R文件中的值(对应于android:label属性)  public String name   获得该节点的name值 (对应于android:name属性)  public String packagename   获得该应用程序的包名 (对应于android:packagename属性)

常用方法:

   Drawable  loadIcon(PackageManager pm)               获得当前应用程序的图像   CharSequence  loadLabel(PackageManager pm)     获得当前应用程序的label

ActivityInfo类继承PackageItemInfo

说明: 获得应用程序中或者 节点的信息 。我们可以通过它来获取我们设置的任 何属性,包括
theme 、launchMode、launchmode等

常用方法继承至PackageItemInfo类中的loadIcon()和loadLabel()

pplicationInfo类 继承自 PackageItemInfo

说明:获取一个特定引用程序中节点的信息。

字段说明:

 flags字段: FLAG_SYSTEM 系统应用程序

 FLAG_EXTERNAL_STORAGE 表示该应用安装在sdcard中

常用方法继承至PackageItemInfo类中的loadIcon()和loadLabel()

当然了还有很多基类:ServiceInfo ,ResolveInfo等等都是与上述类似的。

PackageInfo类

说明:手动获取AndroidManifest.xml文件的信息 。

常用字段:

public String packageName 包名

public ActivityInfo[] activities 所有节点信息

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

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

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

PackageManger 类

说明: 获得已安装的应用程序信息 。可以通过getPackageManager()方法获得。

常用方法:

public abstract PackageManager getPackageManager()

功能:获得一个PackageManger对象

public abstrac tDrawable getApplicationIcon(StringpackageName)

参数: packageName 包名

功能:返回给定包名的图标,否则返回null

public abstract ApplicationInfo getApplicationInfo(String packageName, int flags)

参数:packagename 包名
flags 该ApplicationInfo是此flags标记,通常可以直接赋予常数0即可

功能:返回该ApplicationInfo对象

public abstract List getInstalledApplications(int flags)

参数:flag为一般为GET_UNINSTALLED_PACKAGES,那么此时会返回所有ApplicationInfo。我们可以对ApplicationInfo的flags过滤,得到我们需要的。

功能:返回给定条件的所有PackageInfo

public abstract List getInstalledPackages(int flags)

参数如上

功能:返回给定条件的所有PackageInfo

public abstractResolveInfo resolveActivity(Intent intent, int flags)

参数: intent 查寻条件,Activity所配置的action和category

flags: MATCH_DEFAULT_ONLY :Category必须带有CATEGORY_DEFAULT的Activity,才匹配

GET_INTENT_FILTERS :匹配Intent条件即可

GET_RESOLVED_FILTER :匹配Intent条件即可

功能 :返回给定条件的ResolveInfo对象(本质上是Activity)

public abstract List queryIntentActivities(Intent intent, int flags)

参数同上

功能 :返回给定条件的所有ResolveInfo对象(本质上是Activity),集合对象

public abstract ResolveInfo resolveService(Intent intent, int flags)

参数同上

功能 :返回给定条件的ResolveInfo对象(本质上是Service)

public abstract List queryIntentServices(Intent intent, int flags)

参数同上

功能 :返回给定条件的所有ResolveInfo对象(本质上是Service),集合对象

二,案例讲解

1,通过queryIntentActivities()方法,查询Android系统的所有具备ACTION_MAIN和CATEGORY_LAUNCHER的Intent的应用程序,点击后,能启动该应用,说白了就是做一个类似Home程序的简易Launcher。

2:通过getInstalledApplications()方法获取应用,然后对其过滤,查找出我们需要的第三方应用,系统应用,安装在sdcard的应用。

xml布局就不用写了,我这里直接写出主要代码:

AppInfo.java:保存应用程序的Model类

public class AppInfo {private String appLabel; //应用程序标签private int appIcon;//应用程序所对应的图标private Drawable appDrawableIcon;//应用程序图像private String appPkg;//应用程序所对应的包名 private String appClassName;//应用程序所对应的主界面名字private int background;//应用程序所对应的背景public AppInfo() {} }

在MainActivity.java中编写工程逻辑,

public class Launcher extends FragmentActivity implements ViewPager.OnPageChangeListener {private static final String TAG = "Launcher";private static final int sFIRST_WORKSPACE = 0;private static final int sDEFAULT_WORKSPACE = 1;private static final int sTHIRD_WORKSPACE = 2;private static final int sFOURTH_WORKSPACE = 3;private static final int PERMISSION_REQUEST = 4;private static final int PERMISSION_ALL_ALLOWED = 5;private static final int PERMISSION_ALL_DENIED = 6;private static final int MINI_SDK_RETURN_VALUE = -1;public static boolean permissionFlag = false;private int mCurrPosition = sDEFAULT_WORKSPACE;public static boolean animAble = false;AppSectionsPagerAdapter mAppSectionsPagerAdapter;ViewPager mViewPager;private Context mContext = null;private int mfocusPosition = 0;private View mRootView;public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    requestWindowFeature(Window.FEATURE_NO_TITLE);    initRootView();    mContext = this;    initViewPager();} public void initViewPager() {    mViewPager = (ViewPager) findViewById(R.id.pager);    FragmentManager fm = getSupportFragmentManager();    int mViewPagerId = mViewPager.getId();    ArrayList<LauncherFragment> fragments = getFragments(mViewPagerId, fm);    mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(            fm,fragments);    mViewPager.setAdapter(mAppSectionsPagerAdapter);    mViewPager.setCurrentItem(mCurrPosition);    mViewPager.setOnPageChangeListener(this);}

主LauncherFragment提供各分页视图:

public abstract class LauncherFragment<T extends AppInfo> extends Fragment    implements AdapterView.OnItemLongClickListener,    AdapterView.OnItemClickListener, AdapterView.OnItemSelectedListener {private static final String TAG = "LauncherFragment";private boolean mIsActived;protected LauncherGridView mGridView;protected Context mContext;protected BaseGridAdapter mAdapter;protected List<T> mDatas = new ArrayList<T>();public List<T> getDatas() {    return mDatas;}public void setDatas(List<T> datas) {    this.mDatas = datas;}public BaseGridAdapter getAdapter() {    return mAdapter;}public void setAdapter(BaseGridAdapter adapter) {    this.mAdapter = adapter;}public LauncherGridView getGridView() {    return mGridView;}public void setGridView(LauncherGridView gridView) {    this.mGridView = gridView;}public LauncherFragment() {    mIsActived = false;}public boolean isActived() {    return mIsActived;}public void setActived(boolean actived) {    mIsActived = actived;}@Overridepublic void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    mContext = getActivity();    mDatas = loadData();    if (mDatas == null) {        mDatas = new ArrayList<T>();    }}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {    View root = inflater.inflate(R.layout.fragment_pager, container, false);    initGridView(root);    registerContentObservers();    return root;}protected void initGridView(View root) {    mGridView = (LauncherGridView) root.findViewById(R.id.default_grid_view);    mGridView.setSelector(mContext.getResources().getDrawable(R.color.transparent));    // View click Listener    mGridView.setOnItemClickListener(this);    // view has focus Listener    mGridView.setOnItemSelectedListener(this);}@Overridepublic void onDestroyView() {    super.onDestroyView();    unregisterContentObservers();}@Overridepublic void onDestroy() {    super.onDestroy();    if (mDatas != null) {        mDatas.clear();        mDatas = null;    }}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}protected Intent intentForPosition(int position) {    T info = getData(position);    Intent intent = new Intent();    if (info != null) {        intent.setClassName(info.getAppPkg(), info.getAppClassName());    }    AppIntentUtil.intentSetFlag(intent);    return intent;}public T getData(int position) {    T data = mDatas != null && position > -1 && position < mDatas.size() ? mDatas.get(position) : null;    return data;}}

以上主要是我编写Launcher时所用的主逻辑,Launcher开发和我们开发Apk其实是一样的.

阅读全文
1 1