【翻译】我们要开发的就是这样一个解决方案。简介在最基本的概念层面上,启动器是一个执行以下操作的应用程序:它代表设备的主屏幕。它可以列出并启动设备上已安装的应用程序。换句话说,它是当用户按下主页按钮时出现的应用程序。除非你已经安装了自定义启动器,否则我们目前使用的应该是安卓系统自带的默认启动器。很多设备厂商会默认在他们的产品中使用他们定制的启动器,以确保我们得到符合厂商预期的外观和体验,比如三星TouchWiz和HTCSense。在今天的教程中,我们将创建一个带有基本用户界面的简单启动器,该界面由两个屏幕组成:主屏幕将显示设备的墙纸图像。另一个屏幕显示设备上已安装的应用程序的图标和其他详细信息。1.要求您需要在自己的开发设备上预安装和配置以下项目:AndroidSDK和平台工具EclipseIDE3.7.2或更高版本,并有ADT插件运行Android2.2的模拟器或更高版本或Android设备,您可以点击这里通过Android开发者门户下载相应的SDK和平台工具。2.项目设置首先我们需要启动Eclipse并创建一个新的Android应用程序项目。我为这个应用选择了一个非常直白的名字——SimpleLauncher,当然你可以自由选择你想要的名字。请确保包名称不与其他项目重复。我们的启动器支持的最新SDK版本是“FrozenYogurt”,主要目标版本是“JellyBean”。由于我们不打算创建活动,因此取消选中“创建活动”选项并单击“完成”继续。3.项目列表接下来,我们需要修改AndroidManifest.xml文件,添加两个活动。第一个Activity用于显示主屏幕,我们将其命名为HomeActivity,如下所示。通过将android.intent.category.HOME和android.intent.category.DEFAULT这两个类添加到intent-filter组,相关的Activity可以有同launcher概念对应的操作方式。当您按下设备上的主页按钮时,它也会显示为选项方案。我们还需要将launchMode设置为singleTask,以确保系统在任何时候都只运行一个Activity实例。要显示用户的壁纸图案,您必须将主题设置为Theme.Wallpaper.NoTitleBar.FullScreen。我们需要添加的第二个Activity负责显示用户设备上已安装的应用程序条目。它还有另外一个任务,就是启动这些应用程序。这个Activity我们不需要做任何特殊的配置,直接命名为AppsListActivity即可。4.下面的activity布局在res/layout文件夹下projectas为HomeActivity类创建一个XML文件并将其命名为activity_home.xml。该布局有一个响应触摸事件的按钮。点击此按钮会将用户从主屏幕带到应用程序列表。接下来在项目的res/layout文件夹下是AppsListActivity类创建一个XML文件并将其命名为activity_apps_list.xml。该布局包含一个占据整个屏幕的ListView。***,在在同一位置创建第三个XML文件并将其命名为list_item.xml。该文件用于定义ListView中每个项目的布局方案。列表视图中的每个条目代表一个已安装在用户设备上的应用程序。它显示应用程序的图标、标签和包名称。我们可以使用ImageView实例来显示应用程序的图标,并使用TextView实例来显示标签和包名称。5.创建Acitivity类HomeActivity应用的布局方案创建完成后,接下来需要做的就是创建两个Activity类在创建这两个类时,确保每个类的名称与我们之前在项目清单文件中指定的名称相匹配.创建一个名为HomeActivity的新类,并将android.app.Activity设置为其超类。packageah.hathi.simplelauncher;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;publicclassHomeActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceView(Rlay.Content);.您可能还记得,我们向activity_home布局添加了一个按钮,该按钮触发了一个名为showApps的方法。现在我们要做的就是将这个方法引入到HomeActivity类中。整个添加过程非常简单,只需要为AppsListActivity类创建一个Intent并运行即可。#p#AppsListActivity创建另一个名为AppsListActivity的Activity类,并将android.app.Activity设置为其超类。在这个类的onCreate方法中,我们调用了setContentView,传递给之前创建好的activity_apps_list布局。packageah.hathi.simplelauncher;importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;publicclassAppsListActivityextendsActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceView(Rlay..activity_apps_list);}}虽然我们的启动器解决方案尚未最终确定,但此时您可以保存现有内容并使用它在您的设备上启动应用程序。当您按下设备上的主页按钮时,您将能够弹出并询问哪个启动器我们要使用的计划。如果你选择SimpleLauncherHome,你可以看到你创建的新主屏幕,屏幕右上角有一个按钮。你还可以看到你设备上原来设置的壁纸图案。现在回去到Eclipse,创建一个名为AppDetail的类,里面会包含应用程序的详细信息,包名,标签,应用程序图标。接口很基础,可以用下面的代码来实现:packageah.hathi.simplelauncher;importandroid.graphics.drawable.Drawable;publicclassAppDetail{CharSequencelabel;CharSequencename;Drawableicon;}6.在AppsListActivity类的loadApps方法中获取应用,我们可以使用PackageManager类的queryIntentActivities方法获取所有IntentsIntent.CATEGORY_LAUNCHER类别。此查询返回可通过启动器启动的所有应用程序的列表。我们可以将查询返回的每个项目添加到名为apps的列表中。您可以通过以下代码片段详细了解其效果。privatePackageManagermanager;privateListapps;privatevoidloadApps(){manager=getPackageManager();apps=newArrayList();Intenti=newIntent(Intent.ACTION_MAIN,null);i.addCategory(Intent.CATEGORY_LAUNCHER);ListavailableActivities=manager.queryIntentActivities(i,0);for(ResolveInfori:availableActivities){AppDetailapp=newAppDetail();app.label=ri.loadLabel(manager);app.name=ri.activityInfo.packageName;app.icon=ri.activityInfo.loadIcon(manager);apps.add(app);}}7.显示应用列表由于apps变量包含了我们需要的所有细节,你可以使用ListView类来显示完整的应用列表。我们先创建一个简单的ArrayAdapter,重写它的getView方法,获取列表中的入口信息。接下来,将ListView与适配器相关联。privateListViewlist;privatevoidloadListView(){list=(ListView)findViewById(R.id.apps_list);ArrayAdapteradapter=newArrayAdapter(this,R.layout.list_item,apps){@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){if(convertView==null){convertView=getLayoutInflater().inflate(R.layout.list_item,null);}ImageViewappIcon=(ImageView)convertView.findViewById(R.id.item_app_icon);appIcon.setImageDrawable(apps.get(position).icon);TextViewappLabel=(TextView)convertView.findViewById(R.id.item_app_label);appLabel.setText(apps.get(position).label);TextViewappName=(TextView)convertView.findViewById(R.id.item_app_name);appName.setText(apps.get(position).name);returnconvertView;}};list.setAdapter(adapter);}8.监听触摸操作当用户触摸ListView中的某个项目时,我们的启动器应该能够运行相应的应用程序。我们可以通过PackageManager类中的getLaunchIntentForPackage方法创建一个Intent来指定我们要启动哪个应用程序。请查看下面的代码片段。privatevoidaddClickListener(){list.setOnItemClickListener(newAdapterView.OnItemClickListener(){@OverridepublicvoidonItemClick(AdapterView>av,Viewv,intpos,longid){Intenti=manager.getLaunchIntentForPackage(apps.get(pos).name.toString());AppsListActivity.this.startActivity(i);}});}9.通过整合实现完整的功能为了整合上述所有内容,实现完整的功能,我们需要调用loadApps、loadListView和addClickListener,具体代码如下。protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_apps_list);loadApps();loadListView();addClickListener();}现在编译并运行我们的启动器应用程序并再次运行它以查看结果。您现在应该能够看到所有可以通过单击主启动器屏幕中的按钮启用的应用程序。不要犹豫,触摸其中一个并尝试一下。总结您现在拥有自己的自定义启动器。它非常简单粗暴,但是我们可以不断地给它添加更多的特性,让它逐渐完善。如果您想详细了解可以在启动器中包含哪些自定义项,我建议您在此处查看Android开发人员门户上的示例应用程序。原文链接:BuildACustomLauncheronAndroid核子可乐翻译