程序运行效果图:

    获取软件信息

    扫描并启动手机上的软件

    程序代码:

    1. /**
    2. * 获取所有软件信息
    3. * 1.通过异步的方式显示系统中所有软件
    4. * 2.单击打开指定软件
    5. * 3.将所有软件的包名和activity名保存的本地SharedPreferences
    6. * @author jph
    7. * Date:2014.09.21
    8. */
    9. public class ScanPackage1 extends Activity {
    10. /**扫描成功**/
    11. private final static int FLAG_LOAD_SUCCESS=0x10001;
    12. private final static int SCANNING=0x10002;
    13. private ListView list;
    14. private List<Map<String, Object>>items=new ArrayList<Map<String,Object>>();
    15. private SimpleAdapter adapter;
    16. // 取得所有安装软件信息
    17. private List<PackageInfo> allPackageInfos;
    18. // 取得自己安装的软件信息
    19. private List<PackageInfo> userPackageInfos;
    20. // 取得系统安装的软件信息
    21. private List<PackageInfo> sysPackageInfos;
    22. Handler mHandler=new Handler(){
    23. @Override
    24. public void handleMessage(Message msg) {
    25. // TODO Auto-generated method stub
    26. switch (msg.what) {
    27. case FLAG_LOAD_SUCCESS://完成扫描
    28. break;
    29. case SCANNING://正在扫描
    30. items.add((Map<String, Object>) msg.obj);
    31. //通知适配器数据改变
    32. adapter.notifyDataSetChanged();
    33. break;
    34. default:
    35. break;
    36. }
    37. }
    38. };
    39. @Override
    40. protected void onCreate(Bundle savedInstanceState) {
    41. super.onCreate(savedInstanceState);
    42. setContentView(R.layout.sp_layout);
    43. list=(ListView)findViewById(R.id.list);
    44. new ScanThread().start();
    45. adapter=new SimpleAdapter(this, items, R.layout.line, new String[]{
    46. "imgIco","appName","packageName"
    47. }, new int[]{R.id.imgIco,R.id.tvAppName,R.id.tvAppDesc});
    48. list.setAdapter(adapter);
    49. //ViewBinder该类可以帮助SimpleAdapter加载图片(如:Bitmap,Drawable)
    50. adapter.setViewBinder(new ViewBinder() {
    51. @Override
    52. public boolean setViewValue(View view, Object data,
    53. String textRepresentation) {
    54. // TODO Auto-generated method stub
    55. if(view instanceof ImageView && data instanceof Drawable){
    56. ImageView iv = (ImageView) view;
    57. iv.setImageDrawable((Drawable) data);
    58. return true;
    59. }else{
    60. return false;
    61. }
    62. }
    63. });
    64. list.setOnItemClickListener(new OnItemClickListener() {
    65. @Override
    66. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
    67. long arg3) {
    68. // TODO Auto-generated method stub
    69. try {
    70. PackageInfo pInfo=allPackageInfos.get(arg2);
    71. Intent intent=new Intent();
    72. intent.setComponent(new ComponentName(pInfo.packageName, pInfo.activities[0].name));
    73. startActivity(intent);
    74. } catch (Exception e) {
    75. // TODO: handle exception
    76. e.printStackTrace();
    77. }
    78. }
    79. });
    80. }
    81. // *********--------*创建一个线程加载安装程序*--------------***********//
    82. private class ScanThread extends Thread {
    83. @Override
    84. public void run() {
    85. // 取得系统安装所有软件信息
    86. allPackageInfos = getPackageManager().getInstalledPackages(
    87. PackageManager.GET_UNINSTALLED_PACKAGES
    88. | PackageManager.GET_ACTIVITIES);
    89. // 定义用户安装软件信息包
    90. userPackageInfos = new ArrayList<PackageInfo>();
    91. // 定义系统安装软件信息包
    92. sysPackageInfos = new ArrayList<PackageInfo>();
    93. // 循环取出所有软件信息
    94. for (int i = 0; i < allPackageInfos.size(); i++) {
    95. // 得到每个软件信息
    96. PackageInfo temp = allPackageInfos.get(i);
    97. ApplicationInfo appInfo = temp.applicationInfo;
    98. if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0
    99. || (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
    100. //系统软件
    101. sysPackageInfos.add(temp);
    102. } else {
    103. //用户自己安装软件
    104. userPackageInfos.add(temp);
    105. }
    106. //获取程序的图标
    107. Drawable ico=ScanPackage1.this.getPackageManager().getApplicationIcon(appInfo);
    108. //获取程序的名称
    109. String appName=(String) ScanPackage1.this.getPackageManager().getApplicationLabel(appInfo);
    110. Map<String, Object>item=new HashMap<String, Object>();
    111. //获取程序的包名
    112. String packageName=appInfo.packageName;
    113. item.put("imgIco", ico);
    114. item.put("appName", appName);
    115. item.put("packageName", packageName);
    116. Message message = new Message();
    117. message.what =SCANNING;
    118. message.obj = item;
    119. mHandler.sendMessage(message);
    120. }
    121. saveInfo(sysPackageInfos, userPackageInfos);
    122. mHandler.sendEmptyMessage(FLAG_LOAD_SUCCESS);
    123. }
    124. };
    125. /**
    126. * 将系统中所装程序的信息写入到配置文件
    127. * @param sysPackageInfos 系统安装软件信息包
    128. * @param userPackageInfos 用户安装软件信息包
    129. */
    130. private void saveInfo(List<PackageInfo> sysPackageInfos,List<PackageInfo> userPackageInfos) {
    131. //将用户安装的软件添加到添加到系统软件的集合中
    132. sysPackageInfos.addAll(userPackageInfos);
    133. SharedPreferences sp = this.getSharedPreferences("appInfs",
    134. MODE_PRIVATE);
    135. Editor editor = sp.edit();
    136. for (int i = 0; i < sysPackageInfos.size(); i++) {
    137. try {
    138. //获取程序的包名
    139. String packageName = sysPackageInfos.get(i).packageName;
    140. // 取出activity信息
    141. ActivityInfo activityInfo = sysPackageInfos.get(i).activities[0];
    142. // 取出activity名字
    143. String activityName=activityInfo.name;
    144. //将程序的信息写入到配置文件
    145. editor.putString(packageName, activityName);
    146. } catch (Exception e) {
    147. // TODO: handle exception
    148. e.printStackTrace();
    149. }
    150. }
    151. editor.commit();
    152. }
    153. }