如何获取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其实是一样的.