python launcher怎么使用_QMUI实战(一)—为何我们要使用 LauncherActivity?
QMUI 2 发布了,但是里面换肤等相关的很多东西,如果不讲,那么很多人估计就只能复制粘贴下 QMUIDemo 的代码,而并不能用好 QMUI, 或者是通过 QMUI 来提升自己的 UI 开发能力,毕竟现在很多 Android 开发都是轻 UI 而重数据流,遇到需要复杂 UI 的地方,在 Github 上随便找个组件套上去就行了,如果找得到刚好符合需求的还好,如果找到的不是那么切合需求,那一天的状态很可能就是“一壶茶、一包烟、几个间距颜色调一天”了。
我开这个系列(挖这个坑),不仅仅是写怎么用 QMUI 了,而是想通过 QMUI 来讲一些我个人在 QMUI 和项目开发过程中收获和心得。我开了一个新的 Github 仓库,名叫 GankWithQmui,打算从零开始用 kotlin 去写一个 Demo 型 App ,以此来指出 Android UI 开发可能涉及到各种知识。当然更新时间或者更新主题都是不定的,个人比较随意,有了状态,才能操作拉满;没有状态,可能很快就被终结了。
每篇博文会以一个关键问题来作为标题,问题的背后可能就是我们进行最佳实践的原因了。也是希望大家看完博文能彻底掌握的知识点。不断累积,才能在今后的任何场景下得心应手。好了,我们正式开始今天的征途。
项目初始化
我们直接用 Android Studio(AS)生成无 Activity 的项目,语言选择 kotlin。我使用的 package 为 org.cgsdream.gankwithqmui,的环境是: Android Studio 4
kotlin 1.3.60-eap-25
gradle 4.0.0-alpha04
如果你 clone 代码,在你的 AS 上打不开,修改这些版本号应该就可以了。
引入QMUI依赖
我们引入 qmui 库,以及 arch 库, arch 库因为有一些使用注解进行代码生成的功能,因此还需要加入 arch-compliler 库,后面的博文会慢慢来解释它们的用途。
我们使用 kapt 来代替 annotationProcessor, 因此需要在 app/build.gradle 里添加下面这行代码:apply plugin: 'kotlin-kapt'
然后在 app/build.gradle 的 dependencies 里加入 qmui 相关依赖:def qmui_version = '2.0.0-alpha02'
implementation "com.qmuiteam:qmui:$qmui_version"
implementation "com.qmuiteam:arch:$qmui_version"
kapt "com.qmuiteam:arch-compiler:$qmui_version" // use annotationProcessor if java
Application 与 Theme
新建 Application,我取名为 GankApplication, QMUI 的手势返回需要注册 ActivityLifecycleCallbacks, 因此我们需要关于它的初始化代码:class GankApplication: Application() {
override fun onCreate() {
super.onCreate()
QMUISwipeBackActivityManager.init(this)
}
}
这个时候,我们去到 AndroidManifest.xml 文件, 将 application 标签的 name 指向 GankApplication
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:name=".GankApplication">
android:name="android.notch_support"
android:value="true"/>
android:name="android.max_aspect"
android:value="2.34"/>
android:name="notch.config"
android:value="portrait|landscape"/>
为了适配全面屏和挖孔屏,我们需要添加一些 meta-data,这个没什么好说的,官方文档要求是这样,照着来就行了。
现在让我们把目光聚焦到 application 的 theme。QMUI 是支持各种配置的,而配置手段就是 theme。 因此必须要掌握它。
我们点击 AppTheme 跳转过去,修改它的 parent 为 QMUI.Compat.NoActionBar。QMUI 的很多组件就可以在里面设置了,例如需要更改 QMUITopBar 的相关设置:
@color/app_topbar_bg_color
@color/qmui_config_color_white
@color/qmui_config_color_75_white
@color/qmui_config_color_white
@color/qmui_config_color_white
Theme 或者说 style 是具有继承性的, 我们声明了 AppTheme 的 parent 为 QMUI.Compat.NoActionBar, 也就是说我们 AppTheme 默认拥有了 QMUI.Compat.NoActionBar 全部配置,而在 AppTheme 里添加新的 item,则是覆盖 parent 的配置,Android 系统自带的组件也有很多是可配置的,如果有特殊需求,也是可以更改的,例如更改默认 TextView 的颜色。
那么问题来了, theme 的继承规则是怎样的呢?
theme 的继承规则有两种:parent 继承,就是像我们上面使用的那样,用 parent 属性指定其父 theme。
点继承,例如 QMUI.Compat 这个 theme 是继承自 QMUI 的。
如果同时存在点继承和 parent 继承,那么采用 parent 继承。
所以 app 的 theme 继承链为:AppTheme 继承自 QMUI.Compat.NoActionBar; QMUI.Compat.NoActionBar 继承自 QMUI.Compat; QMUI.Compat 继承自 QMUI。
LauncherActivity
App 启动后我们的第一个界面是什么呢? 很多 App 会有一个闪屏广告页,另外一些会存在一个 Launcher 页,而不会直接去主界面。这是为什么呢?
App 启动分为冷启动和热启动, 热启动比较简单,其实就是后台进程切换到前台。 但冷启动不一样,它需要创建进程、走 Application 初始化等步骤,然后才轮到 Activity 的启动。这个流程是很复杂的,也比较耗时,如果业务上又在 Application.onCreate 里做一堆初始化逻辑,那么这个过程就更慢了。
我们做优化时有一种方式是:让用户感知不到慢,一般是展示一些东西给用户,例如进度条、loading动画等。 Android 官方也采取了这种方式,就是立刻让用户看到界面,而这个界面展示什么呢?这个时候 Activity 在 theme 里提供背景图就派上用途了。
而 Activity 默认的背景就是白色,如果你没加任何处理,你会看到你的 App 冷启动时会出现闪白的情况。 因此我们需要提供一个自定义的背景图片,让用户看到更多东西,而不只是一片白色, 这就是 LauncherActivity 的一个功能。
其次,在这段时间,Activity.onCreate 都没被触发的,因此我们没办法在这段时间做沉浸式状态栏,我们会看到状态栏那里是黑色,进入主界面时,还是有不协调的感觉,特别是挖孔屏盛行后,有的手机那里特别高。 我们没有特别好的方式解决它,一般的做法是让 LauncherActivity 配置成全屏,界面切换时,就不会那么的突兀了,而独立的 LauncherActivity 也不需要我们去处理跳转到主界面后非全屏的切换问题,在 theme 里配置就行了,这就是 LauncherActivity 的第二个功能。
再者,如果我们想做主界面的 A/B Test,或者某些场景产品希望调其它的界面,针对这种场景,我们可以在 LauncherActivity 里做跳转分发逻辑,大型 App 肯定会用到的,这应该是它的第三个功能。
说了这么多,让我们来构建 LauncherActivity 吧。
先创建 LauncherActivity,暂时先不做到主界面的跳转逻辑 :class LauncherActivity: QMUIActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
然后在 AndroidManifest.xml 注册它:
android:name=".LauncherActivity"
android:theme="@style/AppTheme.Launcher">
我们加上 intent-filter,使得它作为默认启动的 Activity。 然后通过 theme 去指定全屏和背景:
true
@drawable/launcher_bg
然后添加让我们的背景 drawable, 这里我写的 launcher_bg 只是把 logo 放出来了,一般会定制一下,并且可以同 layer-list 叠加多个图层:<?xml version="1.0" encoding="utf-8"?>
以前的话,LauncherActivity 配置就完成了,但是现在不行,因为我们还需要适配 Dark Mode。 并且背景展示的时机太早了, QMUI 的 skin 机制还来不及执行,因此这个时候也只能走原生的机制:
Android Dark Mode 的适配和我们其它资源在不同屏幕宽度下适配的原理是一样的,都是根据不同的状态去不同的文件夹下取资源。而 Dark Mode 的特定文件夹就是 drawable-night。 这个目录默认是不存在,需要我们创建,然后在里面放置一个同名的 launcher_bg.xml。 这样 Dark Mode 下就会默认显示这个背景了。里面你可以自定义背景展示,我这里只是改了下背景颜色。<?xml version="1.0" encoding="utf-8"?>
到这里,整个 LauncherActivity 就编码完成了,App 也可以编译运行了。 (commit id 为 86771225, 可以 checkout 查看)
总结
今天我们从头新建了一个项目,然后写了个开端,需要掌握的是:theme 以及 theme 的继承规则。
冷启动与热启动,以及如何设置启动界面的背景。
Android 系统提供的 Dark Mode 适配机制。
下期博文:QMUI实战(二)—Activity 和 Fragment,我们该选择谁?
备注:我的博文会发表在个人博客, 掘金,和公众号 QMUITeam。若需转载,注明出处就行。
https://juejin.im/post/5ded19bb6fb9a0162d609e79
相关文章:

