Launcher(发射器),就是你经常看到主屏幕吧,其实它也是一个App,它加载着其它app的图标和名字,并通过意图打开i它们。

从本博客你可以从认识Launcher并且开发一个简单的Launcher,在你的模拟器上使用。

注意:

  1. 下面代码需要自己强烈建议手打,否则你只是复制了一个Demo。
  2. 如果你需要的只是看一下效果的话,请点击下载,转到GitHub上下载Demo,并查看。
  3. GitHub代码  需要把清单列表的注释解开

一、Launcher

1.什么是Launcher

安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher

2. 定制Launcher

在许多国内手机都定制了自己的Launcher,并不予许用户使用其它Launcher。

尤其是在智能电视和车载上,都有自己的Launcher。

3.不同Launcher

Launcher也有许多不同版本,这章就不展开讲了,只是让你认识一下Launcher。

具体你可以看这里

二、开发一个简单Launcher

开发一个Launcher很简单,你只需要跟着我写下面的代码就可以得到一个自己的Launcher。

1.清单列表

在自己开发的APP的AndroidManifest中添加两句代码到自己的Activity里。

 <category android:name="android.intent.category.HOME"/><category android:name="android.intent.category.DEFAULT"/>

启动模拟器,可以使用夜神或者AS中的模拟器,我使用过夜神5.0和AS中模拟器(5.0),都可以。一般国内真机都不行。

运行起来,就是一个Hellowrod,但是一旦返回到主界面,就会弹出询问使用什么Launcher。

这里是因为系统中有多个Launcher,所以询问,点击仅一次。你会发现效果是打开了这个只有HelloWrod的App,其实它已经是你的主屏幕了,接下来我们把它改造的像一点。

2.通过PackageManager获取应用

private void getApps() {PackageManager packageManager = getPackageManager();Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_LAUNCHER);mMApps = packageManager.queryIntentActivities(intent, 0);}

3.建立视图预览

简单点,先创建一个RecycleView,把图标显示到上面,并添加点击事件,跳到个个应用。

在onBindViewHolder中写获取App图标和名字的代码,和点击事件的接口回调。

@Overridepublic void onBindViewHolder(@NonNull MyAppsAdapter.ViewHolder viewHolder, int i) {ResolveInfo resolveInfo = mMApps.get(i);Drawable drawable = resolveInfo.activityInfo.loadIcon(mContext.getPackageManager());CharSequence charSequence = resolveInfo.loadLabel(mContext.getPackageManager());viewHolder.mAppimg.setImageDrawable(drawable);viewHolder.mAppname.setText(charSequence);viewHolder.mAppimg.setOnClickListener(v -> {mMyAppsAdapterSetOnClickListener.OnClickListener(i);});}

大概效果就这样了

此时这个Launcher基本可以使用了,如果你嫌弃它不好看,我们可以加一个简单的背景。

在Styet里面添加一个背景

<style name="MyLauncher" parent="android:Theme.Wallpaper"><item name="android:windowNoTitle">true</item></style>

在清单里配置

  <activityandroid:name=".MainActivity"android:theme="@style/MyLauncher">

运行一下,效果如下:

如果崩溃了,请更改Activity继承关系

