android 桌面

简介: 引用:http://blog.csdn.net/chenjie19891104/article/details/7004856 上篇中,讲到了第一个功能中需要获取应用程序的信息,然后添加到桌面。这里,先记录下如何获取Android中的应用程序信息。

引用:http://blog.csdn.net/chenjie19891104/article/details/7004856

上篇中,讲到了第一个功能中需要获取应用程序的信息,然后添加到桌面。这里,先记录下如何获取Android中的应用程序信息。

一、调用系统快捷方式列表

[java]  view plain copy
 
  1.  Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);  
  2. pickIntent.putExtra(Intent.EXTRA_INTENT,  
  3.         new Intent(Intent.ACTION_CREATE_SHORTCUT));  
  4. pickIntent.putExtra(Intent.EXTRA_TITLE,  
  5.         res.getString(R.string.title_select_app));  
  6.   
  7. pickIntent.putExtras(bundle);  
  8.   
  9. startActivityForResult(pickIntent, REQUEST_PICK_SHORTCUT);    


 

这个获取到的就是所有可以创建的快捷方式,但是我们需要在这个列表中加入其他项怎么办呢?因为我们知道,我需要在这个列表中加入“应用程序”,这一项,这样当我们点击应用程序的时候,就可以显示应用程序列表。这个时候,我们只需要传入额外的信息就可以了,如下:

 

[java]  view plain copy
 
  1. Resources res = getResources();  
  2.     /** 
  3.      * 用一个Bundle对象,传递两个list信息 
  4.      * 一个list中存放需要附加到快捷列表中的项的文字 
  5.      * 一个list中存放每一个对应的图标信息 
  6.      */  
  7.        Bundle bundle = new Bundle();  
  8.          
  9.        ArrayList<String> shortcutNames = new ArrayList<String>();  
  10.        shortcutNames.add(res.getString(R.string.group_application));  
  11.        shortcutNames.add("其他");  
  12.        //显示在List第一个的应用快捷方式的名字  
  13.        bundle.putStringArrayList(Intent.EXTRA_SHORTCUT_NAME, shortcutNames);  
  14.          
  15.        //显示图标  
  16.        ArrayList<ShortcutIconResource> shortcutIcons =  
  17.                new ArrayList<ShortcutIconResource>();  
  18.        shortcutIcons.add(ShortcutIconResource.fromContext(UorderLauncher.this,  
  19.                R.drawable.icon));  
  20.        shortcutIcons.add(ShortcutIconResource.fromContext(UorderLauncher.this,  
  21.                R.drawable.icon));  
  22.        bundle.putParcelableArrayList(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, shortcutIcons);  
  23.          
  24.        Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);  
  25.        pickIntent.putExtra(Intent.EXTRA_INTENT,  
  26.                new Intent(Intent.ACTION_CREATE_SHORTCUT));  
  27.        pickIntent.putExtra(Intent.EXTRA_TITLE,  
  28.                res.getString(R.string.title_select_app));  
  29.        //将附加信息加入到pickIntent  
  30.        pickIntent.putExtras(bundle);  
  31.          
  32.        startActivityForResult(pickIntent, REQUEST_PICK_SHORTCUT);     


二、调用应用程序列表

当我们点击我们附加的项“应用程序”时,我们希望弹出应用程序列表,这个也可以条用系统自带列表,也可以使用自己定义的列表。

1、调用系统应用信息列表

在上面我们加上了一个附加项“应用程序”,那么我们怎么知道,当前点击的是“应用程序”这一项呢?注意上面我们启动的时候是startActivityForResult(pickIntent, REQUEST_PICK_SHORTCUT);

在onActivityResult中处理该请求对应的逻辑:如果用户选择的是“应用程序”,则调用系统应用程序列表,否则,直接请求创建快捷方式