CoAP 协议解析说明(转)
CoAP 协议全面分析 HTTP与COAP 请求与响应示例 HTTP请求(文本格式) POST https://getman.cn/echo HTTP/1.1 User-Agent: Fiddler Host: getman.cn Content-Length: 9{temp:22}HTTP响应(文本格式) HTTP/1.1 200 OK Server: NWSs Da…

孔雀翎----《Programming C# 》中文版 第4版
孔雀翎----《Programming C# 》中文版 第4版 主页:http://blog.csdn.net/21aspnet/ 时间:2007.8.7 电子工业出版社给我邮寄了此书,所以本人可以先在出版之前一睹为快。 本人曾看过300多本.NET方面的书,感慨颇深。其实一…

iOS开发小技巧--textField成为密码框,view加载完后textField获取焦点
文本框安全输入:Secure Text Entry(安全文本输入)view加载完后textField获取焦点的正确做法

python出现typeerror原因是_Python 文件添加列表数据后TypeError原因
# -*- coding: utf-8 -*-#打开文件,将文件读入字符串colfopen(pride.txt)textf.read()colstext.split()f2open(data.txt,w)for col in cols:f2.write(col)f2.write(\n)以上代码运行无误。# -*- coding: utf-8 -*-#打开文件,将文件读入字符串colfopen(pri…

