安卓Launcher之获取手机安装的应用列表,安卓launcher
Launcher中最主要的就是获取所有应用列表的入口以及图标,一般获取的方法有两种:
PackageInfo
ResolveInfo
运行获取所有APP的Launcher并且允许进行点击事件,进入到应用
下面通过这两种方法获取到所有应用的列表:
建立基本数据:
PakageMod.java
public class PakageMod {
public String pakageName;
public String appName;
public Drawable icon;
public PakageMod() {
super();
}
public PakageMod(String pakageName, String appName, Drawable icon) {
super();
this.pakageName = pakageName;
this.appName = appName;
this.icon = icon;
}
}
建立适配器:
public class DemoGridAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<PakageMod> datas;
public DemoGridAdapter(Context context, List<PakageMod> datas) {
super();
inflater = LayoutInflater.from(context);
this.datas = datas;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
// 使用View的对象itemView与R.layout.item关联
convertView = inflater.inflate(R.layout.apps, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.apps_image);
holder.label = (TextView) convertView
.findViewById(R.id.apps_textview);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.icon.setImageDrawable(datas.get(position).icon);
holder.label.setText(datas.get(position).appName);
return convertView;
}
class ViewHolder {
private ImageView icon;
private TextView label;
}
}
建立适配器的视图:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical" > <ImageView
android:id="@+id/apps_image"
android:layout_width="48dip"
android:layout_height="48dip"
android:icon="@drawable/ic_launcher" /> <TextView
android:id="@+id/apps_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxEms=""
android:maxLines=""
android:text="good" /> </LinearLayout>
下面在Activity中获取到列表并显示到GridView中,并点击进入应用;
使用PackageInfo
public class PackageInfoDemo extends Activity {
private GridView gridview;
private PackageManager pManager;
private List<PakageMod> datas;
private String tag = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
// 取得gridview
gridview = (GridView) findViewById(R.id.gridview);
// 获取图片、应用名、包名
pManager = PackageInfoDemo.this.getPackageManager();
List<PackageInfo> appList = getAllApps(PackageInfoDemo.this);
datas = new ArrayList<PakageMod>();
for (int i = ; i < appList.size(); i++) {
PackageInfo pinfo = appList.get(i);
PakageMod shareItem = new PakageMod();
// 设置图片
shareItem.icon = pManager.getApplicationIcon(pinfo.applicationInfo);
// 设置应用程序名字
shareItem.appName = pManager.getApplicationLabel(
pinfo.applicationInfo).toString();
// 设置应用程序的包名
shareItem.pakageName = pinfo.applicationInfo.packageName;
datas.add(shareItem);
}
gridview.setAdapter(new baseAdapter(this, datas));
// 点击应用图标时,做出响应
gridview.setOnItemClickListener(new ClickListener());
}
public static List<PackageInfo> getAllApps(Context context) {
List<PackageInfo> apps = new ArrayList<PackageInfo>();
PackageManager pManager = context.getPackageManager();
// 获取手机内所有应用
List<PackageInfo> packlist = pManager.getInstalledPackages();
for (int i = ; i < packlist.size(); i++) {
PackageInfo pak = (PackageInfo) packlist.get(i);
// if()里的值如果<=0则为自己装的程序,否则为系统工程自带
if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= ) {
// 添加自己已经安装的应用程序
// apps.add(pak);
}
apps.add(pak);
}
return apps;
}
private class ClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
Intent intent = new Intent();
intent = PackageInfoDemo.this.getPackageManager()
.getLaunchIntentForPackage(datas.get(position).pakageName);
startActivity(intent);
}
}
}
使用ResolveInfo
public class ResolveInfoDemo extends Activity {
private GridView gridview;
private PackageManager pManager;
private List<PakageMod> datas;
private String tag = "ResolveInfoDemo";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
// 取得gridview
gridview = (GridView) findViewById(R.id.gridview);
// 获取图片、应用名、包名
pManager = this.getPackageManager();
datas = new GetAllApps(this).getDatas();
gridview.setAdapter(new DemoGridAdapter(this, datas));
gridview.setOnItemClickListener(new ClickListener());
}
// 当用户点击应用程序图标时,将对这个类做出响应
private class ClickListener implements OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int arg2,
long arg3) {
Intent intent = new Intent();
intent = getPackageManager().getLaunchIntentForPackage(
datas.get(arg2).pakageName);
startActivity(intent);
}
}
}
GetAllApps.java
public class GetAllApps {
private Context mContext;
private PackageManager packageManager;
private int mIconDpi;
private String tag = "GetAllApps";
private List<PakageMod> datas = new ArrayList<PakageMod>();
public GetAllApps(Context mContext){
this.mContext = mContext;
ActivityManager activityManager =
(ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
packageManager = mContext.getPackageManager();
mIconDpi = activityManager.getLauncherLargeIconDensity();
}
public void loadAllAppsByBatch() {
List<ResolveInfo> apps = null;
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
apps = packageManager.queryIntentActivities(mainIntent, );
for (int i = ; i < apps.size(); i++) {
String packageName = apps.get(i).activityInfo.applicationInfo.packageName;
String title = apps.get(i).loadLabel(packageManager).toString();
Drawable icon = null;
if(title == null){
title = apps.get(i).activityInfo.name;
}
ActivityInfo info = apps.get(i).activityInfo;
icon = getFullResIcon(info);
datas.add(new PakageMod(packageName,title,icon));
}
}
public Drawable getFullResIcon(ActivityInfo info) {
Resources resources;
try {
resources = packageManager.getResourcesForApplication(
info.applicationInfo);
} catch (PackageManager.NameNotFoundException e) {
resources = null;
}
if (resources != null) {
int iconId = info.getIconResource();
if (iconId != ) {
return getFullResIcon(resources, iconId);
}
}
return getFullResDefaultActivityIcon();
}
public Drawable getFullResDefaultActivityIcon() {
return getFullResIcon(Resources.getSystem(),
android.R.mipmap.sym_def_app_icon);
}
public Drawable getFullResIcon(Resources resources, int iconId) {
Drawable d;
try {
// requires API level 15 (current min is 14):
d = resources.getDrawableForDensity(iconId, mIconDpi);
} catch (Resources.NotFoundException e) {
d = null;
}
return (d != null) ? d : getFullResDefaultActivityIcon();
}
public List<PakageMod> getDatas() {
loadAllAppsByBatch();
return datas;
}
}
里getDrawableForDensity需要是15版本以上的SDK支持,所有低版本的Launcher不可以使用;
本博文使用的两种方法都不需要配置任何权限;
Android4.2的Launcher中使用ResolveInfo进行获取所用的应用列表,这里的ResolveInfo的Demo也是从Launcher源码中抄出来的;
或许还有第3种方法.......待续;
本文来自于CSDN博客,转载请联系作者;
注明出处http://blog.csdn.net/dreamintheworld/article/details/39718581
安卓Launcher之获取手机安装的应用列表,安卓launcher的更多相关文章
- Android获取手机安装的浏览器列表
最近碰到一个同事询问如何查询本地安装的浏览器列表,其使用的代码如下: public static List<ResolveInfo> getBrowserList(Context cont ...
- Android之——获取手机安装的应用程序
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47114331 前几篇有关Android的博文中.向大家介绍了几个项目中经常使用的有 ...
- iOS获取已安装的app列表(私有库)+ 通过包名打开应用
1.获取已安装的app列表 - (void)touss { Class lsawsc = objc_getClass("LSApplicationWorkspace"); NSOb ...
- 获取手机安装的所有包名adb shell pm list packages
获取所有已安装包的包名:adb shell pm list packages 查找:adb shell pm list packages|findstr suning
- android获取手机信息大全
IMEI号,IESI号,手机型号: private void getInfo() { TelephonyManager mTm = (TelephonyManager) getSystemServic ...
- android获取手机信息2
IMEI号,IESI号,手机型号: private void getInfo() { TelephonyManager mTm = (TelephonyManager) getSystemServic ...
- Android 获取手机信息
private void initData() { TelephonyManager mTm = (TelephonyManager) getActivity().getSystemService(C ...
- [转] android获取手机信息大全
原文链接:http://blog.csdn.net/hytfly/article/details/8552483 IMEI号,IESI号,手机型号: private void getInfo() { ...
- jail brak 获取当前安装app列表
ios 5 6 7 可以通过解析"/private/var/mobile/Library/Caches/com.app.mobile.installation.plist" 文件获 ...
随机推荐
- Windows Azure 即将更名
今天我们宣布自2014 年4 月3 日起,WindowsAzure 将更名为Microsoft Azure.这一更名反映了Microsoft 的战略,并显示了Microsoft 专注于将Azur ...
- 【剑指offer】第一个仅仅出现一次的字符
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27106997 题目描写叙述: 在一个字符串(1<=字符串长度<=10000,所 ...
- [Swust OJ 767]--将军回家(Dijkstra算法)
题目链接:http://acm.swust.edu.cn/problem/767/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- [C#参考]委托机制
1. 委托概述 这是一个新的概念,但是其本质并不是什么新鲜的事物,委托本质上就是一个类.只不过一般的类是数据的集合,委托保存的是一个或者多个方法.委托是引用类型,因此委托有引用和对象,同时委托对象中包 ...
- Python之路Day15
主要内容:WEB框架.Django基础 WEB框架 Web请求流程 -- 原始Web框架 -- 自定义Web框架 -- MVC 和 MTV # Models Views Controllers # 模 ...
- nginx启动
查看nginx的进程 ps -ef | grep nginx 重启nginx的3种办法1.service nginx restart2.改了配置文件让其生效办法 nginx -s reload3.到n ...
- jQuery tablesort插件推荐
搜索结果的第一条网址(似乎是Official Site)似乎有问题(也可能是我弄错了 总之chrome中有个叉叉) 所以还是用这个吧http://mottie.github.io/tablesort ...
- MouseOver/MouseOut vs MouseEnter/MouseLeave
参考 http://www.oschina.net/question/234345_45280 这是jQuery提供的函数 要注意MouseOut 和 MouseLeave的区别 比如对元素A绑定Mo ...
- QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)
QMessageBox类: 含有Question消息框.Information消息框.Warning消息框和Critical消息框等 通常有两种方式可以来创建标准消息对话框: 一种是采用“基于属性”的 ...
- 让我们共同构筑物联网起飞的平台:物联网操作系统Hello China寻求应用合作伙伴
经过几天的努力,终于把Hello China V1.76版的内核移植到基于Cortex-M3内核的STM32 chipset上.因为还希望进一步写一个USART驱动程序,因此详细的移植文档,预计一周之 ...