底部弹出控件 - Fragment 实现
1 | import android.os.Bundle |
1 | import android.os.Bundle |
1 | package com.dench.webviewlib |
情景一:如果访问的页面中要与Javascript交互,则webView必须设置支持Javascript
1 | val webSettings = webView.settings |
情景二:在安卓5.0之后,默认不允许加载http与https混合内容,需要手动设置
1 | // 在安卓5.0之后,默认不允许加载http与https混合内容,需要手动设置 |
其他情景: 设置domStorageEnabled 和背景色需要验证,暂时没遇到。
由于设置了 android:layerType="software"导致的 webview 卡顿。
关于三个layerType属性介绍:https://blog.csdn.net/a345017062/article/details/7478667
解决:
开启 Activity 硬件加速 ``android:hardwareAccelerated=”true”, 并且设置 webview 的android:layerType=”none”`。
可以按如下方式声明特定的 Maven 或 Ivy 代码库:
1 | allprojects { |
随着项目采用模块化,组件化开发,moudle 的个数也会随着增加,统一管理配置gradle就显得比较重要了。
1、在 project 根目录创建一个 config.gradle 文件
1 | ext { |
2、在 Project 根目录下的 build.gradle 添加apply
1 | apply from: 'config.gradle' |
3、在相应Moudle中调用
1 | android { |
创建产品变种与创建构建类型类似:将其添加到构建配置中的 productFlavors 代码块并添加所需的设置。产品变种支持与 defaultConfig 相同的属性,这是因为,defaultConfig 实际上属于 ProductFlavor 类。这意味着,您可以在 defaultConfig 代码块中提供所有变种的基本配置,每个变种均可更改其中任何默认值,如 applicationId。
1 | android { |
1、Gradle 要求:
在所有构建变体之间共享的所有内容创建 main/ 源代码集和目录。
将“debug”构建类型特有的 Java 类文件放在 src/debug/java/ 目录中。
1 | debug |
依次转到 MyApplication > Tasks > android,然后双击 sourceSets。Gradle 执行该任务后,系统应该会打开 Run 窗口以显示输出。
2、更改默认源代码集配置
1 | android { |
1 | dependencies { |
1、在项目的根目录下创建一个名为 keystore.properties 的文件,并使其包含以下信息:
1 | storePassword=myStorePassword |
2、在 build.gradle 文件中,按如下方式加载 keystore.properties 文件(必须在 android 代码块前面):
1 |
|
3、输入存储在 keystoreProperties 对象中的签名信息:
1 | android { |
如需从环境变量获取这些密码,请添加以下代码:
1 | storePassword System.getenv("KSTOREPWD") |
1 | android { |
or
1 | outputFileName = "app_v${versionName}.${buildTime}_${flavorName}_${buildType.name}.apk" |
1、如果您需要将变量插入在 build.gradle 文件中定义的 AndroidManifest.xml 文件,可以使用 manifestPlaceholders 属性执行此操作。此属性采用键值对的映射,如下所示:
1 | android { |
2、您可以将某个占位符作为属性值插入清单文件,如下所示:
1 | <intent-filter ... > |
在构建时,Gradle 将生成 BuildConfig 类,以便应用代码可以检查与当前构建有关的信息。您也可以从 Gradle 构建配置文件中使用 buildConfigField() 方法将自定义字段添加到 BuildConfig 类中,然后在应用的运行时代码中访问这些值。同样,您也可以使用 resValue() 添加应用资源值。
1 | def buildTime = new Data().format("yyyyMMddHHmm", TimeZone.getTimeZone("GTM+08:00")) |
在应用代码中,您可以按如下方式访问属性:
1 | Log.i(TAG, BuildConfig.BUILD_TIME); |
1 | allprojects { |
1.使用 View Binding 先要在Module 的 build.gradle 文件注册
1 | android { |
2.会根据布局文件,编译之后自动生成对应的Binding class,可以在Activity 和 Fragment 直接调用 inflate 使用
1 | private var _binding: ResultProfileBinding? = null |
1.在 build.gradle 文件中开启lib
1 | android { |
2.布局文件start with a root tag of layout followed by a data element
1 | <layout xmlns:android="http://schemas.android.com/apk/res/android" |
3.在Activity中使用
1 | override fun onCreate(savedInstanceState: Bundle?) { |
在 Fragment, ListView, or RecyclerView adapter, you may prefer to use the inflate()
1 | val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false) |
View binding and data binding both generate binding classes that you can use to reference views directly. However, view binding is intended to handle simpler use cases and provides the following benefits over data binding:
Conversely, view binding has the following limitations compared to data binding:
Because of these considerations, it is best in some cases to use both view binding and data binding in a project. You can use data binding in layouts that require advanced features and use view binding in layouts that do not.
自定义Notification 实现:
1 | // RemoteViews for notification |
1.使用 NotificationCompat 兼容各个版本差异性
2.RemoteViews 布局文件不支持 constraintlayout ,切记
3.在SDK 26之后必须要绑定Channel,所以通知要先创建Channel
1 | fun checkAndCreateChannel( |
我们知道,native层调用h5,在WebView中,如果java要调用js的方法,
Android4.4以前使用WebView.loadUrl("javascript:function()")。
Android4.4以后,使用以下方式
1 | webView.evaluateJavascript("javascript:function()", new ValueCallback<String>() { |
h5层如何调native,有以下几种形式
在4.2之前有安全隐患,JS可以动态获取到整个底层的实例信息,漏洞已经在Android 4.2上修复了,即使用@JavascriptInterface注解。
WebChromeClient对象中有三个方法,分别是onJsAlert,onJsConfirm,onJsPrompt,当js调用window对象的alert,confirm,prompt,WebChromeClient对象中的三个方法对应的就会被触发,进行拦截处理。
推荐使用onJsPrompt,使用频次最少,支持返回值。
1 | override fun onJsPrompt( |
这是Android提供给Js调试在Native代码里面打印日志信息的API,同时这也成了其中一种Js与Native代码通信的方法。在Js代码中调用console.log(‘xxx’)方法。
jsbridge://className:callbackId/methodName?json
假设我们需要调用native层的Logger类的log方法,参数是msg,执行完成后js层要有一个回调,那么地址就如下
jsbridge://Logger:callbackId/log?{"msg":"message from js."}
1)使用 StaggeredGridLayoutManager
1 | val layoutManager = StaggeredGridLayoutManager(2, RecyclerView.VERTICAL) |
2)如果需要Item之间的间隔,就需要自定义 ItemDecoration
1 | /** |
ARouter 的入口,初始化SDK ARouter.init(mApplication);:
1 | public static void init(Application application) { |
_ARouter.init():
implementation compileOnly和api
implementation和api是取代之前的compile的,其中api和compile是一样的效果,implementation有所不同,通过implementation依赖的库只能自己库本身访问,举个例子,A依赖B,B依赖C,如果B依赖C是使用的implementation依赖,那么在A中是访问不到C中的方法的,如果需要访问,请使用api依赖
compile only和provided效果是一样的,只在编译的时候有效, 不参与打包
runtimeOnly 和 apk效果一样,只在打包的时候有效,编译不参与
testImplementation和testCompile效果一样,在单元测试和打包测试apk的时候有效
debugImplementation和debugCompile效果相同, 在debug模式下有效
releaseImplementation和releaseCompile效果相同,只在release模式和打包release包情况下有效
1 | object StatusBarHelper { |
1 | # 查看构建版本 |
1 | # 编译并打Debug包 |
1 | ./gradlew dependencies |
1 | # 依赖包更新命令 |
仓库地址:https://maven.aliyun.com/mvn/view
1 | maven { url 'https://maven.aliyun.com/repository/public' } |
在 build.gradle 文件中加入以下代码:
Update your browser to view this website correctly.&npsb;Update my browser now