LVM逻辑卷创建管理
LVM(逻辑分区)的创建顺序:物理分区-物理卷-卷组-逻辑卷-挂载。物理卷(Physical Volume,PV):就是指硬盘分区,也可以是整个硬盘或已创建的软RAID&am…
Linux环境PHP5.5以上连接SqlServer2008【全网最经典无错版】
linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 Sqlserver版本:2008 FreeTDS版本:0.95 关于Linux环境安装NginxPHP参考Linux环境Nginx安装与调试以及PHP安装 即可。一般来说,PHPmysql是…

python矩阵运算库效率_python - 布尔矩阵运算的最快方法_performance_酷徒编程知识库...
只需在compute中进行一些小的更改:def compute(m, n):m np.asarray(m)n np.asarray(n)# Apply mask N in advancem2 m & n# Pack booleans into uint8 for more efficient bitwise operations# Also transpose for better caching (maybe?)mb np.packbits(…

hibernate-session中的方法
1.操作实体对象的方法 save() 保存 update() 更新 saveOrUpdate() 保存或更新 delete() 删除 2.操作缓存的方法 clear() 清除所有缓存 evit() 将指定对象清除出缓存 flush() 刷新到数据库中()马上执行sql语句,不会清除session缓存&#x…

[JZOJ4786]小a的强迫症
[JZOJ4786]小a的强迫症 题目大意: 有\(n(n\le10^5)\)种颜色的珠子,第\(i\)种颜色有\(num[i]\)个。你要把这些珠子排成一排,使得第\(i\)种颜色的最后一个珠子一定在第\(i1\)种珠子的最后一个珠子之前,求方案数。 思路: …

Servlet,过滤器,监听器,拦截器的区别
由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时 候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又…
Linux环境Nginx安装多版本PHP
关于Linux环境Nginx安装与调试以及PHP安装参考此文即可:http://blog.csdn.net/unix21/article/details/8544922linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 & php5.4.44 所谓多版本多版本PHP就是php5.4…

java 扫描tcp端口号_多线程TCP端口扫描 java实现
界面部分:import java.awt.Color;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;import javax…

