基于android手把手教你开发launcher.doc_第1页
基于android手把手教你开发launcher.doc_第2页
基于android手把手教你开发launcher.doc_第3页
基于android手把手教你开发launcher.doc_第4页
基于android手把手教你开发launcher.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于android手把手教你开发launcher launcher,也就是android的桌面应用程序。下图是android2.3的launcher应用程序:?接下来我们要开发一个自己的launcher,使其替代系统的默认launcher。怎样使我们的应用程序成为一个launcher?下面我们就新建一个叫做MyHome的工程,具体步骤略。创建完工程后整个目录结构如下图:现在我们的AndroidManifest.xml文件这样的:?xml version1.0 encodingutf-8?manifest xmlns:android/0.?package/.ome?android:versionCode1?android:versionName1.0application android:icondrawable/icon android:labelstring/app_nameactivity android:name.MyHome?android:labelstring/app_name?intent-filter?action android:name/.ion.MAIN /?category android:name/.egory.LAUNCHER /?/intent-filter请注意intent-filter/intent-filter里面的内容。下面我们在其中添加上以下两行:12category android:name/.egory.HOME /category android:name/.egory.DEFAULT /此时AndroidManifest.xml文件是这样:1234567891011121314151617181920?xml version1.0 encodingutf-8?manifest xmlns:android/.?package/.ome?android:versionCode1?android:versionName1.0application android:icondrawable/icon android:labelstring/app_nameactivity android:name.MyHome?android:labelstring/app_name?intent-filter?action android:name/.ion.MAIN /?category android:name/.egory.LAUNCHER /?category android:name/.egory.HOME /?category android:name/.egory.DEFAULT /?/intent-filter此时运行程序,我们看不到任何特别之处。当按下home键时(模拟器上按下home会调出桌面应用),程序如图:我们看到了,我们开发的Myhome跟Launcher出现在了一起。?重启模拟器,我们看到我们自己的程序已经可以作为home来运行了。ok。 第一步完成了:把我们的应用程序作为home。总结一下:要把我们的应用程序作为home,只需要在AndroidManifest.xml中添加:?category android:name/.egory.HOME /?category android:name/.egory.DEFAULT /android手把手教你开发launcher (二)第二课:列出安装的应用程序预备知识: GridView的使用 改写BaseAdapter?列出已经安装的应用程序是作为launcher比不可少的功能。下面我们就讲解怎样将应用程序列出来。程序运行后的样子如下:一. 修改main.xml,在其中添加一个GridView用来显示应用程序列表。修改后如下:123456789101112?xml version1.0 encodingutf-8?LinearLayout xmlns:android/.?android:orientationvertical android:layout_widthfill_parent?android:layout_heightfill_parent?GridView android:layout_widthmatch_parentandroid:id+id/apps_listandroid:numColumns4android:layout_heightwrap_content二通过PackageManager的api 查询已经安装的apk我们写一个叫做loadApps的方法将活得的应用程序列表放到private List mApps; 中,如下:123456private void loadApps Intent mainIntent new IntentIntent.ACTION_MAIN, null;/.EGORY_LAUNCHER;?mApps getPackageManager.queryIntentActivitiesmainIntent, 0;?三. 实现用于显示Gridview的Adapter,使其显示获得的应用程序列表直接上代码:123456789101112131415161718192021222324252627282930313233343536373839404142public class AppsAdapter extends BaseAdapter public AppsAdapter ?public View getViewint position, View convertView, ViewGroup parent ?ImageView i;?if convertView null ?i new ImageViewMyHome.this;?/.leType.FIT_CENTER;?i.setLayoutParamsnew GridView.LayoutParams50, 50;? else ?i ImageView convertView;?ResolveInfo info mApps.getposition;?/.ivityInfo.loadIcongetPackageManager;?return i;?public final int getCount ?return mApps.size;?public final Object getItemint position ?return mApps.getposition;?public final long getItemIdint position ?return position;?最后整个Activity的代码如下123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687package /.ome;?import /.t;?import /.ivity;import /.ent;import /.ResolveInfo;import /.dle;import /.w;import /.wGroup;import /.eAdapter;import /.dView;import /.geView;?public class MyHome extends Activity ?GridView mGrid;?/* Called when the activity is first created. */?Override?public void onCreateBundle savedInstanceState super.onCreatesavedInstanceState;?loadApps;/.n;mGrid GridView /.s_list;mGrid.setAdapternew AppsAdapter;?private List mApps;private void loadApps Intent mainIntent new IntentIntent.ACTION_MAIN, null;/.EGORY_LAUNCHER;?mApps getPackageManager.queryIntentActivitiesmainIntent, 0;?public class AppsAdapter extends BaseAdapter public AppsAdapter ?public View getViewint position, View convertView, ViewGroup parent ?ImageView i;?if convertView null ?i new ImageViewMyHome.this;?/.leType.FIT_CENTER;?i.setLayoutParamsnew GridView.LayoutParams50, 50;? else ?i ImageView convertView;?ResolveInfo info mApps.getposition;?/.ivityInfo.loadIcongetPackageManager;?return i;?public final int getCount ?return mApps.size;?public final Object getItemint position ?return mApps.getposition;?public final long getItemIdint position ?return position;?第三课 启动安装的应用程序1. 监听GridView的onItemClick事件设置一个监听器是为了当gridView的某项被点击时,会有一个回调函数通知我们。我们调用mGrid.setOnItemClickListenerlistener; 设置一个监听器mGrid.setOnItemClickListenerlistener中的listener是一个接口,其类型为:/.pterView.OnItemClickListener,如下图所示:下面我们new一个/.pterView.OnItemClickListener类型的对象作为参数。我们直接使用eclipde的自动补全功能来完成OnItemClickListener 的定义:12345private OnItemClickListener listener new OnItemClickListener Overridepublic void onItemClickAdapterView? parent, View view, int position,long id ;接口OnItemClickListener 中有一个方法叫做onItemClick,我们实现它即可。下面我对onItemClick的几个参数略作说明:parent? 略view?被点击的viewposition? 被点击项的位置id 被点击项的id2.启动被点击应用的activity一般来讲,我们根据position即可知道被点击的项目是哪一项了。现在我们根据被点击的项目,取出对应的应用程序数据(主要是其中的主activity),然后启动activity。用下面代码实现:123456789101112131415Overridepublic void onItemClickAdapterView? parent, View view, int position,long id ?ResolveInfo info mApps.getposition;/该应用的包名?String pkg /.kageName;?/应用的主activity类?String cls /.e;ComponentName componet new ComponentNamepkg, cls;Intent i new Intent;?i.setComponentcomponet;?startActivityi;例如,我们点击计算器时,启动了计算器,如下图:现在整个类代码如下:复制代码package /.ome;import /.t;import /.ivity;import /.ponentName;import /.ent;import /.ResolveInfo;import /.dle;import /.w;import /.wGroup;import /.pterView;import /.eAdapter;import /.dView;import /.geView;import /.pterView.OnItemClickListener;public class MyHome extends Activity ?private List mApps;?GridView mGrid;?private OnItemClickListener listener new OnItemClickListener Overridepublic void onItemClickAdapterView? parent, View view, int position,long id ?ResolveInfo info mApps.getposition;?/该应用的包名?String pkg /.kageName;?/应用的主activity类?String cls /.e;?ComponentName componet new ComponentNamepkg, cls;?Intent i new Intent;?i.setComponentcomponet;?startActivityi;?;?/* Called when the activity is first created. */?Override?public void onCreateBundle savedInstanceState super.onCreatesavedInstanceState;loadApps;/.n;mGrid GridView /.s_list;mGrid.setAdapternew AppsAdapter;mGrid.setOnItemClickListenerlistener;?private void loadApps Intent mainIntent new IntentIntent.ACTION_MAIN, null;/.EGORY_LAUNCHER;mApps getPackageManager.queryIntentActivitiesmainIntent, 0;?public class AppsAdapter extends BaseAdapter public AppsAdapter public View getViewint position, View convertView, ViewGroup parent ?ImageView i;?if convertView null ?i new ImageViewMyHome.this;?/.leType.FIT_CENTER;?i.setLayoutParamsnew GridView.LayoutParams50, 50;? else ?i ImageView convertView;?ResolveInfo info mApps.getposition;?/.ivityInfo.loadIcongetPackageManager;?return i;public final int getCount ?return mApps.size;public final Object getItemint position ?return mApps.getposition;public final long getItemIdint position ?return position;?我们在前面的课程中已经列出了安装的应用程序,并且点击后可以启动应用程序了!下面我们来研究如何显示widget。源代码:?附件出售:TestWidget.7z?我们要达到这样的效果:点击“add widget” 后弹出widget列表,之后选择一个widget后显示在界面上,如下:第四课:显示widget1. 获取widget信息获取widget其实非常简单,我们只需要发送一个请求到系统,系统就会打开widget的列表,然后我们选择一个即可。代码如下:1234567void addWidget int appWidgetId mAppWidgetHost.allocateAppWidgetId;Intent pickIntent new IntentAppWidgetManager.ACTION_APPWIDGET_PICK;/.RA_APPWIDGET_ID, appWidgetId;/ start the pick activitystartActivityForResultpickIntent, bREQUEST_PICK_APPWIDGET/b;?2. 添加widget的view到layout中当选择一个widget后会通过onActivityResult 通知到activity,widget的信息被包含在 Intent data中,详情看代码注释1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889?Override?protected void onActivityResultint requestCode, int resultCode, Intent data / The pattern used here is that a user PICKs a specific application,/ which, depending on the target, might need to CREATE the actual/ target/ For example, the user would PICK_SHORTCUT for Music playlist, and/ we/ launch over to the Music app to actually CREATE_SHORTCUTif resultCode RESULT_OK ?switch requestCode ?case REQUEST_PICK_APPWIDGET:?addAppWidgetdata;?break;?case REQUEST_CREATE_APPWIDGET:?completeAddAppWidgetdata;?break;?void addAppWidgetIntent data / TODO: catch bad widget exception when sentint appWidgetId /.RA_APPWIDGET_ID,?-1;AppWidgetProviderInfo appWidget mAppWidgetManagergetAppWidgetInfoappWidgetId;?/widget 包含设置信息不为空,则启动widget的设置界面if appWidget.configure ! null ?/ Launch over to configure widget, if needed?Intent intent new IntentAppWidgetManager.ACTION_APPWIDGET_CONFIGURE;?/.figure;?/.RA_APPWIDGET_ID, appWidgetId;startActivityForResultSafelyintent, REQUEST_CREATE_APPWIDGET; else /?widget 包含设置信息为空,直接添加widget到layout中?/ Otherwise just add it?onActivityResultREQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data;?void startActivityForResultSafelyIntent intent, int requestCode try ?startActivityForResultintent, requestCode; catch ActivityNotFoundException e ?Toast.makeTextthis, activity_not_found, Toast.LENGTH_SHORT.show; catch SecurityException e ?Toast.makeTextthis, activity_not_found, Toast.LENGTH_SHORT.show;?/* 添加widget信息到layout中?* param data 包含了widget的信息*/?private void completeAddAppWidgetIntent data Bundle extras data.getExtras;int appWidgetId extrasgetIntAppWidgetManager.EXTRA_APPWIDGET_ID, -1;?Log.dTAG, dumping extras content + extras.toString;?AppWidgetProviderInfo appWidgetInfo mAppWidgetManagergetAppWidgetInfoappWidgetId;?/ Perform actual inflation because were livesynchronized mLock /获取显示widget的view?mHostView mAppWidgetHost.createViewthis, appWidgetId,appWidgetInfo;?mHostView.setAppWidgetappWidgetId, appWidgetInfo;/将获取的view添加早layout中?LayoutParams lp new /.Width, appWidgetInfo.minHeight;?mainLayout.addViewmHostView, lp;mHostView.requestLayout;?显示壁纸也是launcher必不可少的功能,下面我们看看如何让我们开发的launcher来显示壁纸。新建一个叫做ShowWallpaper的工程,具体步骤略。一. 显示壁纸要在我们的activity里显示一个壁纸非常简单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论