手把手教你开发安卓Launcher.doc_第1页
手把手教你开发安卓Launcher.doc_第2页
手把手教你开发安卓Launcher.doc_第3页
手把手教你开发安卓Launcher.doc_第4页
手把手教你开发安卓Launcher.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

launcher,也就是android的桌面应用程序。下图是android2.3的launcher应用程序:接下来我们要开发一个自己的launcher,使其替代系统的默认launcher。怎样使我们的应用程序成为一个launcher?下面我们就新建一个叫做MyHome的工程,具体步骤略。创建完工程后整个目录结构如下图:现在我们的AndroidManifest.xml文件这样的:请注意里面的内容。下面我们在其中添加上以下两行:?12此时AndroidManifest.xml文件是这样:?1234567891011121314151617181920此时运行程序,我们看不到任何特别之处。当按下home键时(模拟器上按下home会调出桌面应用),程序如图:我们看到了,我们开发的Myhome跟Launcher出现在了一起。重启模拟器,我们看到我们自己的程序已经可以作为home来运行了。ok。 第一步完成了:把我们的应用程序作为home。总结一下:要把我们的应用程序作为home,只需要在AndroidManifest.xml中添加:android手把手教你开发launcher (二)第二课:列出安装的应用程序预备知识: GridView的使用 改写BaseAdapter列出已经安装的应用程序是作为launcher必不可少的功能。下面我们就讲解怎样将应用程序列出来。程序运行后的样子如下:一. 修改main.xml,在其中添加一个GridView用来显示应用程序列表。修改后如下:?123456789101112二 . 通过PackageManager的api 查询已经安装的apk我们写一个叫做loadApps的方法将活得的应用程序列表放到private List mApps; 中,如下:?123456private void loadApps() Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);mApps = getPackageManager().queryIntentActivities(mainIntent, 0);三. 实现用于显示Gridview的Adapter,使其显示获得的应用程序列表直接上代码:?123456789101112131415161718192021222324252627282930313233343536373839404142public class AppsAdapter extends BaseAdapter public AppsAdapter() public View getView(int position, View convertView, ViewGroup parent) ImageView i;if (convertView = null) i = new ImageView(MyHome.this);i.setScaleType(ImageView.ScaleType.FIT_CENTER);i.setLayoutParams(new GridView.LayoutParams(50, 50); else i = (ImageView) convertView;ResolveInfo info = mApps.get(position);i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager();return i;public final int getCount() return mApps.size();public final Object getItem(int position) return mApps.get(position);public final long getItemId(int position) return position;最后整个Activity的代码如下?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687package org.bangchui.myhome;import java.util.List;import android.app.Activity;import android.content.Intent;import android.content.pm.ResolveInfo;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;public class MyHome extends Activity GridView mGrid;/* Called when the activity is first created. */Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);loadApps();setContentView(R.layout.main);mGrid = (GridView) findViewById(R.id.apps_list);mGrid.setAdapter(new AppsAdapter();private List mApps;private void loadApps() Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);mApps = getPackageManager().queryIntentActivities(mainIntent, 0);public class AppsAdapter extends BaseAdapter public AppsAdapter() public View getView(int position, View convertView, ViewGroup parent) ImageView i;if (convertView = null) i = new ImageView(MyHome.this);i.setScaleType(ImageView.ScaleType.FIT_CENTER);i.setLayoutParams(new GridView.LayoutParams(50, 50); else i = (ImageView) convertView;ResolveInfo info = mApps.get(position);i.setImageDrawa ble(info.activityInfo.loadIcon(getPackageManager();return i;public final int getCount() return mApps.size();public final Object getItem(int position) return mApps.get(position);public final long getItemId(int position) return position;第三课 启动安装的应用程序1. 监听GridView的onItemClick事件设置一个监听器是为了当gridView的某项被点击时,会有一个回调函数通知我们。我们调用mGrid.setOnItemClickListener(listener); 设置一个监听器mGrid.setOnItemClickListener(listener)中的listener是一个接口,其类型为:android.widget.AdapterView.OnItemClickListener,如下图所示:下面我们new一个android.widget.AdapterView.OnItemClickListener类型的对象作为参数。我们直接使用eclipde的自动补全功能来完成OnItemClickListener 的定义:?12345private OnItemClickListener listener = new OnItemClickListener() Overridepublic void onItemClick(AdapterView parent, View view, int position,long id) ;接口OnItemClickListener 中有一个方法叫做onItemClick,我们实现它即可。下面我对onItemClick的几个参数略作说明:parent 略view被点击的viewposition 被点击项的位置id 被点击项的id2.启动被点击应用的activity一般来讲,我们根据position即可知道被点击的项目是哪一项了。现在我们根据被点击的项目,取出对应的应用程序数据(主要是其中的主activity),然后启动activity。用下面代码实现:?123456789101112131415Overridepublic void onItemClick(AdapterView parent, View view, int position,long id) ResolveInfo info = mApps.get(position);/该应用的包名String pkg = info.activityInfo.packageName;/应用的主activity类String cls = info.activityI;ComponentName componet = new ComponentName(pkg, cls);Intent i = new Intent();i.setComponent(componet);startActivity(i);例如,我们点击计算器时,启动了计算器,如下图:现在整个类代码如下:复制代码1. package org.bangchui.myhome;2.3. import java.util.List;4.5. import android.app.Activity;6. import android.content.ComponentName;7. import android.content.Intent;8. import android.content.pm.ResolveInfo;9. import android.os.Bundle;10. import android.view.View;11. import android.view.ViewGroup;12. import android.widget.AdapterView;13. import android.widget.BaseAdapter;14. import android.widget.GridView;15. import android.widget.ImageView;16. import android.widget.AdapterView.OnItemClickListener;17.18. public class MyHome extends Activity 19. private List mApps;20. GridView mGrid;21. private OnItemClickListener listener = new OnItemClickListener() 22. Override23. public void onItemClick(AdapterView parent, View view, int position,long id) 24. ResolveInfo info = mApps.get(position);25. 26. /该应用的包名27. String pkg = info.activityInfo.packageName;28. /应用的主activity类29. String cls = info.activityI;30. 31. ComponentName componet = new ComponentName(pkg, cls);32. 33. Intent i = new Intent();34. i.setComponent(componet);35. startActivity(i);36. 37.38. ;39.40. /* Called when the activity is first created. */41. Override42. public void onCreate(Bundle savedInstanceState) 43. super.onCreate(savedInstanceState);44.45. loadApps();46. setContentView(R.layout.main);47. mGrid = (GridView) findViewById(R.id.apps_list);48. mGrid.setAdapter(new AppsAdapter();49.50. mGrid.setOnItemClickListener(listener);51. 52.53.54. private void loadApps() 55. Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);56. mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);57.58. mApps = getPackageManager().queryIntentActivities(mainIntent, 0);59. 60.61. public class AppsAdapter extends BaseAdapter 62. public AppsAdapter() 63. 64.65. public View getView(int position, View convertView, ViewGroup parent) 66. ImageView i;67.68. if (convertView = null) 69. i = new ImageView(MyHome.this);70. i.setScaleType(ImageView.ScaleType.FIT_CENTER);71. i.setLayoutParams(new GridView.LayoutParams(50, 50);72. else 73. i = (ImageView) convertView;74. 75.76. ResolveInfo info = mApps.get(position);77. i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager();78.79. return i;80. 81.82. public final int getCount() 83. return mApps.size();84. 85.86. public final Object getItem(int position) 87. return mApps.get(position);88. 89.90. public final long getItemId(int position) 91. return position;92. 93. 94. 我们在前面的课程中已经列出了安装的应用程序,并且点击后可以启动应用程序了!下面我们来研究如何显示widget。源代码:附件出售:TestWidget.7z我们要达到这样的效果:点击“add widget” 后弹出widget列表,之后选择一个widget后显示在界面上,如下:第四课:显示widget1. 获取widget信息获取widget其实非常简单,我们只需要发送一个请求到系统,系统就会打开widget的列表,然后我们选择一个即可。代码如下:?1234567void addWidget() int appWidgetId = mAppWidgetHost.allocateAppWidgetId();Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);/ start the pick activitystartActivityForResult(pickIntent, bREQUEST_PICK_APPWIDGET/b);2. 添加widget的view到layout中当选择一个widget后会通过onActivityResult 通知到activity,widget的信息被包含在 Intent data中,详情看代码注释?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889Overrideprotected void onActivityResult(int 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_SHORTCUT.if (resultCode = RESULT_OK) switch (requestCode) case REQUEST_PICK_APPWIDGET:addAppWidget(data);break;case REQUEST_CREATE_APPWIDGET:completeAddAppWidget(data);break;void addAppWidget(Intent data) / TODO: catch bad widget exception when sentint appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1);AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);/widget 包含设置信息不为空,则启动widget的设置界面if (appWidget.configure != null) / Launch over to configure widget, if neededIntent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);intent.setComponent(appWidget.configure);intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);startActivityForResultSafely(intent, REQUEST_CREATE_APPWIDGET); else /widget 包含设置信息为空,直接添加widget到layout中/ Otherwise just add itonActivityResult(REQUEST_CREATE_APPWIDGET, Activity.RESULT_OK, data);void startActivityForResultSafely(Intent intent, int requestCode) try startActivityForResult(intent, requestCode); catch (ActivityNotFoundException e) Toast.makeText(this, activity_not_found, Toast.LENGTH_SHORT).show(); catch (SecurityException e) Toast.makeText(this, activity_not_found, Toast.LENGTH_SHORT).show();/* 添加widget信息到layout中 * param data 包含了widget的信息*/private void completeAddAppWidget(Intent data) Bundle extras = data.getExtras();int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);Log.d(TAG, dumping extras content= + extras.toString();AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);/ Perform actual inflation becaus

温馨提示

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

最新文档

评论

0/150

提交评论