public class MainActivity extends Activity implements MyAppsAdapter.MyAppsAdapterSetOnClickListener {

三、附代码:

为了方便大家查看代码,在这我附出应用代码,免去下载代码的麻烦。

1.manifest

<?xml version="1.0" encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"package="com.example.mylauncher"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"tools:ignore="GoogleAppIndexingWarning"><activityandroid:name=".MainActivity"android:theme="@style/MyLauncher"><intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.HOME"/><category android:name="android.intent.category.DEFAULT"/><category android:name="android.intent.category.LAUNCHER"/></intent-filter></activity></application></manifest>

2.MainActivty

1.MainActivty的代码

public class MainActivity extends Activity implements MyAppsAdapter.MyAppsAdapterSetOnClickListener {private String TAG = "MainActivity";private RecyclerView rl;private MyAppsAdapter mMyAppsAdapter;private List<ResolveInfo> mMApps;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();getApps();setData();}private void setData() {if (mMyAppsAdapter == null) {mMyAppsAdapter = new MyAppsAdapter(this, mMApps);}rl.setLayoutManager(new GridLayoutManager(this, 4));rl.setAdapter(mMyAppsAdapter);mMyAppsAdapter.setMyAppsAdapterSetOnClickListener(this);}private void getApps() {PackageManager packageManager = getPackageManager();Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_LAUNCHER);mMApps = packageManager.queryIntentActivities(intent, 0);}private void initView() {rl = findViewById(R.id.rl);}@Overridepublic void OnClickListener(int i) {ResolveInfo resolveInfo = mMApps.get(i);String packageName = resolveInfo.activityInfo.packageName;String appName = resolveInfo.activityInfo.name;ComponentName componentName = new ComponentName(packageName, appName);Intent intent = new Intent();intent.setComponent(componentName);startActivity(intent);}
}

2.MainActivty的布局

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><android.support.v7.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/rl"/></android.support.constraint.ConstraintLayout>

3.MyAppsAdapter

1.MyAppsAdapter代码

package com.example.mylauncher;import java.util.List;import android.content.Context;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;class MyAppsAdapter extends RecyclerView.Adapter<MyAppsAdapter.ViewHolder> {private final Context mContext;private final List<ResolveInfo> mMApps;public MyAppsAdapter(MainActivity context, List<ResolveInfo> mApps) {mContext = context;mMApps = mApps;}@NonNull@Overridepublic MyAppsAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {View view = LayoutInflater.from(mContext).inflate(R.layout.recycler_view_item, null);ViewHolder viewHolder = new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull MyAppsAdapter.ViewHolder viewHolder, int i) {ResolveInfo resolveInfo = mMApps.get(i);Drawable drawable = resolveInfo.activityInfo.loadIcon(mContext.getPackageManager());CharSequence charSequence = resolveInfo.loadLabel(mContext.getPackageManager());viewHolder.mAppimg.setImageDrawable(drawable);viewHolder.mAppname.setText(charSequence);viewHolder.mAppimg.setOnClickListener(v -> {mMyAppsAdapterSetOnClickListener.OnClickListener(i);});}@Overridepublic int getItemCount() {return mMApps.size();}public class ViewHolder extends RecyclerView.ViewHolder {private final TextView mAppname;private final ImageView mAppimg;public ViewHolder(@NonNull View itemView) {super(itemView);mAppimg = itemView.findViewById(R.id.appimg);mAppname = itemView.findViewById(R.id.appname);}}public MyAppsAdapterSetOnClickListener mMyAppsAdapterSetOnClickListener;public void setMyAppsAdapterSetOnClickListener(MyAppsAdapterSetOnClickListener myAppsAdapterSetOnClickListener) {mMyAppsAdapterSetOnClickListener = myAppsAdapterSetOnClickListener;}interface MyAppsAdapterSetOnClickListener {void OnClickListener(int i);}
}

xml

<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/appimg"android:layout_width="50dp"android:layout_height="50dp"tools:src="@tools:sample/avatars"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/><TextViewandroid:id="@+id/appname"android:layout_width="50dp"android:layout_height="wrap_content"android:text="appname"app:layout_constraintTop_toBottomOf="@+id/appimg"app:layout_constraintStart_toStartOf="@+id/appimg"app:layout_constraintEnd_toEndOf="@+id/appimg"/></android.support.constraint.ConstraintLayout>

3其它

1.style

    <style name="MyLauncher" parent="android:Theme.Wallpaper"><item name="android:windowNoTitle">true</item></style>

2.依赖

 implementation 'com.android.support:recyclerview-v7:28.0.0'

