Android Launcher研究(三)-----------列出所安装的应用,点击进入相应的应用!

分类: Android Launcher研究分享 7645人阅读 评论(38) 收藏 举报

大家好,我今天给大家简单讲一下Launcher里如何列出所有安装的应用的,我们点击Launcher的抽屉(SlidingDrawer)就会出现所有安装的应用列表(当然Widget,Launcher本身除外).并且点击应用图标进入 相关应用。我这里就先简单的用一个GridView来显示应用。

老样子我还会写一个简单的Demo让大家理解。大家跟着我的步骤来。

第一步:新建一个Android工程命名为:Launcher.

第二步:修改main.xml布局文件,代码如下(只有一个GridView这里):

view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <GridView
  8. android:id="@+id/allapps"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. />
  12. </LinearLayout>

第三步:新建一个application_layout.xml布局文件,用来定义应用的图标和标题,代码如下:

view plain
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <ImageView
  8. android:id="@+id/app_icon"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. />
  12. <TextView
  13. android:id="@+id/app_title"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. />
  17. </LinearLayout>

第四步:也就是核心了,修改Launcher.java代码如下:

view plain
  1. packagecom.tutor.launcher;
  2. importjava.util.Collections;
  3. importjava.util.List;
  4. importandroid.app.Activity;
  5. importandroid.content.ComponentName;
  6. importandroid.content.Context;
  7. importandroid.content.Intent;
  8. importandroid.content.pm.PackageManager;
  9. importandroid.content.pm.ResolveInfo;
  10. importandroid.os.Bundle;
  11. importandroid.view.LayoutInflater;
  12. importandroid.view.View;
  13. importandroid.view.ViewGroup;
  14. importandroid.widget.AdapterView;
  15. importandroid.widget.BaseAdapter;
  16. importandroid.widget.GridView;
  17. importandroid.widget.ImageView;
  18. importandroid.widget.TextView;
  19. importandroid.widget.AdapterView.OnItemClickListener;
  20. publicclassLauncherextendsActivityimplementsOnItemClickListener{
  21. privateGridViewmGridView;
  22. privateContextmContext;
  23. privatePackageManagermPackageManager;
  24. privateList<ResolveInfo>mAllApps;
  25. publicvoidonCreate(BundlesavedInstanceState){
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.main);
  28. setupViews();
  29. }
  30. publicvoidsetupViews(){
  31. mContext=Launcher.this;
  32. mPackageManager=getPackageManager();
  33. mGridView=(GridView)findViewById(R.id.allapps);
  34. bindAllApps();
  35. mGridView.setAdapter(newGridItemAdapter(mContext,mAllApps));
  36. mGridView.setNumColumns(4);
  37. mGridView.setOnItemClickListener(this);
  38. }
  39. publicvoidbindAllApps(){
  40. //这里是关键哦,我们平时写的应用总有一个activity申明成这两个属性
  41. //也就是应用的入口
  42. IntentmainIntent=newIntent(Intent.ACTION_MAIN,null);
  43. mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
  44. //符合上面条件的全部查出来,并且排序
  45. mAllApps=mPackageManager.queryIntentActivities(mainIntent,0);
  46. Collections.sort(mAllApps,newResolveInfo.DisplayNameComparator(mPackageManager));
  47. }
  48. //gridview点击事件,点击进入相关应用
  49. @Override
  50. publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){
  51. //TODOAuto-generatedmethodstub
  52. ResolveInfores=mAllApps.get(position);
  53. //该应用的包名和主Activity
  54. Stringpkg=res.activityInfo.packageName;
  55. Stringcls=res.activityInfo.name;
  56. ComponentNamecomponet=newComponentName(pkg,cls);
  57. Intenti=newIntent();
  58. i.setComponent(componet);
  59. startActivity(i);
  60. }
  61. //不明白BaseAdapter的用法我高手进阶里有
  62. privateclassGridItemAdapterextendsBaseAdapter{
  63. privateContextcontext;
  64. privateList<ResolveInfo>resInfo;
  65. //构造函数
  66. publicGridItemAdapter(Contextc,List<ResolveInfo>res){
  67. context=c;
  68. resInfo=res;
  69. }
  70. @Override
  71. publicintgetCount(){
  72. //TODOAuto-generatedmethodstub
  73. returnresInfo.size();
  74. }
  75. @Override
  76. publicObjectgetItem(intposition){
  77. //TODOAuto-generatedmethodstub
  78. returnnull;
  79. }
  80. @Override
  81. publiclonggetItemId(intposition){
  82. //TODOAuto-generatedmethodstub
  83. return0;
  84. }
  85. @Override
  86. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  87. //不明白LayoutInflater的我android高手进阶里有
  88. convertView=LayoutInflater.from(context)
  89. .inflate(R.layout.application_layout,null);
  90. ImageViewapp_icon=(ImageView)convertView.findViewById(R.id.app_icon);
  91. TextViewapp_tilte=(TextView)convertView.findViewById(R.id.app_title);
  92. ResolveInfores=resInfo.get(position);
  93. app_icon.setImageDrawable(res.loadIcon(mPackageManager));
  94. app_tilte.setText(res.loadLabel(mPackageManager).toString());
  95. returnconvertView;
  96. }
  97. }
  98. }

第五步:运行以上工程,得到的效果图如下:

图1.列出所有安装的应用.

图2.点击aQQ应用进入到相应的应用里。

OK,今天就写到这里,大家有什么不明白的地方可 以留言。thx~


更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 高级Redis应用进阶课 一站式Redis解决方案
  3. 超简单实用详细的android Widget实例教程
  4. 玩一下android的反编译和代码混淆
  5. Qt on Android:使用JNI与第三方jar包
  6. JS和Android交互调用
  7. Android(安卓)学习之《第一行代码》第二版 笔记(十八)调用摄像头拍
  8. Android06之RecyclerView详解
  9. 直播一对一源码在Android音频开发中如何实现对讲机实时语音对话

随机推荐

  1. Docker与微服务
  2. PHP 变量
  3. classList 和 事件
  4. 轮播图实例和xhr对象的使用
  5. Layui图片预览
  6. yum安装 一直出现There are no enabled r
  7. Layui关闭父级弹窗
  8. android自定义属性之format介绍
  9. 对Android(安卓)NDK的理解【Android】
  10. Android中使用XmlSerializer拼装XML数据