|
|
@@ -1,6 +1,6 @@
|
|
|
"ui";
|
|
|
/*! tiktok-app v2026.10.13
|
|
|
- * built 2026-10-21T15:00:55.550Z
|
|
|
+ * built 2026-10-22T07:14:22.045Z
|
|
|
* modules: theme, store, records, sources, device, service, engine, session, widgets, dialog, floatball, page-id, page-dm, page-video, page-tasks, page-records, page-login, page-mine, main
|
|
|
* 由 tools/build.js 自动生成 —— 请不要直接编辑本文件,改 src/ 后重新构建。
|
|
|
*/
|
|
|
@@ -8273,6 +8273,22 @@ Pages.mine = function () {
|
|
|
/* 设备信息放在最后一行,排障时一眼能看到当前跑在什么机器上 */
|
|
|
blocks.push(W.hint(Device.deviceLabel() + " \u00B7 " + Device.appVersionName(), false));
|
|
|
|
|
|
+ /* —— 退出应用 ——
|
|
|
+ * ★ 为什么要有这个入口:以前主界面里**没有**退出,用户想关掉只能按返回或 HOME。
|
|
|
+ * 而按 HOME 是"退到后台",不是关闭 —— 悬浮球会继续浮在桌面和别的 App 上面
|
|
|
+ * (它本来就是为了在 TikTok 里操作才存在的)。用户看到球还在,就会认为"关不掉"。
|
|
|
+ * 给一个明确的出口:停脚本 → 关球 → 退到桌面,三件事一次做完。
|
|
|
+ * 靠 `events.on("exit")` 和 Activity 轮询也能清,但那些是兜底,不该是用户唯一的办法。 */
|
|
|
+ blocks.push(U.spacer(8));
|
|
|
+ var exitLink = W.link("\u9000\u51FA\u5E94\u7528\uFF08\u505C\u811A\u672C \u00B7 \u5173\u60AC\u6D6E\u7403\uFF09",
|
|
|
+ Theme.hex.textMuted, function () {
|
|
|
+ Dialog.exitApp(function () {
|
|
|
+ FB.destroy();
|
|
|
+ App.exit();
|
|
|
+ });
|
|
|
+ });
|
|
|
+ blocks.push(exitLink);
|
|
|
+
|
|
|
W.stack(inner, blocks, Theme.m.gapCard);
|
|
|
|
|
|
var scroller = W.scroller();
|
|
|
@@ -9412,6 +9428,59 @@ App.mount = function (root) {
|
|
|
ui.setContentView(root);
|
|
|
};
|
|
|
|
|
|
+/**
|
|
|
+ * 界面被关掉时,把悬浮球一起带走。
|
|
|
+ *
|
|
|
+ * ★ 为什么必须有这个:AutoX 的 UI 模式下**「Activity 关闭」不等于「脚本结束」**。
|
|
|
+ * 界面脚本跑在 `:script` 进程的线程里,用户从最近任务划掉界面(或按返回退出)后,
|
|
|
+ * 脚本仍在跑 —— 而悬浮球窗口是**脚本**持有的,于是球留在别的 App 上面,
|
|
|
+ * 看起来就是"应用都关了,球还浮着"。
|
|
|
+ * 实测(2026-10-22):前台已是 AutoX 的 MainActivity、`:script` 进程存活、
|
|
|
+ * dumpsys 里还有 8 个 autojs 窗口残留。
|
|
|
+ *
|
|
|
+ * 两条兜底,各自覆盖一种情况:
|
|
|
+ * ① `events.on("exit")` —— 脚本正常结束或抛异常时清一次。
|
|
|
+ * 进程被系统杀掉时走不到这里,但那种情况窗口会随进程一起被回收,不用我们管。
|
|
|
+ * ② 轮询 `activity` 是否已 finish —— **唯一能覆盖"界面关了但脚本还活着"的路径**,
|
|
|
+ * 也就是用户报的这个场景。
|
|
|
+ */
|
|
|
+function bindLifecycleCleanup() {
|
|
|
+ try {
|
|
|
+ events.on("exit", function () {
|
|
|
+ try { FB.destroy(); } catch (e) { /* 退出路径上不能再抛 */ }
|
|
|
+ });
|
|
|
+ } catch (e) {
|
|
|
+ console.log("[app] events.on(exit) 不可用(不影响其它清理路径): " + e);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 只有"曾经拿到过 activity、后来它没了/在销毁"才算关闭。
|
|
|
+ * 这样在 PC 侧 smoke(没有 activity 这个全局)里不会误触发 exit()。 */
|
|
|
+ var sawActivity = false;
|
|
|
+
|
|
|
+ App.lifecycleTick = setInterval(function () {
|
|
|
+ var gone = false;
|
|
|
+ try {
|
|
|
+ if (typeof activity !== "undefined" && activity !== null) {
|
|
|
+ sawActivity = true;
|
|
|
+ gone = activity.isFinishing() || activity.isDestroyed();
|
|
|
+ } else if (sawActivity) {
|
|
|
+ gone = true;
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ /* 拿 activity 时抛异常 = 它已经没了 */
|
|
|
+ gone = sawActivity;
|
|
|
+ }
|
|
|
+ if (!gone) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ try { clearInterval(App.lifecycleTick); } catch (ignored) { }
|
|
|
+ App.lifecycleTick = null;
|
|
|
+ console.log("[app] 界面已关闭,清理悬浮球并结束脚本");
|
|
|
+ try { FB.destroy(); } catch (e2) { /* 同上 */ }
|
|
|
+ try { exit(); } catch (e3) { /* 老版本 AutoX 可能没有 exit() */ }
|
|
|
+ }, 1500);
|
|
|
+}
|
|
|
+
|
|
|
App.main = function () {
|
|
|
Store.init();
|
|
|
|
|
|
@@ -9478,6 +9547,8 @@ App.main = function () {
|
|
|
|
|
|
/* 冷启动也是"要用球"的场景:已激活时直接把它挂上(未激活时 canShow 自己会拦住) */
|
|
|
FB.ensure();
|
|
|
+ /* 界面关了要把球带走 —— 见 bindLifecycleCleanup 的注释 */
|
|
|
+ bindLifecycleCleanup();
|
|
|
App.renderScreen();
|
|
|
|
|
|
console.log("[app] 界面已就绪,screen=" + App.screen + " 页签=" + App.activeTab);
|