Files
YukiHookAPI/assets/xposed-channel.html-BeC6v_Qb.js
github-actions[bot] aac9e42e84 Deploy to GitHub pages
2025-08-02 18:17:09 +00:00

119 lines
35 KiB
JavaScript

import{_ as s,o as n,c as a,a as l}from"./app-BpUB8-Q8.js";const e={},o=l(`<h1 id="xposed-模块与宿主通讯桥" tabindex="-1"><a class="header-anchor" href="#xposed-模块与宿主通讯桥" aria-hidden="true">#</a> Xposed 模块与宿主通讯桥</h1><blockquote><p>这是一个使用系统无序广播在模块与宿主之间发送和接收数据的解决方案。</p></blockquote><div class="custom-container danger"><p class="custom-container-title">需要满足的条件</p><p>模块与宿主需要保持存活状态,否则无法建立通讯。</p></div><h2 id="基本用法" tabindex="-1"><a class="header-anchor" href="#基本用法" aria-hidden="true">#</a> 基本用法</h2><blockquote><p>这里描述了 <code>wait</code> 与 <code>put</code> 方法的基本使用方法。</p></blockquote><p>通过使用 <code>dataChannel</code> 来实现模块与宿主之间的通讯桥,原理为发送接收系统无序广播。</p><blockquote><p>模块示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 从指定包名的宿主获取</span></span>
<span class="line"><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">&lt;</span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">&gt;(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;key_from_host&quot;</span><span style="color:#ADBAC7;">) { </span><span style="color:#F47067;">value</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">-&gt;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"><span style="color:#768390;">// 发送给指定包名的宿主</span></span>
<span class="line"><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">put</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;key_from_module&quot;</span><span style="color:#ADBAC7;">, </span><span style="color:#F47067;">value</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;I am module&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote><p>宿主示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 从模块获取</span></span>
<span class="line"><span style="color:#ADBAC7;">dataChannel.</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">&lt;</span><span style="color:#F69D50;">String</span><span style="color:#ADBAC7;">&gt;(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;key_from_module&quot;</span><span style="color:#ADBAC7;">) { </span><span style="color:#F47067;">value</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">-&gt;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"><span style="color:#768390;">// 发送给模块</span></span>
<span class="line"><span style="color:#ADBAC7;">dataChannel.</span><span style="color:#DCBDFB;">put</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;key_from_host&quot;</span><span style="color:#ADBAC7;">, </span><span style="color:#F47067;">value</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;I am host&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>你可以不设置 <code>dataChannel</code> 的 <code>value</code> 来达到仅通知模块或宿主回调 <code>wait</code> 方法。</p><blockquote><p>模块示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 从指定包名的宿主获取</span></span>
<span class="line"><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;listener_from_host&quot;</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"><span style="color:#768390;">// 发送给指定包名的宿主</span></span>
<span class="line"><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">put</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;listener_from_module&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote><p>宿主示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 从模块获取</span></span>
<span class="line"><span style="color:#ADBAC7;">dataChannel.</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;listener_from_module&quot;</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"><span style="color:#768390;">// 发送给模块</span></span>
<span class="line"><span style="color:#ADBAC7;">dataChannel.</span><span style="color:#DCBDFB;">put</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;listener_from_host&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>接收方需要保持存活状态才能收到通讯数据。</p></div><div class="custom-container tip"><p class="custom-container-title">小提示</p><p>更多功能请参考 <a href="../public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel">YukiHookDataChannel</a>。</p></div><h2 id="判断模块与宿主版本是否匹配" tabindex="-1"><a class="header-anchor" href="#判断模块与宿主版本是否匹配" aria-hidden="true">#</a> 判断模块与宿主版本是否匹配</h2><blockquote><p>通过通讯桥功能,<code>YukiHookAPI</code> 还为你提供了在用户更新模块后,判断模块是否与宿主版本匹配的解决方案。</p></blockquote><p>我们只需要调用 <code>checkingVersionEquals</code> 方法,即可实现这个功能。</p><p>在模块与宿主中可进行双向判断。</p><p>你可以在模块中判断指定包名的宿主是否与当前模块的版本匹配。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 从指定包名的宿主获取</span></span>
<span class="line"><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">checkingVersionEquals</span><span style="color:#ADBAC7;"> { isEquals </span><span style="color:#F47067;">-&gt;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>你还可以在宿主中判断是否自身与当前模块的版本匹配。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#768390;">// 从模块获取</span></span>
<span class="line"><span style="color:#ADBAC7;">dataChannel.</span><span style="color:#DCBDFB;">checkingVersionEquals</span><span style="color:#ADBAC7;"> { isEquals </span><span style="color:#F47067;">-&gt;</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="custom-container warning"><p class="custom-container-title">方法回调的条件</p><p>宿主、模块保持存活状态,并在激活模块后重启了作用域中的 Hook 目标宿主对象。</p></div><div class="custom-container tip"><p class="custom-container-title">小提示</p><p>更多功能请参考 <a href="../public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel">YukiHookDataChannel</a>。</p></div><h2 id="回调事件响应的规则" tabindex="-1"><a class="header-anchor" href="#回调事件响应的规则" aria-hidden="true">#</a> 回调事件响应的规则</h2><p>这里只列出了在模块中使用的例子,在<strong>同一个宿主</strong>中相同的 <code>key</code> 始终不允许重复创建,但<strong>不同的宿主</strong>中允许存在相同的 <code>key</code>。</p><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>在模块和宿主中,每一个 <strong>dataChannel</strong> 对应的 <strong>key</strong> 的回调事件<strong>都不允许重复创建</strong>,若重复,之前的回调事件会被新增加的回调事件替换,若在模块中使用,在同一个 <strong>Activity</strong> 中不可以重复,不同的 <strong>Activity</strong> 中相同的 <strong>key</strong> 允许重复。</p></div><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">MainActivity</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">AppCompatActivity</span><span style="color:#ADBAC7;">() {</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 回调事件 A</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo1&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;test_key&quot;</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 回调事件 B</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo1&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;test_key&quot;</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 回调事件 C</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo1&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;other_test_key&quot;</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 回调事件 D</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo2&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;other_test_key&quot;</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">OtherActivity</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">AppCompatActivity</span><span style="color:#ADBAC7;">() {</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onCreate</span><span style="color:#ADBAC7;">(savedInstanceState)</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 回调事件 E</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo1&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;test_key&quot;</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 回调事件 F</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo2&quot;</span><span style="color:#ADBAC7;">).</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;test_key&quot;</span><span style="color:#ADBAC7;">) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在上述示例中,虽然回调事件 A 与 B 是同一个宿主中的回调事件,但是它们的 <code>key</code> 相同,所以回调事件 A 会被回调事件 B 替换掉。</p><p>回调事件 C 的 <code>key</code> 不与其它重复,虽然回调事件 D 的 <code>key</code> 与回调事件 C 相同,但是它们的宿主不同,所以可以同时存在。</p><p>回调事件 E 在另一个 <strong>Activity</strong> 中,回调事件 F 与回调事件 E 的 <code>key</code> 虽然相同,但它们也不是同一个宿主,所以可以同时存在。</p><p>综上所述,最终回调事件 B、C、D、E、F 都可被创建成功。</p><div class="custom-container tip"><p class="custom-container-title">兼容性说明</p><p>在过往历史版本的 API 中不同的宿主设置相同的 <strong>key</strong> 会造成只有最后一个事件回调,但是最新版本更正了这一问题,请确保你使用的是最新的 API 版本。</p></div><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>一个相同 <strong>key</strong> 的回调事件只会回调当前模块正在显示的 <strong>Activity</strong> 中注册的回调事件,例如上述中的 <strong>test_key</strong>,如果 <strong>OtherActivity</strong> 正在显示,那么 <strong>MainActivity</strong> 中的 <strong>test_key</strong> 就不会被回调。</p><p>相同的 <strong>key</strong> 在同一个 <strong>Activity</strong> 不同的 <strong>Fragment</strong> 中注册 <strong>dataChannel</strong>,它们依然会在当前 <strong>Activity</strong> 中同时被回调。</p><p>在模块中,你可以在 <strong>Activity</strong>、<strong>Application</strong> 以及 <strong>Service</strong> 等地方使用 <strong>dataChannel</strong>,在 <strong>Activity</strong> 以外的地方使用时每个回调事件都会即时回调,此时你可以使用 <strong>ChannelPriority</strong> 进行管理。</p><p>若要在 <strong>Fragment</strong> 中使用 <strong>dataChannel</strong>,请使用 <strong>activity?.dataChannel(...)</strong>。</p></div><p>如果你希望在同一个 <strong>Activity</strong> 中手动设置每个回调事件的响应优先级 (条件),你可以使用 <code>ChannelPriority</code>。</p><p>例如,你正在使用一个 <strong>Activity</strong> 绑定多个 <strong>Fragment</strong> 的情况,这将能够解决这个问题。</p><blockquote><p>示例如下</p></blockquote><div class="language-kotlin line-numbers-mode" data-ext="kt"><pre class="shiki github-dark-dimmed" style="background-color:#22272e;" tabindex="0"><code><span class="line"><span style="color:#F47067;">open</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">BaseFragment</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">Fragment</span><span style="color:#ADBAC7;">() {</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">/** 标识当前 Fragment 处于 onResume 生命周期 */</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">var</span><span style="color:#ADBAC7;"> isResume </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onResume</span><span style="color:#ADBAC7;">() {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onResume</span><span style="color:#ADBAC7;">()</span></span>
<span class="line"><span style="color:#ADBAC7;"> isResume </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">true</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onPause</span><span style="color:#ADBAC7;">() {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onPause</span><span style="color:#ADBAC7;">()</span></span>
<span class="line"><span style="color:#ADBAC7;"> isResume </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onStop</span><span style="color:#ADBAC7;">() {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">super</span><span style="color:#ADBAC7;">.</span><span style="color:#DCBDFB;">onStop</span><span style="color:#ADBAC7;">()</span></span>
<span class="line"><span style="color:#ADBAC7;"> isResume </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#6CB6FF;">false</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">FragmentA</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">BaseFragment</span><span style="color:#ADBAC7;">() {</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 省略部分装载代码</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// ...</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onViewCreated</span><span style="color:#ADBAC7;">(view: </span><span style="color:#F69D50;">View</span><span style="color:#ADBAC7;">, savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 使用自定义的 isResume 结合 isVisible 条件判断当前 Fragment 正处于显示状态</span></span>
<span class="line"><span style="color:#ADBAC7;"> activity?.</span><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo1&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"><span style="color:#ADBAC7;"> ?.</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;test_key&quot;</span><span style="color:#ADBAC7;">, </span><span style="color:#DCBDFB;">ChannelPriority</span><span style="color:#ADBAC7;"> { isResume </span><span style="color:#F47067;">&amp;&amp;</span><span style="color:#ADBAC7;"> isVisible }) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F47067;">class</span><span style="color:#ADBAC7;"> </span><span style="color:#F69D50;">FragmentB</span><span style="color:#ADBAC7;"> : </span><span style="color:#F69D50;">BaseFragment</span><span style="color:#ADBAC7;">() {</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 省略部分装载代码</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// ...</span></span>
<span class="line"></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">override</span><span style="color:#ADBAC7;"> </span><span style="color:#F47067;">fun</span><span style="color:#ADBAC7;"> </span><span style="color:#DCBDFB;">onViewCreated</span><span style="color:#ADBAC7;">(view: </span><span style="color:#F69D50;">View</span><span style="color:#ADBAC7;">, savedInstanceState: </span><span style="color:#F69D50;">Bundle</span><span style="color:#ADBAC7;">?) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// 使用自定义的 isResume 结合 isVisible 条件判断当前 Fragment 正处于显示状态</span></span>
<span class="line"><span style="color:#ADBAC7;"> activity?.</span><span style="color:#DCBDFB;">dataChannel</span><span style="color:#ADBAC7;">(packageName </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;com.example.demo2&quot;</span><span style="color:#ADBAC7;">)</span></span>
<span class="line"><span style="color:#ADBAC7;"> ?.</span><span style="color:#DCBDFB;">wait</span><span style="color:#ADBAC7;">(key </span><span style="color:#F47067;">=</span><span style="color:#ADBAC7;"> </span><span style="color:#96D0FF;">&quot;test_key&quot;</span><span style="color:#ADBAC7;">, </span><span style="color:#DCBDFB;">ChannelPriority</span><span style="color:#ADBAC7;"> { isResume </span><span style="color:#F47067;">&amp;&amp;</span><span style="color:#ADBAC7;"> isVisible }) {</span></span>
<span class="line"><span style="color:#ADBAC7;"> </span><span style="color:#768390;">// Your code here.</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;"> }</span></span>
<span class="line"><span style="color:#ADBAC7;">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="安全性说明" tabindex="-1"><a class="header-anchor" href="#安全性说明" aria-hidden="true">#</a> 安全性说明</h2><p>在模块环境中,你只能接收<u><strong>指定包名的宿主</strong></u>发送的通讯数据且只能发送给<u><strong>指定包名的宿主</strong></u>,系统框架除外。</p><div class="custom-container danger"><p class="custom-container-title">特别注意</p><p>为了进一步防止广播滥用,通讯数据中 API 会自动指定宿主和模块的包名,防止其它 APP 监听并利用广播做出超限行为。</p></div>`,47),p=[o];function c(t,r){return n(),a("div",null,p)}const y=s(e,[["render",c],["__file","xposed-channel.html.vue"]]);export{y as default};