Android Launcher 入门相关推荐

  1. 《Android 开发入门与实战(第二版)》——6.6节配置改变

    本节书摘来自异步社区<Android 开发入门与实战(第二版)>一书中的第6章,第6.6节配置改变,作者eoe移动开发者社区 组编 , 姚尚朗 , 靳岩,更多章节内容可以访问云栖社区&qu ...

  2. android launcher

    引用:http://blog.csdn.net/fzh0803/article/details/6279995 去年做了launcher相关的工作,看了很长时间.很多人都在修改launcher,但还没 ...

  3. Android Volley入门到精通:初识Volley的基本用法

    1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...

  4. android+studio入门指南+pdf,android+studio使用指南v0.1.pdf

    androidstudio使用指南v0.1 <Android Studio入门指南>作者:毕小朋 博客:/wirelessqa Android Studio入门指南v0.1 作者:毕小朋 ...

  5. Android Launcher 分析

    1. Launcher的启动过程 从网络上找了一段关于Launcher的启动过程的文章,作为学习Launcher的背景知识: Linux kernel启动以后会通过app_main进程来初始化andr ...

  6. Android编译系统入门(二)

    Android.mk的使用方法 在上一篇Android编译系统入门(一)中我们只要介绍了Android系统使用make命令默认编译的依赖树是droid,而droid是一个伪目标,它有两个先决条件dro ...

  7. android辅助功能模拟home键,Android launcher中模拟按home键的实现

    Android launcher中模拟按home键的实现 Intent mHomeIntent = new Intent(Intent.ACTION_MAIN); mHomeIntent.addCat ...

  8. 《Delphi XE6 android 编程入门教程》推荐

    近5.6年已经没有看见关于delphi的新技术的书出来了(看来在国内delphi的使用量确实很低了), 高勇同学最近出了一本<Delphi XE6 android 编程入门教程>,上周刚拿 ...

  9. android 编辑9图片,Android基础入门教程——1.6 .9(九妹)图片怎么玩

    Android基础入门教程--1.6 .9(九妹)图片怎么玩 Android基础入门教程 1.本节引言: 可能有的一些疑问: 1.什么是.9图片? 答:图片后缀名前有.9的图片,如pic1.9.png ...

最新文章

  1. 《Spark大数据分析:核心概念、技术及实践》一1.5 NoSQL
  2. 开通博客的第一篇随笔~
  3. nginx的upstream问题记录
  4. 《精通 ASP.NET MVC 5》----1.8 本书所需的软件
  5. 重启redis命令_redis系列之——数据持久化(RDB和AOF)
  6. ​数据科学中 17 种相似性和相异性度量
  7. rust 局域网联机_分享自己用 Rust 写的可以直接利用 SOCKS 代理的游戏加速器
  8. 如何基于Jupyter notebook搭建Spark集群开发环境
  9. 新车入手,美利达公爵500
  10. python函数及方法大全_Python常用方法和技巧汇总
  11. 元气骑士机器人的成就皮肤_元气骑士:5把特殊“红武”,想要机器人的皮肤,用它就对了!...
  12. 云计算技术,主要包含哪些关键技术?
  13. C语言转义字符'\'
  14. 微软又发布了一款命令行神器,功能太强了!
  15. 2020年戴森设计大奖国际20强揭晓
  16. java图像处理:灰度化,二值化,降噪,切割,裁剪,识别,找相似等
  17. 登录和第三方授权(Cookie和Authorization)
  18. 《你好啊,程序员》学习笔记
  19. vite.config.ts 配置
  20. (附源码)计算机毕业设计ssm垂钓俱乐部网站

热门文章

  1. Xcode Cloud 是什么
  2. Android7.1 Kyguard界面灭屏时间分析
  3. his系统服务器安全方案,HIS网络安全和防范措施、备份及应急方案
  4. leetcode简单之577.员工奖金
  5. 从事了二年的Windows系统USB驱动开发
  6. LeetCode-Revers_Bits
  7. ubuntu下载,直接上中国官网就好了
  8. wireshark安装s7comm-plus插件
  9. 深度学习 客流统计 人流计数
  10. 关于python的基础语法