[java]  view plain copy
 
  1. private void addShortcut(Intent data){  
  2.     Resources res = getResources();  
  3.       
  4.     final String appName = res.getString(R.string.group_application);  
  5.     final String shortcutName = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);  
  6.     if(appName.equals(shortcutName)){  
  7.         //说明用户选择的是应用程序,进入应用程序列表  
  8.         Intent mainIntent = new Intent(Intent.ACTION_MAIN,null);  
  9.         mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);  
  10.           
  11.         Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);  
  12.         pickIntent.putExtra(Intent.EXTRA_INTENT, mainIntent);  
  13.         startActivityForResult(pickIntent, REQUEST_PICK_APPLICATION);  
  14.     }else{  
  15.         //否则,直接创建快捷方式  
  16.         startActivityForResult(data, REQUEST_CREATE_SHORTCUT);  
  17.     }  
  18. }  



这样,就实现点击“应用程序”则显示应用程序列表,否则,创建快捷方式

2、获取所有应用程序信息,实现自定义的应用程序列表

其实,对于系统中所有应用程序的信息,程序中都是可以获取到的。在桌面点击的时候用的是系统自带的应用程序列表。但是,当点击桌面下方的应用程序图标的时候,就需要显示一个GridView显示所有的应用程序信息,这里,就需要获取应用程序信息,然后放入每一个item中。这里就顺带实现一下。布局和效果略过,只记录如果获取应用程序信息。

[java]  view plain copy
 
  1. /** 
  2.  * 同样,以ACTION_MAIN和CATEGORY_LAUNCHER作为过滤条件 
  3.  * 查询所有符合的应用信息(ResolveInfo) 
  4.  * ResolveInfo中就包含了我们需要的主要信息。 
  5.  * 当然还有其他的方式获取应用信息,如PackageInfo,关于这些信息,可以参看 
  6.  * http://android.tgbus.com/Android/tutorial/201108/364210.shtml 
  7.  */  
  8.   
  9. final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);  
  10. mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);  
  11. final PackageManager pManager = this.getPackageManager();  
  12. /** 
  13.  * queryIntentActivities通过解析所有应用程序中含有如下Intent-filter的App 
  14.  * <intent-filter> 
  15.  *      <action android:name="android.intent.action.MAIN" /> 
  16.  *      <category android:name="android.intent.category.LAUNCHER" /> 
  17.  * </intent-filter> 
  18.  */  
  19. final List<ResolveInfo> infoList = pManager.queryIntentActivities(mainIntent, 0);  
  20. if(infoList != null){  
  21.     ArrayList<AppInfo> appList = new ArrayList<AppInfo>();  
  22.     for(ResolveInfo info : infoList){  
  23.         AppInfo app = makeAppInfo(pManager, info);  
  24.         appList.add(app);  
  25.     }  
  26.     return appList;  
  27. }  
  28.   
  29. return null;  


程序还包含了一个makeAppInfo(pManager, info);这个方法源码是:

[java]  view plain copy
 
  1. private AppInfo makeAppInfo(PackageManager pManager, ResolveInfo info) {  
  2.     //有了ComponentName,就可以保存每个应用程序的启动信息  
  3.     //下次我们可以直接启动它  
  4.     ComponentName component = new ComponentName(info.activityInfo.applicationInfo.packageName,  
  5.             info.activityInfo.name);  
  6.     //这个是自己定义的一个用来封装我们需要的应用程序的信息  
  7.     AppInfo app = new AppInfo();  
  8.       
  9.     //获取应用的名称  
  10.     CharSequence appName = info.loadLabel(pManager);  
  11.     if(appName == null){  
  12.         //如果没有成功获取到,则用其主Activity的名字作为应用名称  
  13.         appName = info.activityInfo.name;  
  14.     }  
  15.     app.name = appName.toString();  
  16.       
  17.     //获取应用程序的图标  
  18.     Drawable draw = info.activityInfo.loadIcon(pManager);  
  19.       
  20.     //应用程序图片可以大小不一,这里需要将他们的size限定在一定的大小  
  21.     app.icon = BitmapUtils.createIconThumbnail(draw, getApplicationContext());  
  22.       
  23.     //将启动信息保存在AppInfo中,在我们的应用中启动另一个应用程序,使用FLAG_ACTIVITY_NEW_TASK  
  24.     app.setActivity(component, Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  25.       
  26.     return app;  
  27. }  

 

这样就得到了所有的应用程序信息。系统Launcher在其GridView中列出的所有应用就是这么获取的。

 

三、获取应用程序信息的其他方式:

下面这个获取到的应用信息,你会发现比上面的方法多了很多,因为其获得的是系统中所有的安装包信息

[java]  view plain copy
 
  1. List<PackageInfo> packageList = this.getPackageManager().getInstalledPackages(0);  
  2. appList = new ArrayList<AppInfo>();  
  3. for(PackageInfo info : packageList){  
  4.     CharSequence appName = info.applicationInfo.loadLabel(getPackageManager());  
  5.     if(TextUtils.isEmpty(appName)){  
  6.         appName = info.packageName;  
  7.     }  
  8.     //加上下面这个if条件就把系统自带的应用给过滤掉了,获取到的仅仅是我们自己安装的  
  9.     if((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)<=0){  
  10.         ComponentName comp = getComponentName(info.packageName);  
  11.           
  12.         AppInfo appInfo = new AppInfo();  
  13.         appInfo.icon = info.applicationInfo.loadIcon(getPackageManager());  
  14.         appInfo.name = appName.toString();  
  15.         appInfo.setActivity(comp, Intent.FLAG_ACTIVITY_NEW_TASK|  
  16.                 Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);  
  17.           
  18.         appList.add(appInfo);                 
  19.     }  
  20. }  



程序中调用了getComponentName,其源码是:

[java]  view plain copy
 
  1. private ComponentName getComponentName(String packageName) {  
  2.     Intent intent = new Intent(Intent.ACTION_MAIN, null);  
  3.     intent.addCategory(Intent.CATEGORY_LAUNCHER);  
  4.     intent.setPackage(packageName);  
  5.       
  6.     List<ResolveInfo> infoList = getPackageManager().queryIntentActivities(intent, 0);  
  7.     if(infoList != null && infoList.size()>0){  
  8.         ResolveInfo info = infoList.get(0);  
  9.         if(info != null){  
  10.             String pkgName = info.activityInfo.packageName;  
  11.             String clsName = info.activityInfo.name;  
  12.             return new ComponentName(pkgName, clsName);  
  13.         }  
  14.     }  
  15.     return null;  
  16. }  

 

到处,也就很清楚Launcher中长按桌面,应用程序是如何选择和在GridView中的应用程序信息是如何获取到的了。

相关文章
|
7月前
|
XML Java Android开发
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
215 0
|
Android开发 架构师
Android:动态更换桌面ICON
前言 当老板和产品提出这种需求的时候,我并不感到害怕,心里甚至有点窃喜,因为大厂基本都有这种效果,那肯定也好实现。当我一查资料的时候,发现情况不容乐观。
3897 0
|
7月前
|
Java Android开发
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
Android桌面快捷方式图标生成与删除 使用Intent与launcher交互
129 1
|
7月前
|
Java Android开发
Android 长按桌面显示菜单的代码
Android 长按桌面显示菜单的代码
52 0
|
XML 测试技术 API
【Android开发日常】一文弄懂桌面图标快捷菜单 & 桌面小组件
开发可以定义快捷方式,以便在应用中执行特定操作。 这些快捷方式可在受支持的启动器或助理(如 Google 助理)中显示,方便用户快速启动应用中的常见任务或推荐任务。 通过本文你还将了解一些可提升快捷方式效果的最佳做法。
1127 1
|
双11 Android开发
Android动态来改变App桌面图标
其实对于这样的一个桌面图标更换,Android中为我们提供了AndroidManifest.xml里的<activity-alias>标签实现方式。
367 0
|
XML 缓存 数据库
Android桌面小部件开发,及注意事项
Android桌面小部件开发,及注意事项
507 0
|
Web App开发 监控 安全
开发者曝 Android 13 “彩蛋”功能!虚拟化支持运行 Windows 11 和桌面版 Linux
开发者曝 Android 13 “彩蛋”功能!虚拟化支持运行 Windows 11 和桌面版 Linux
576 0
开发者曝 Android 13 “彩蛋”功能!虚拟化支持运行 Windows 11 和桌面版 Linux
|
XML Android开发 数据格式
Android之在launcher里面动态加载桌面图标
Android之在launcher里面动态加载桌面图标
232 0
|
Android开发 开发者
Android 桌面角标二三事
Android 角标学习一下!
1500 0