如何在Android Studio中制作Android启动器

1.要求

您需要在开发计算机上安装并配置以下组件:

  • Android SDK和平台工具
  • 带有ADT插件的Eclipse IDE 3.7.2或更高版本
  • 运行Android 2.2或更高版本的模拟器或Android设备

您可以从Android开发人员门户网站下载SDK和平台工具。

2.项目设置

启动Eclipse并创建一个新的Android应用程序项目。 我正在命名应用程序SimpleLauncher ,但是您可以根据需要命名。 确保使用唯一的程序包。 我们的启动器支持的最低SDK版本是Froyo ,目标SDK是Jelly Bean

由于我们不想创建Activity ,因此取消选择创建活动 。 单击完成以继续。

3.项目清单

下一步是通过添加两个活动来修改AndroidManifest.xml文件。 第一个Activity显示主屏幕。 让我们将其命名为HomeActivity ,如下所示。

<活动
android:name =“ ah.hathi.simplelauncher.HomeActivity”
android:label =“简单启动器主页”
android:theme =“ @ android:style / Theme.Wallpaper.NoTitleBar.Fullscreen”
android:launchMode =“ singleTask”
android:stateNotNeeded =“ true”
>

通过将类别android.intent.category.HOMEandroid.intent.category.DEFAULT添加到intent-filter组,关联的Activity行为就像启动器,并在您按下设备的主屏幕按钮时显示为一个选项。

我们还需要将launchMode设置为launchMode ,以确保系统在任何时候都仅保留此Activity一个实例。 要显示用户的墙纸,请将主题设置为Theme.Wallpaper.NoTitleBar.FullScreen

我们需要添加的第二个Activity显示了在用户设备上安装的应用程序。 它还负责启动应用程序。 我们不需要为此Activity任何特殊配置。 将其命名为AppsListActivity

<活动
android:name =“ ah.hathi.simplelauncher.AppsListActivity”
android:theme =“ @ android:style / Theme.NoTitleBar.Fullscreen”
>

4.活动布局

在项目的res / layout文件夹中为HomeActivity类创建XML文件,并将其命名为activity_home.xml 。 布局具有一个可响应单击事件的Button 。 单击该按钮会将用户从主屏幕转到应用程序列表。

<RelativeLayout xmlns:android =“ http://schemas.android.com/apk/res/android”
xmlns:tools =“ http://schemas.android.com/tools”
android:layout_width =“ match_parent”
android:layout_height =“ match_parent”
工具:context =“。HomeActivity”>

<按钮
android:id =“ @ + id / apps_button”
android:layout_width =“ wrap_content”
android:layout_height =“ wrap_content”
android:layout_alignParentRight =“ true”
android:layout_alignParentTop =“ true”
android:layout_marginRight =“ 10dp”
android:layout_marginTop =“ 10dp”
android:text =“ Show Apps”
android:onClick =“ showApps”
/>

接下来,在项目的res / layout文件夹中为AppsListActivity类创建XML文件,并将其命名为activity_apps_list.xml 。 布局包含一个ListView ,它占据了整个屏幕。

<LinearLayout xmlns:android =“ http://schemas.android.com/apk/res/android”
android:layout_width =“ match_parent”
android:layout_height =“ match_parent”
android:orientation =“ vertical”>

<ListView
android:id =“ @ + id / apps_list”
android:layout_width =“ match_parent”
android:layout_height =“ match_parent”
>

最后,在相同位置创建第三个XML文件,并将其命名为list_item.xml 。 该文件定义ListView项目的布局。 每个列表视图项代表一个安装在用户设备上的应用程序。 它显示了应用程序的图标,标签和程序包名称。 我们使用ImageView实例和TextView实例作为标签和包名称来显示应用程序图标。

<RelativeLayout xmlns:android =“ http://schemas.android.com/apk/res/android”
android:layout_width =“ match_parent”
android:layout_height =“ match_parent”
android:padding =“ 10dp”
>

<ImageView
android:id =“ @ + id / item_app_icon”
android:layout_width =“ wrap_content”
android:layout_height =“ wrap_content”
android:layout_alignParentLeft =“ true”
android:layout_centerVertical =“ true”
/>

<TextView
android:id =“ @ + id / item_app_label”
android:layout_width =“ wrap_content”
android:layout_height =“ wrap_content”
android:layout_toRightOf =“ @ + id / item_app_icon”
android:paddingLeft =“ 10dp”
/>

<TextView
android:id =“ @ + id / item_app_name”
android:layout_width =“ wrap_content”
android:layout_height =“ wrap_content”
android:layout_below =“ @ + id / item_app_label”
android:layout_toRightOf =“ @ + id / item_app_icon”
android:paddingLeft =“ 10dp”
/>

