Android Launcher 入门
Launcher(发射器),就是你经常看到主屏幕吧,其实它也是一个App,它加载着其它app的图标和名字,并通过意图打开i它们。
从本博客你可以从认识Launcher并且开发一个简单的Launcher,在你的模拟器上使用。
注意:
- 下面代码需要自己强烈建议手打,否则你只是复制了一个Demo。
- 如果你需要的只是看一下效果的话,请点击下载,转到GitHub上下载Demo,并查看。
- 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 入门相关推荐
- 《Android 开发入门与实战(第二版)》——6.6节配置改变
本节书摘来自异步社区<Android 开发入门与实战(第二版)>一书中的第6章,第6.6节配置改变,作者eoe移动开发者社区 组编 , 姚尚朗 , 靳岩,更多章节内容可以访问云栖社区&qu ...
- android launcher
引用:http://blog.csdn.net/fzh0803/article/details/6279995 去年做了launcher相关的工作,看了很长时间.很多人都在修改launcher,但还没 ...
- Android Volley入门到精通:初识Volley的基本用法
1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...
- android+studio入门指南+pdf,android+studio使用指南v0.1.pdf
androidstudio使用指南v0.1 <Android Studio入门指南>作者:毕小朋 博客:/wirelessqa Android Studio入门指南v0.1 作者:毕小朋 ...
- Android Launcher 分析
1. Launcher的启动过程 从网络上找了一段关于Launcher的启动过程的文章,作为学习Launcher的背景知识: Linux kernel启动以后会通过app_main进程来初始化andr ...
- Android编译系统入门(二)
Android.mk的使用方法 在上一篇Android编译系统入门(一)中我们只要介绍了Android系统使用make命令默认编译的依赖树是droid,而droid是一个伪目标,它有两个先决条件dro ...
- android辅助功能模拟home键,Android launcher中模拟按home键的实现
Android launcher中模拟按home键的实现 Intent mHomeIntent = new Intent(Intent.ACTION_MAIN); mHomeIntent.addCat ...
- 《Delphi XE6 android 编程入门教程》推荐
近5.6年已经没有看见关于delphi的新技术的书出来了(看来在国内delphi的使用量确实很低了), 高勇同学最近出了一本<Delphi XE6 android 编程入门教程>,上周刚拿 ...
- android 编辑9图片,Android基础入门教程——1.6 .9(九妹)图片怎么玩
Android基础入门教程--1.6 .9(九妹)图片怎么玩 Android基础入门教程 1.本节引言: 可能有的一些疑问: 1.什么是.9图片? 答:图片后缀名前有.9的图片,如pic1.9.png ...
最新文章
- 《Spark大数据分析:核心概念、技术及实践》一1.5 NoSQL
- 开通博客的第一篇随笔~
- nginx的upstream问题记录
- 《精通 ASP.NET MVC 5》----1.8 本书所需的软件
- 重启redis命令_redis系列之——数据持久化(RDB和AOF)
- ​数据科学中 17 种相似性和相异性度量
- rust 局域网联机_分享自己用 Rust 写的可以直接利用 SOCKS 代理的游戏加速器
- 如何基于Jupyter notebook搭建Spark集群开发环境
- 新车入手,美利达公爵500
- python函数及方法大全_Python常用方法和技巧汇总
- 元气骑士机器人的成就皮肤_元气骑士:5把特殊“红武”,想要机器人的皮肤,用它就对了!...
- 云计算技术,主要包含哪些关键技术?
- C语言转义字符'\'
- 微软又发布了一款命令行神器,功能太强了!
- 2020年戴森设计大奖国际20强揭晓
- java图像处理:灰度化,二值化,降噪,切割,裁剪,识别,找相似等
- 登录和第三方授权(Cookie和Authorization)
- 《你好啊,程序员》学习笔记
- vite.config.ts 配置
- (附源码)计算机毕业设计ssm垂钓俱乐部网站