负一屏是相对于正常屏幕而言,正常屏幕是指桌面上用户用于摆放图标(也可以编辑图标位置)的屏幕,根据用户喜欢可以有一个或多个屏幕。在一些手机当中,包括苹果和安卓,在正常屏幕的最左边一屏,我们再往左滑,会出现一个特殊的屏幕。这个屏幕往往会提供:语音搜索?常用应用?天气预报? 都有可能提供,也可以提供其他内容。
Android的负一屏的实现主流有两种方式:
其一,Launcher自行开发,通过Launcher自定义的LauncherCallbacks接口中的hasCustomContentToLeft方法,来开启和关闭,自定义的负一屏。
其二,则是本文讲述的,集成特殊的第三方应用做为负一屏,本文这次讲述的是继承google提供的标准负一屏LauncherClient。
本文将说明在android Studio中的LauncherClient负一屏的创建方法。此前,需要做的准备工作是,一个正常的可以使用的Launcher,即桌面系统,本文讲解在此基础上,关于Launcher部分需要实现的内容。
第三方的负一屏基本都是以这个模板做,举一反三,按照这个方案,同样可以集成其他第三方应用的负一屏。
一个完整的Launcher,配置一个负一屏需要以下几个步骤:
1:导入官方接口
2:实现overlay
3:实现callback
4:引入开关
先概述4个步骤,再一一细说:
首先需要获取launcher_client.jar的包,这样可以在程序中调用对应的接口,其他第三方负一屏也是提供jar。在gradle中配置jar包。Google负一屏会提供LauncherClient
和LauncherClientCallbacks两个接口,其他负一屏也一定会提供相应一个本身接口和一个callback接口。
实现负一屏,我们需要创建两个类,这两个类分别实现LauncherOverlay
和LauncherCallbacks 。 注意LauncherOverlay和LauncherCallbacks 是Launcher自己的。实现了后,需要将实现LauncherCallbacks的类赋给mLauncherCallbacks对象,这样就完成负一屏了。
以上有几个重点
1:第三方的负一屏会带一个apk该apk需要安装到系统应用里面
2:Launcher也要有系统权限才能够通过左滑打开负一屏
3:负一屏实现是基于googleLauncher源码给出的LauncherOverlay和LauncherCallbacks。
4:在Launcher源码的onCreate的中有这段代码,
if (mLauncherCallbacks != null) {
mLauncherCallbacks.onCreate(savedInstanceState);
}
所以,负一屏功能,需要在一开时就将mLauncherCallbacks赋值。
5:Launcher源码中有名为LauncherSettings的activity就是长按桌面后的下方快捷栏里面的Settings,google推荐我们把各类开关,比如负一屏开关,放到这里。
详细步骤一:集成jar包(和其他jar包的集成方式一样)
一个第三方APK需要集成到Launcher的负一屏,一定会提供一个Jar。 我们需要将jar包放到android studio工程中的libs文件下。
在gradle中添加依赖,一个能够运行的工程本身就有很多依赖(dependencies),在其中增加对jar包的识别,每次gredle修改后,android studio都会提醒你刷新一下,也有自动刷新的。如果弹出提示编译或者刷新的,请同意一下,这样在代码中就可以识别第三方负一屏的接口代码了。
dependencies {
......
implementation files('libs/launcher_client.jar')
}
详细步骤二&三:实现overlay和callback。
我们需要调用的接口有:
LauncherClient:
//负一屏的生命周期
onResume()
onPause()
onStart()
onStop()
onDestroy()
//进入和退出负一屏
startMove()
endMove()
updateMove(float)
//负一屏绑定在Launcher中
onDetachedFromWindow()
onAttachedToWindow()
LauncherClientCallbacks
//确定负一屏移动出来的距离
onOverlayScrollChanged(float);
//确定负一屏的应用在运行
onServiceStateChanged(boolean , boolean );
以上代码实现不复杂,因为这些接口基本是负一屏的标准接口,是针对Launcher而做的接口,而调用他们的地方也就在LauncherOverlay和LauncherCallbacks中
实现这两者,建议创建两个类,一个是ScreenOverlay,一个是ScreenCallbacks。
ScreenOverlay中实现LauncherOverlay接口
这是LauncherOverlay接口的源码,我们需要实现其中4个方法。
public interface LauncherOverlay {
void onScrollInteractionBegin();
void onScrollInteractionEnd();
void onScrollChange(float progress, boolean rtl);
void setOverlayCallbacks(LauncherOverlayCallbacks callbacks);
}
其中
void onScrollInteractionBegin();
void onScrollInteractionEnd();
void onScrollChange(float progress, boolean rtl);
是针对用户在屏幕的滑动操作,
分别是开始,终止以及中间过程,我们需要在其中实现对应的接口
startMove()
endMove()
updateMove(float)
即:
@Override
public void onScrollInteractionBegin() {
mLauncherClient.startMove();
}
@Override
public void onScrollInteractionEnd() {
mLauncherClient.endMove();
}
@Override
public void onScrollChange(float progress, boolean rtl) {
mLauncherClient.updateMove(progress);
}
而void setOverlayCallbacks(LauncherOverlayCallbacks callbacks);方法
就是讲其他主要是ScreenCallbacks类来调用将其自身放入到ScreenOverlay中。
此外,我们在ScreenOverlay中实现LauncherClientCallbacks 接口。
public interface LauncherClientCallbacks {
void onOverlayScrollChanged(float var1);
void onServiceStateChanged(boolean var1, boolean var2);
}
onServiceStateChanged中的第一个参数var1表示当前的负一屏apk是否和Launcher连接上,var1是对手机中的google.apk的监控,我们根据其结果,决定是否进行如mClient.startMove()等调用。
void onOverlayScrollChanged(float var1);是从负一屏往Launcher滑动过程中的值,由负一屏的apk传递给Launcher。
@Override
public void onOverlayScrollChanged(float progress) {
if (mScreenCallbacks!= null) {
mScreenCallbacks.onScrollChanged(progress);
}
}
ScreenCallbacks中实现LauncherCallbacks
最关键是创建其对象,源码中构造器如下:
public LauncherClient(Activity var1, LauncherClientCallbacks var2, LauncherClient.ClientOptions var3)
第一个是传入Launcher.java这个activity。应该在Launcher.java的时候,使用this传入。
LauncherClientCallbacks 是就是
第二个传入ScreenOverlay,就地创建一个新的ScreenOverlay对象并给与LauncherClient的构造器。
第三个是
public ClientOptions(boolean var1, boolean var2, boolean var3) {
int var4 = (var4 = 0 | (var1?1:0)) | (var2?2:0) | (var3?4:0);
this.a = var4;
}
这三个ture和false分别影响一些东西。具体功能不清楚,至少当3个为true的时候,负一屏正常运行。
这里我们可以直接传入new LauncherClient.ClientOptions(true,true,true);
最终创建的通过ScreenOverlay.setClient(mLauncherClient);来给与ScreenOverlay使用。
在ScreenCallbacks中,需要实现LauncherCallbacks的接口,主要是window和生命周期,其实现都是通过mLauncherClient对象调用同名方法。
最后,在Launcher的Oncreate中,初始化ScreenCallbacks。
setLauncherCallbacks(new ScreenCallbacks(this));
这里的ScreenCallbacks传入Launcher以供使用。
注意:使用负一屏的话,对Launcher有权限需求,最好是使用系统权限。