From b5691c20d8885102f446889a4b343ea76d151612 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Mon, 23 May 2022 20:48:53 +0800 Subject: [PATCH] Merge documentation files --- docs/api/public/PackageParam.md | 2 +- docs/api/public/YukiHookDataChannel.md | 92 +-------------- docs/guide/special-feature.md | 155 ++++++++++++++++++++++++- 3 files changed, 155 insertions(+), 94 deletions(-) diff --git a/docs/api/public/PackageParam.md b/docs/api/public/PackageParam.md index 9b98d4c7..8f9aac91 100644 --- a/docs/api/public/PackageParam.md +++ b/docs/api/public/PackageParam.md @@ -637,7 +637,7 @@ resources().hook { 将 Resources 的 Hook 设置为这样是为了与 `findClass(...).hook` 做到统一,使得调用起来逻辑不会混乱。 -### onAppLifecycle [class] +### AppLifecycle [class] ```kotlin inner class AppLifecycle internal constructor() diff --git a/docs/api/public/YukiHookDataChannel.md b/docs/api/public/YukiHookDataChannel.md index fae1bccb..b419c848 100644 --- a/docs/api/public/YukiHookDataChannel.md +++ b/docs/api/public/YukiHookDataChannel.md @@ -68,34 +68,6 @@ fun put(vararg data: ChannelData<*>) > 发送键值数据。 -**功能示例** - -通过使用 `dataChannel` 来实现模块与宿主之间的通讯桥,原理为发送接收系统无序广播。 - -> 模块示例如下 - -```kotlin -// 从指定包名的宿主获取 -dataChannel(packageName = "com.example.demo").wait(key = "key_from_host") { value -> - // Your code here. -} -// 发送给指定包名的宿主 -dataChannel(packageName = "com.example.demo").put(key = "key_from_module", value = "I am module") -``` - -> 宿主示例如下 - -```kotlin -// 从模块获取 -dataChannel.wait(key = "key_from_module") { value -> - // Your code here. -} -// 发送给模块 -dataChannel.put(key = "key_from_host", value = "I am host") -``` - -!> 接收方需要保持存活状态才能收到通讯数据。 - #### put [method] ```kotlin @@ -110,34 +82,6 @@ fun put(key: String) > 仅发送键值监听,使用默认值 `VALUE_WAIT_FOR_LISTENER` 发送键值数据。 -**功能示例** - -你可以不设置 `dataChannel` 的 `value` 来达到仅通知模块或宿主回调 `wait` 方法。 - -> 模块示例如下 - -```kotlin -// 从指定包名的宿主获取 -dataChannel(packageName = "com.example.demo").wait(key = "listener_from_host") { - // Your code here. -} -// 发送给指定包名的宿主 -dataChannel(packageName = "com.example.demo").put(key = "listener_from_module") -``` - -> 宿主示例如下 - -```kotlin -// 从模块获取 -dataChannel.wait(key = "listener_from_module") { - // Your code here. -} -// 发送给模块 -dataChannel.put(key = "listener_from_host") -``` - -!> 接收方需要保持存活状态才能收到通讯数据。 - #### wait [method] ```kotlin @@ -156,10 +100,6 @@ fun wait(data: ChannelData, value: T?, result: (value: T) -> Unit) > 获取键值数据。 -**功能示例** - -参考第一个 `put` 方法的功能示例。 - #### wait [method] ```kotlin @@ -176,10 +116,6 @@ fun wait(key: String, result: () -> Unit) !> 仅限使用 `VALUE_WAIT_FOR_LISTENER` 发送的监听才能被接收。 -**功能示例** - -参考第二个 `put` 方法的功能示例。 - #### checkingVersionEquals [method] ```kotlin @@ -194,30 +130,4 @@ fun checkingVersionEquals(result: (Boolean) -> Unit) > 获取模块与宿主的版本是否匹配。 -通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。 - -**功能示例** - -你可以在模块中判断指定包名的宿主是否与当前模块的版本匹配。 - -> 示例如下 - -```kotlin -// 从指定包名的宿主获取 -dataChannel(packageName = "com.example.demo").checkingVersionEquals { isEquals -> - // Your code here. -} -``` - -你还可以在宿主中判断是否自身与当前模块的版本匹配。 - -> 示例如下 - -```kotlin -// 从模块获取 -dataChannel.checkingVersionEquals { isEquals -> - // Your code here. -} -``` - -!> 方法回调的条件为宿主、模块保持存活状态,并在激活模块后重启了作用域中的 Hook 目标宿主对象。 \ No newline at end of file +通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。 \ No newline at end of file diff --git a/docs/guide/special-feature.md b/docs/guide/special-feature.md index bb84396f..7c6ffe7c 100644 --- a/docs/guide/special-feature.md +++ b/docs/guide/special-feature.md @@ -1047,7 +1047,59 @@ val testName = prefs.name("specify_file_name").getString("test_name", "default_v ### 基本用法 -请 [点击这里](api/document?id=put-method-1) 查看详细的使用方法示例。 +> 这里描述了 `wait` 与 `put` 方法的基本使用方法。 + +通过使用 `dataChannel` 来实现模块与宿主之间的通讯桥,原理为发送接收系统无序广播。 + +> 模块示例如下 + +```kotlin +// 从指定包名的宿主获取 +dataChannel(packageName = "com.example.demo").wait(key = "key_from_host") { value -> + // Your code here. +} +// 发送给指定包名的宿主 +dataChannel(packageName = "com.example.demo").put(key = "key_from_module", value = "I am module") +``` + +> 宿主示例如下 + +```kotlin +// 从模块获取 +dataChannel.wait(key = "key_from_module") { value -> + // Your code here. +} +// 发送给模块 +dataChannel.put(key = "key_from_host", value = "I am host") +``` + +你可以不设置 `dataChannel` 的 `value` 来达到仅通知模块或宿主回调 `wait` 方法。 + +> 模块示例如下 + +```kotlin +// 从指定包名的宿主获取 +dataChannel(packageName = "com.example.demo").wait(key = "listener_from_host") { + // Your code here. +} +// 发送给指定包名的宿主 +dataChannel(packageName = "com.example.demo").put(key = "listener_from_module") +``` + +> 宿主示例如下 + +```kotlin +// 从模块获取 +dataChannel.wait(key = "listener_from_module") { + // Your code here. +} +// 发送给模块 +dataChannel.put(key = "listener_from_host") +``` + +!> 接收方需要保持存活状态才能收到通讯数据。 + +详情请参考 [YukiHookDataChannel](api/document?id=yukihookdatachannel-class)。 ### 判断模块与宿主版本是否匹配 @@ -1057,4 +1109,103 @@ val testName = prefs.name("specify_file_name").getString("test_name", "default_v 在模块与宿主中可进行双向判断。 -请 [点击这里](api/document?id=checkingversionequals-method) 查看详细的使用方法示例。 \ No newline at end of file +你可以在模块中判断指定包名的宿主是否与当前模块的版本匹配。 + +> 示例如下 + +```kotlin +// 从指定包名的宿主获取 +dataChannel(packageName = "com.example.demo").checkingVersionEquals { isEquals -> + // Your code here. +} +``` + +你还可以在宿主中判断是否自身与当前模块的版本匹配。 + +> 示例如下 + +```kotlin +// 从模块获取 +dataChannel.checkingVersionEquals { isEquals -> + // Your code here. +} +``` + +!> 方法回调的条件为宿主、模块保持存活状态,并在激活模块后重启了作用域中的 Hook 目标宿主对象。 + +详情请参考 [YukiHookDataChannel](api/document?id=yukihookdatachannel-class)。 + +## 宿主生命周期扩展功能 + +> 这是一个自动 Hook 宿主 APP 生命周期的扩展功能。 + +### 监听生命周期 + +> 通过自动化 Hook 宿主 APP 的生命周期方法,来实现监听功能。 + +我们需要监听宿主 `Application` 的启动和生命周期方法,只需要使用以下方式实现。 + +> 示例如下 + +```kotlin +loadApp(name = "com.example.demo") { + // 注册生命周期监听 + onAppLifecycle { + // 你可以在这里实现 Application 中的生命周期方法监听 + attachBaseContext { baseContext, hasCalledSuper -> + // 通过判断 hasCalledSuper 来确定是否已执行 super.attachBaseContext(base) 方法 + // ... + } + onCreate { + // 通过 this 得到当前 Application 实例 + // ... + } + onTerminate { + // 通过 this 得到当前 Application 实例 + // ... + } + onLowMemory { + // 通过 this 得到当前 Application 实例 + // ... + } + onTrimMemory { self, level -> + // 可在这里判断 APP 是否已切换到后台 + if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { + // ... + } + // ... + } + onConfigurationChanged { self, config -> + // ... + } + } +} +``` + +详情请参考 [AppLifecycle](api/document?id=applifecycle-class)。 + +### 注册系统广播 + +> 通过 `Application.onCreate` 方法注册系统广播,来实现对系统广播的监听。 + +我们还可以在宿主 `Application` 中注册系统广播。 + +> 示例如下 + +```kotlin +loadApp(name = "com.example.demo") { + // 注册生命周期监听 + onAppLifecycle { + // 注册用户解锁时的广播监听 + registerReceiver(Intent.ACTION_USER_PRESENT) { context, intent -> + // ... + } + // 注册多个广播监听 - 会同时回调多次 + registerReceiver(Intent.ACTION_PACKAGE_CHANGED, Intent.ACTION_TIME_TICK) { context, intent -> + // ... + } + } +} +``` + +详情请参考 [AppLifecycle](api/document?id=applifecycle-class)。 \ No newline at end of file