当前位置: 首页 > news >正文

安德鲁斯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="5" android:maxLines="1" 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 = 0; 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(0);
		for (int i = 0; i < packlist.size(); i++) {
			PackageInfo pak = (PackageInfo) packlist.get(i);
			// if()里的值假设<=0则为自己装的程序。否则为系统project自带
			if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {
				// 加入自己已经安装的应用程序
				// 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, 0);
		for (int i = 0; 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 != 0) {
                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





版权声明:本文博客原创文章,博客,未经同意,不得转载。

相关文章:

  • Entity Framework基金会
  • 【QQ技术】群文件报毒怎样下载?~ 变相绕过QQ复杂检验过程
  • iOS 使用ALAssetsLibrary保存图片到本地
  • android studio导入 so 文件。
  • TeeChart的最小步长和最大步长
  • ORA-00001: unique constraint (...) violated并不一定是数据冲突
  • 关于touchTouch.jquery.js浏览图片重复的问题
  • Android中的内部类引起的内存泄露
  • XMemcached实例及与spring的集成
  • JAVA8
  • classpath对获取配置文件的影响
  • Delphi XE里面 SharedActivityContext 提示错误
  • Android 带你从源码的角度解析Scroller的滚动实现原理
  • ODI调用WebService----OdiInvokeWebService
  • OK335xS GPMC nand device register hacking
  • 【mysql】环境安装、服务启动、密码设置
  • 【个人向】《HTTP图解》阅后小结
  • Angular数据绑定机制
  • js学习笔记
  • leetcode386. Lexicographical Numbers
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • nginx 负载服务器优化
  • Python 基础起步 (十) 什么叫函数?
  • sublime配置文件
  • 浮现式设计
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 前端_面试
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 小程序button引导用户授权
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 正则表达式-基础知识Review
  • ​520就是要宠粉,你的心头书我买单
  • $forceUpdate()函数
  • (1)bark-ml
  • (3)选择元素——(17)练习(Exercises)
  • (BFS)hdoj2377-Bus Pass
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • ***详解账号泄露:全球约1亿用户已泄露
  • .form文件_SSM框架文件上传篇
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET中统一的存储过程调用方法(收藏)
  • //解决validator验证插件多个name相同只验证第一的问题
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节