【go同步编程】
锁 互斥锁 函数write中的这条defer语句保证了在该函数被执行结束之前互斥锁mutex一定会被解锁。 var mutex sync.Mutex func write() { mutex.Lock() defer mutex.Unlock() // 省略若干条语句 } func repeatedlyLock() {var mutex sync.Mutexfmt.Println("Lock the lock. …
Linux环境PHP7.0安装
PHP7和HHVM比较PHP7的在真实场景的性能确实已经和HHVM相当, 在一些场景甚至超过了HHVM。HHVM的运维复杂, 是多线程模型, 这就代表着如果一个线程导致crash了, 那么整个服务就挂了, 并且它不会自动重启。另外它采用JIT, 那么意味着, 重启以后要预热, 没有预热的情况下, 性能较为…

myeclipse java可视化_使用MyEclipse可视化开发Hibernate实例
使用MyEclipse可视化开发Hibernate实例2.7节的例子源代码在配套光盘sourcecode/workspace目录的chapter02_first项目中。这个实例主要演示如何使用MyEclipse的可视化开发工具开发Hibernate应用,利用MyEclipse可以提高我们开发Java EE应用的效率。操作的数据库表还是…

day20 文件上传下载
2019独角兽企业重金招聘Python工程师标准>>> 文件上传基础及api解析: 文件上传最终版: 文件下载: 转载于:https://my.oschina.net/u/2356966/blog/648774

腾讯开源基于 mmap 的高性能 key-value 组件 MMKV
腾讯微信团队宣布开源 MMKV ,这是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,主打高性能和稳定性。MMKV 从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的…
Linux环境thinkphp配置以及数据源驱动修改
项目中需要用到thinkphp,以下简称tp。linux版本:64位CentOS 6.4 Nginx版本:nginx1.8.0 php版本:php5.5.28 thinkphp版:3.2.31.安装LNMP Linux环境Nginx安装与调试以及PHP安装2.项目框架 tp源码下载http://www.thinkphp…

《Linux内核设计与实现》读书笔记 第三章 进程管理
第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种。我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在。 3.1进程 概念: 进程:处于执行期的程序。但不仅局限于程序,还包含其他资…

java持续集成soapui_集成testNG到JavaAPI测试-执行多条用例
*****************************************************************在这门课里你将学到Web Services(SOAP WebService和REST API)的手动测试及自动化测试,熟练使用Groovy脚本自动化测试WebService。这门课程设计的是从零基础入门开始学,然后以循序渐进…

python-os
os.listdir(path):path-->路径 返回类型为listos.getcwd() 获取当前工作目录os.chdir() 切换工作目录os.mkdir() 新建目录os.path.exists()os.path.isdir() os.path.join() 拼接字符串路径os.path.exists(rpath) 判断路径是否存在 r原始路径os.path.isdir() 判断是否是文件夹…
NetBeans配置Xdebug 远程调试PHP
很多PHP程序员使用echo,dump等比较原始的方法调试,这是非常落后的。几年前本人写过一篇: NetBeans配置Xdebug 由于那篇文档还需要引用本人写的其他文档,感觉有些分散,所以这里重新写一篇完整的。linux版本:…

java自定义上下文对象_Java框架_Spring应用上下文对象加载配置
我们都知道IOC是spring框架的核心,主要作用是控制反转,把我们需要的对象从容器中提供给我们,但是IOC是如何加载我们所需要的对象的?Spring容器是IOC容器的一种,它通过ApplicationContext接口将我们所需要的配置文件进行…

ThreadLocal源码分析
ThreadLocal的作用 Java对象是线程间共享的,但有时我们需要一些线程间隔离的对象,该对象只能由同一个线程读写,对其他线程不可见。ThreadLocal正式提供了这样的机制,详细使用方式请参考Java ThreadLocal。 ThreadLocal实现原理 自…

远程连接windows出现身份验证错误,提示由于CredSSP加密Oracle修正解决方案
本机操作系统(OS版本:10.0.17134) 远程计算机操作系统(OS版本:6.3.9600) 远程连接的时候报错“出现身份验证错误,要求的函数不受支持。远程计算机:xxx 这可能是由于CredSSP加密Oracle修正,若要了解详细信息...” 原因是系统更新安装了补丁&am…
MediaWiki安装
MediaWiki可以方便的让你搭建自己的wiki,公司内部使用非常方便官网: https://www.mediawiki.org/wiki/MediaWiki安装MediaWiki的必要环境 PHPMysql 下载最新版解压即可 # tar -xzvf mediawiki-1.25.2.tar.gz # mv mediawiki-1.25.2 wiki 输入首页引导一…

sql的四种连接 用mysql的语句写_170221、浅谈mysql的SQL的四种连接
例子:-------------------------------------------------a表 id name b表 id job parent_id1 张3 1 23 12 李四 2 34 23 王武 3 34 4a.id同parent_id 存在关…

MySQL冷备份的跨操作系统还原
数据来源:linux平台mysql版本为5.7 数据去向:windows平台mysql版本为5.7 操作步骤: 第一步:关闭mysql服务 service mysqld stop 第二步:归档linux平台下mysql的数据目录 tar -czvf data.tar.gz /usr/local/mysql/data …

Java 社区领袖联合发文:别慌,Java 仍然是免费的!
开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> 在去年的 Java One 上,Mark Cavage 当时宣布 Oracle 将逐步开源 Oracle JDK 的专有功能(商业特性)。Oracle Java 平台产品管理高级总监 Donald …

Squid安装
最新版Squid安装 http://www.squid-cache.org/Versions/v3/3.5/# wget http://www.squid-cache.org/Versions/v3/3.5/squid-3.5.7.tar.gz# tar zxvf squid-3.5.7.tar.gz# cd squid-3.5.7# ./configure --prefix/usr/local/squid# make && make install# chmod -R 777 /…