Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

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

$
0
0

如何获取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;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mContext = getActivity();
    mDatas = loadData();
    if (mDatas == null) {
        mDatas = new ArrayList<T>();
    }
}

@Override
public 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);
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    unregisterContentObservers();
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mDatas != null) {
        mDatas.clear();
        mDatas = null;
    }
}

@Override
public 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其实是一样的.

作者:Google_huchun 发表于2017/7/24 12:43:15 原文链接
阅读:95 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles