launcher,也就是android的桌面应用程序。下图是android2.3的launcher应用程序: 接下来我们要开发一个自己的launcher,使其替代系统的默认launcher。怎样使我们的应用程序成为一个launcher?下面我们就新建一个叫做MyHome的工程,具体步骤略。创建完工程后整个目录结构如下图: 现在我们的AndroidManifest.xml文件这样的:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android" package="org.bangchui.myhome" android:versionCode="1" android:versionName="1.0"> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MyHome" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application></manifest>请注意<intent-filter></intent-filter>里面的内容。下面我们在其中添加上以下两行:?12<categoryandroid:name="android.intent.category.HOME"/><categoryandroid:name="android.intent.category.DEFAULT"/>此时AndroidManifest.xml文件是这样:?1234567891011121314151617181920<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="http://schemas.android.com/apk/res/android" package="org.bangchui.myhome" android:versionCode="1" android:versionName="1.0"> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MyHome" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> <categoryandroid:name="android.intent.category.HOME"/> <categoryandroid:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> </application></manifest>此时运行程序,我们看不到任何特别之处。当按下home键时(模拟器上按下home会调出桌面应用),程序如图: 我们看到了,我们开发的Myhome跟Launcher出现在了一起。 重启模拟器,我们看到我们自己的程序已经可以作为home来运行了。ok。第一步完成了:把我们的应用程序作为home。
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
一下:要把我们的应用程序作为home,只需要在AndroidManifest.xml中添加: <categoryandroid:name="android.intent.category.HOME"/> <categoryandroid:name="android.intent.category.DEFAULT"/>android手把手教你开发launcher(二)第二课:列出安装的应用程序预备知识:GridView的使用\改写BaseAdapter 列出已经安装的应用程序是作为launcher比不可少的功能。下面我们就讲解怎样将应用程序列出来。程序运行后的样子如下: 一.修改main.xml,在其中添加一个GridView用来显示应用程序列表。修改后如下:?123456789101112<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"> <GridViewandroid:layout_width="match_parent" android:id="@+id/apps_list" android:numColumns="4" android:layout_height="wrap_content"> </GridView> </LinearLayout>二.通过PackageManager的api查询已经安装的apk我们写一个叫做loadApps的方法将活得的应用程序列表放到privateList<ResolveInfo>mApps;中,如下:?123456privatevoidloadApps(){ IntentmainIntent=newIntent(Intent.ACTION_MAIN,null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); mApps=getPackageManager().queryIntentActivities(mainIntent,0); }‘三.实现用于显示Gridview的Adapter,使其显示获得的应用程序列表直接上代码:?123456789101112131415161718192021222324252627282930313233343536373839404142publicclassAppsAdapterextendsBaseAdapter{ publicAppsAdapter(){ } publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ ImageViewi; if(convertView==null){ i=newImageView(MyHome.this); i.setScaleType(ImageView.ScaleType.FIT_CENTER); i.setLayoutParams(newGridView.LayoutParams(50,50)); }else{ i=(ImageView)convertView; } ResolveInfoinfo=mApps.get(position); i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager())); returni; } publicfinalintgetCount(){ returnmApps.size(); } publicfinalObjectgetItem(intposition){ returnmApps.get(position); } publicfinallonggetItemId(intposition){ returnposition; } }最后整个Activity的代码如下?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687packageorg.bangchui.myhome; importjava.util.List; importandroid.app.Activity;importandroid.content.Intent;importandroid.content.pm.ResolveInfo;importandroid.os.Bundle;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.BaseAdapter;importandroid.widget.GridView;importandroid.widget.ImageView; publicclassMyHomeextendsActivity{ GridViewmGrid; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); loadApps(); setContentView(R.layout.main); mGrid=(GridView)findViewById(R.id.apps_list); mGrid.setAdapter(newAppsAdapter()); } privateList<ResolveInfo>mApps; privatevoidloadApps(){ IntentmainIntent=newIntent(Intent.ACTION_MAIN,null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); mApps=getPackageManager().queryIntentActivities(mainIntent,0); } publicclassAppsAdapterextendsBaseAdapter{ publicAppsAdapter(){ } publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ ImageViewi; if(convertView==null){ i=newImageView(MyHome.this); i.setScaleType(ImageView.ScaleType.FIT_CENTER); i.setLayoutParams(newGridView.LayoutParams(50,50)); }else{ i=(ImageView)convertView; } ResolveInfoinfo=mApps.get(position); i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager())); returni; } publicfinalintgetCount(){ returnmApps.size(); } publicfinalObjectgetItem(intposition){ returnmApps.get(position); } publicfinallonggetItemId(intposition){ returnposition; } }}第三课启动安装的应用程序1.监听GridView的onItemClick事件设置一个监听器是为了当gridView的某项被点击时,会有一个回调函数通知我们。我们调用mGrid.setOnItemClickListener(listener);设置一个监听器mGrid.setOnItemClickListener(listener)中的listener是一个接口,其类型为:android.widget.AdapterView.OnItemClickListener,如下图所示: 下面我们new一个android.widget.AdapterView.OnItemClickListener类型的对象作为参数。我们直接使用eclipde的自动补全功能来完成OnItemClickListener的定义:?12345privateOnItemClickListenerlistener=newOnItemClickListener(){@OverridepublicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){}};接口OnItemClickListener中有一个方法叫做onItemClick,我们实现它即可。下面我对onItemClick的几个参数略作说明:parent 略view 被点击的viewposition 被点击项的位置id 被点击项的id2.启动被点击应用的activity一般来讲,我们根据position即可知道被点击的项目是哪一项了。现在我们根据被点击的项目,取出对应的应用程序数据(主要是其中的主activity),然后启动activity。用下面代码实现:?123456789101112131415@Override publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){ ResolveInfoinfo=mApps.get(position); //该应用的包名 Stringpkg=info.activityInfo.packageName; //应用的主activity类 Stringcls=info.activityInfo.name; ComponentNamecomponet=newComponentName(pkg,cls); Intenti=newIntent(); i.setComponent(componet); startActivity(i); }例如,我们点击计算器时,启动了计算器,如下图: 现在整个类代码如下:复制代码1. packageorg.bangchui.myhome;2. 3. importjava.util.List;4. 5. importandroid.app.Activity;6. importandroid.content.ComponentName;7. importandroid.content.Intent;8. importandroid.content.pm.ResolveInfo;9. importandroid.os.Bundle;10. importandroid.view.View;11. importandroid.view.ViewGroup;12. importandroid.widget.AdapterView;13. importandroid.widget.BaseAdapter;14. importandroid.widget.GridView;15. importandroid.widget.ImageView;16. importandroid.widget.AdapterView.OnItemClickListener;17. 18. publicclassMyHomeextendsActivity{19. privateList<ResolveInfo>mApps;20. GridViewmGrid;21. privateOnItemClickListenerlistener=newOnItemClickListener(){22. @Override23. publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){24. ResolveInfoinfo=mApps.get(position);25. 26. //该应用的包名27. Stringpkg=info.activityInfo.packageName;28. //应用的主activity类29. Stringcls=info.activityInfo.name;30. 31. ComponentNamecomponet=newComponentName(pkg,cls);32. 33. Intenti=newIntent();34. i.setComponent(componet);35. startActivity(i);36. }37. 38. };39. 40. /**Calledwhentheactivityisfirstcreated.*/41. @Override42. publicvoidonCreate(BundlesavedInstanceState){43. super.onCreate(savedInstanceState);44. 45. loadApps();46. setContentView(R.layout.main);47. mGrid=(GridView)findViewById(R.id.apps_list);48. mGrid.setAdapter(newAppsAdapter());49. 50. mGrid.setOnItemClickListener(listener);51. }52. 53. 54. privatevoidloadApps(){55. IntentmainIntent=newIntent(Intent.ACTION_MAIN,null);56. mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);57. 58. mApps=getPackageManager().queryIntentActivities(mainIntent,0);59. }60. 61. publicclassAppsAdapterextendsBaseAdapter{62. publicAppsAdapter(){63. }64. 65. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){66. ImageViewi;67. 68. if(convertView==null){69. i=newImageView(MyHome.this);70. i.setScaleType(ImageView.ScaleType.FIT_CENTER);71. i.setLayoutParams(newGridView.LayoutParams(50,50));72. }else{73. i=(ImageView)convertView;74. }75. 76. ResolveInfoinfo=mApps.get(position);77. i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));78. 79. returni;80. }81. 82. publicfinalintgetCount(){83. returnmApps.size();84. }85. 86. publicfinalObjectgetItem(intposition){87. returnmApps.get(position);88. }89. 90. publicfinallonggetItemId(intposition){91. returnposition;92. }93. }