【学以致用】android功能实现9---Launcher之AS中,在Launcher源码中增加google负一屏的实现方法

负一屏是相对于正常屏幕而言,正常屏幕是指桌面上用户用于摆放图标(也可以编辑图标位置)的屏幕,根据用户喜欢可以有一个或多个屏幕。在一些手机当中,包括苹果和安卓,在正常屏幕的最左边一屏,我们再往左滑,会出现一个特殊的屏幕。这个屏幕往往会提供:语音搜索?常用应用?天气预报? 都有可能提供,也可以提供其他内容。

 

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:第三方的负一屏会带一个apkapk需要安装到系统应用里面

 

2Launcher也要有系统权限才能够通过左滑打开负一屏

 

3:负一屏实现是基于googleLauncher源码给出的LauncherOverlay和LauncherCallbacks。

 

4:在Launcher源码的onCreate的中有这段代码,

if (mLauncherCallbacks != null) {
    mLauncherCallbacks.onCreate(savedInstanceState);
}

所以,负一屏功能,需要在一开时就将mLauncherCallbacks赋值。

 

5Launcher源码中有名为LauncherSettingsactivity就是长按桌面后的下方快捷栏里面的Settingsgoogle推荐我们把各类开关,比如负一屏开关,放到这里。

 

 

详细步骤一:集成jar包(和其他jar包的集成方式一样)

 

一个第三方APK需要集成到Launcher的负一屏,一定会提供一个Jar。 我们需要将jar包放到android studio工程中的libs文件下。

 

gradle中添加依赖,一个能够运行的工程本身就有很多依赖(dependencies),在其中增加对jar包的识别,每次gredle修改后,android studio都会提醒你刷新一下,也有自动刷新的。如果弹出提示编译或者刷新的,请同意一下,这样在代码中就可以识别第三方负一屏的接口代码了。

 

dependencies {

......

implementation files('libs/launcher_client.jar')

}

 

 

详细步骤二&三:实现overlaycallback

 

我们需要调用的接口有:

 

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;
}

 

这三个turefalse分别影响一些东西。具体功能不清楚,至少当3个为true的时候,负一屏正常运行。

这里我们可以直接传入new LauncherClient.ClientOptions(true,true,true);

 

最终创建的通过ScreenOverlay.setClient(mLauncherClient);来给与ScreenOverlay使用。

 

ScreenCallbacks中,需要实现LauncherCallbacks的接口,主要是window和生命周期,其实现都是通过mLauncherClient对象调用同名方法。

 

最后,在LauncherOncreate中,初始化ScreenCallbacks

setLauncherCallbacks(new ScreenCallbacks(this));

这里的ScreenCallbacks传入Launcher以供使用。

 

注意:使用负一屏的话,对Launcher有权限需求,最好是使用系统权限。

猜你喜欢

转载自blog.csdn.net/dax120/article/details/79298197