5.实施活动类

HomeActivity

创建了应用程序的布局之后,就该创建两个Activity类了。 创建两个类时,请确保每个类的名称与您在项目清单文件中指定的名称相匹配。

创建一个名为 HomeActivity并将android.app.Activity设置为其超类。

包ah.hathi.simplelauncher;

导入android.app.Activity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.view.View;

公共类HomeActivity扩展了Activity {

@Override
受保护的void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
}

公共无效的showApps(查看v){
意图i =新意图(this,AppsListActivity.class);
startActivity(i);
}
}

在类的onCreate方法中,我们调用setContentView ,并传入我们之前创建的布局。 您可能还记得我们在activity_home布局中添加了一个按钮,该按钮触发了一个名为showApps的方法。 现在,我们需要在HomeActivity类中实现该方法。 实现非常简单,我们为AppsListActivity类创建一个Intent并启动它。

AppsListActivity

创建另一个名为AppsListActivity Activity类,并将android.app.Activity设置为其超类。 在类的onCreate方法中,我们调用setContentView ,并传入我们之前创建的activity_apps_list布局。

包ah.hathi.simplelauncher;

导入android.app.Activity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.view.View;

公共类AppsListActivity扩展了Activity {

@Override
受保护的void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_apps_list);
}

}

即使我们的启动器尚未完成,您仍可以在此时保存并运行您的应用程序。 按下设备的主页按钮时,您应该会看到一个弹出窗口,询问您要使用哪个启动器。

如果选择Simple Launcher Home ,则应该在屏幕的右上角看到一个带有单个按钮的新主屏幕。 您还应该查看设备的当前墙纸。

返回Eclipse并创建一个名为AppDetail的类,该类将包含应用程序的详细信息,其程序包名称,标签和应用程序图标。 界面非常基本,如下所示。

包ah.hathi.simplelauncher;

导入android.graphics.drawable.Drawable;

公共类AppDetail {
CharSequence标签;
CharSequence名称;
可绘制图标;
}

6.提取应用程序

AppsListActivity类的loadApps方法中,我们使用PackageManager类的queryIntentActivities方法来获取所有具有Intent.CATEGORY_LAUNCHER类别的Intent.CATEGORY_LAUNCHER 。 该查询返回可以由启动器启动的应用程序的列表。 我们遍历查询结果,并将每个项目添加到名为apps的列表中。 请看下面的代码片段以进行澄清。

私人PackageManager管理器;
私有List 应用;
私人void loadApps(){
经理= getPackageManager();
apps = new ArrayList ();

意图i =新意图(Intent.ACTION_MAIN,null);
i.addCategory(Intent.CATEGORY_LAUNCHER);

List availableActivities = manager.queryIntentActivities(i,0);
for(ResolveInfo ri:availableActivities){
AppDetail app = new AppDetail();
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与适配器关联。

私有ListView列表;
私人void loadListView(){
list =(ListView)findViewById(R.id.apps_list);

ArrayAdapter 适配器=新的ArrayAdapter (this,
R.layout.list_item,
应用) {
@Override
public View getView(int position,View convertView,ViewGroup parent){
if(convertView == null){
convertView = getLayoutInflater()。inflate(R.layout.list_item,null);
}

ImageView appIcon =(ImageView)convertView.findViewById(R.id.item_app_icon);
appIcon.setImageDrawable(apps.get(position).icon);

TextView appLabel =(TextView)convertView.findViewById(R.id.item_app_label);
appLabel.setText(apps.get(position).label);

TextView appName =(TextView)convertView.findViewById(R.id.item_app_name);
appName.setText(apps.get(position).name);

返回convertView;
}
};

list.setAdapter(adapter);
}

8.聆听点击

当用户单击ListView的项目时,我们的启动器应启动相应的应用程序。 我们使用PackageManager类的getLaunchIntentForPackage方法创建一个用来启动应用程序的Intent 。 看一下下面的代码片段。

私有无效的addClickListener(){
list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView av,View v,int pos,
长ID){
意图i = manager.getLaunchIntentForPackage(apps.get(pos).name.toString());
AppsListActivity.this.startActivity(i);
}
});
}

9.放在一起

为了使所有内容协同工作,我们需要在AppsListActivity类的onCreate方法中调用loadAppsloadListViewaddClickListener ,如下所示。

受保护的void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_apps_list);

loadApps();
loadListView();
addClickListener();
}

再次构建并运行您的应用程序以查看结果。 现在,当您单击启动器主屏幕上的按钮时,您应该能够看到可以启动的应用程序。 单击一个项目以启动相应的应用程序。