自动发帖软件

标题: 安卓H5日志打印运行过程例子 [打印本页]

作者: 发帖软件    时间: 5 小时前
标题: 安卓H5日志打印运行过程例子
安卓H5日志打印运行过程例子
安卓H5日志打印运行过程例子 群发软件发帖工具

安卓H5日志打印运行过程例子 群发软件发帖工具
  1. /**
  2. * ============================================
  3. * 日志桥接器 - 将print日志输出到H5界面
  4. * 版本: 1.1.0
  5. * 平台: Android (AIWROK)
  6. * 功能: 桥接print日志系统到现有H5界面
  7. * 交流QQ群: 711841924 (群一) / 528816639 (安卓内测群)
  8. * ============================================
  9. */
  10. // 🍎交流QQ群:711841924(群)
  11. // 🍎交流QQ群:528816639  (安卓内测群)
  12. /**
  13. * 延迟函数 (安卓环境兼容)
  14. * @param {number} ms - 延迟毫秒数
  15. */
  16. function _sleep(ms) {
  17.     sleep.millisecond(ms);
  18. }

  19. /**
  20. * LogBridge - 日志桥接器
  21. * 将print日志系统的输出桥接到指定的WebView
  22. */
  23. var LogBridge = {
  24.     webView: null,
  25.     activity: null,
  26.     isReady: false,
  27.     pendingLogs: [],
  28.     maxPendingLogs: 100,
  29.    
  30.     /**
  31.      * 初始化桥接器
  32.      * @param {WebView} webView - 目标WebView实例
  33.      * @param {Activity} activity - 活动实例
  34.      */
  35.     init: function(webView, activity) {
  36.         this.webView = webView;
  37.         this.activity = activity;
  38.         this.isReady = false;
  39.         this.pendingLogs = [];
  40.         
  41.         // 阻塞等待WebView加载完成
  42.         _sleep(800);
  43.         
  44.         this.isReady = true;
  45.         this._flushPendingLogs();
  46.         printl('日志桥接器已就绪');
  47.         
  48.         return this;
  49.     },
  50.    
  51.     /**
  52.      * 发送日志到H5
  53.      * @param {string} message - 日志消息
  54.      * @param {string} level - 日志级别 (info/success/warn/error/gold/debug)
  55.      */
  56.     log: function(message, level) {
  57.         level = level || 'info';
  58.         
  59.         // 如果还没准备好,缓存日志
  60.         if (!this.isReady || !this.webView) {
  61.             if (this.pendingLogs.length < this.maxPendingLogs) {
  62.                 this.pendingLogs.push({
  63.                     message: message,
  64.                     level: level,
  65.                     time: Date.now()
  66.                 });
  67.             }
  68.             return;
  69.         }
  70.         
  71.         this._sendToWebView(message, level);
  72.     },
  73.    
  74.     /**
  75.      * 刷新缓存的日志
  76.      */
  77.     _flushPendingLogs: function() {
  78.         if (this.pendingLogs.length === 0) return;
  79.         
  80.         printl('正在刷新 ' + this.pendingLogs.length + ' 条缓存日志...');
  81.         
  82.         // 逐条发送缓存的日志
  83.         while (this.pendingLogs.length > 0) {
  84.             var log = this.pendingLogs.shift();
  85.             this._sendToWebView(log.message, log.level);
  86.             // 小延迟避免阻塞
  87.             _sleep(10);
  88.         }
  89.     },
  90.    
  91.     /**
  92.      * 实际发送日志到WebView
  93.      */
  94.     _sendToWebView: function(message, level) {
  95.         try {
  96.             if (!this.webView) return;
  97.             
  98.             // 转义消息中的特殊字符
  99.             var escapedMessage = message
  100.                 .replace(/\\/g, '\\\\')
  101.                 .replace(/'/g, "\\'")
  102.                 .replace(/"/g, '\\"')
  103.                 .replace(/\n/g, '\\n')
  104.                 .replace(/\r/g, '\\r')
  105.                 .replace(/\t/g, '\\t');
  106.             
  107.             // 构建JavaScript代码
  108.             var js = "if(typeof addLog === 'function') { addLog('" + escapedMessage + "', '" + level + "'); }";
  109.             
  110.             // 保存当前对象的引用
  111.             var self = this;
  112.             
  113.             // 在主线程执行WebView操作
  114.             if (this.activity && typeof this.activity.runOnUiThread === 'function') {
  115.                 this.activity.runOnUiThread(function() {
  116.                     try {
  117.                         // 尝试多种方式执行JavaScript
  118.                         if (typeof self.webView.evaluateJavaScript === 'function') {
  119.                             self.webView.evaluateJavaScript(js);
  120.                         } else if (typeof self.webView.loadUrl === 'function') {
  121.                             var url = 'javascript:' + encodeURIComponent(js);
  122.                             self.webView.loadUrl(url);
  123.                         } else if (typeof self.webView.stringByEvaluatingJavaScriptFromString === 'function') {
  124.                             self.webView.stringByEvaluatingJavaScriptFromString(js);
  125.                         } else {
  126.                             // 安卓环境下的备用方法
  127.                             try {
  128.                                 self.webView.injectScript(js);
  129.                             } catch (e) {
  130.                                 printl('WebView执行JavaScript失败: ' + e.message);
  131.                             }
  132.                         }
  133.                     } catch (e) {
  134.                         printl('发送日志失败: ' + e.message);
  135.                     }
  136.                 });
  137.             } else {
  138.                 // 如果没有activity对象,直接执行(可能会失败)
  139.                 try {
  140.                     if (typeof this.webView.evaluateJavaScript === 'function') {
  141.                         this.webView.evaluateJavaScript(js);
  142.                     } else if (typeof this.webView.loadUrl === 'function') {
  143.                         var url = 'javascript:' + encodeURIComponent(js);
  144.                         this.webView.loadUrl(url);
  145.                     } else if (typeof this.webView.stringByEvaluatingJavaScriptFromString === 'function') {
  146.                         this.webView.stringByEvaluatingJavaScriptFromString(js);
  147.                     } else {
  148.                         // 安卓环境下的备用方法
  149.                         try {
  150.                             this.webView.injectScript(js);
  151.                         } catch (e) {
  152.                             printl('WebView执行JavaScript失败: ' + e.message);
  153.                         }
  154.                     }
  155.                 } catch (e) {
  156.                     printl('发送日志失败: ' + e.message);
  157.                 }
  158.             }
  159.         } catch (e) {
  160.             printl('发送日志失败: ' + e.message);
  161.         }
  162.     },
  163.    
  164.     // 快捷方法
  165.     info: function(message) { this.log(message, 'info'); },
  166.     success: function(message) { this.log(message, 'success'); },
  167.     warn: function(message) { this.log(message, 'warn'); },
  168.     error: function(message) { this.log(message, 'error'); },
  169.     gold: function(message) { this.log(message, 'gold'); },
  170.     debug: function(message) { this.log(message, 'debug'); }
  171. };

  172. /**
  173. * 增强版LogManager - 自动桥接到H5
  174. */
  175. var LogManagerH5 = {
  176.     logLevel: 'DEBUG',
  177.     enablePrefix: true,
  178.     bridge: null,
  179.    
  180.     ICONS: {
  181.         DEBUG: '[D]',
  182.         INFO: '[I]',
  183.         WARN: '[W]',
  184.         ERROR: '[E]',
  185.         SUCCESS: '[S]',
  186.         GOLD: '[G]'
  187.     },
  188.    
  189.     /**
  190.      * 初始化并绑定到WebView
  191.      * @param {WebView} webView - H5的WebView实例
  192.      * @param {Activity} activity - 活动实例
  193.      */
  194.     init: function(webView, activity) {
  195.         this.bridge = LogBridge;
  196.         this.bridge.init(webView, activity);
  197.         this.info('日志系统已连接到H5界面');
  198.         return this;
  199.     },
  200.    
  201.     _formatMessage: function(message, icon) {
  202.         if (this.enablePrefix && icon) {
  203.             return icon + ' ' + message;
  204.         }
  205.         return message;
  206.     },
  207.    
  208.     debug: function(message) {
  209.         if (this.bridge) {
  210.             this.bridge.log(this._formatMessage(message, this.ICONS.DEBUG), 'debug');
  211.         }
  212.         printl(message);
  213.     },
  214.    
  215.     info: function(message) {
  216.         if (this.bridge) {
  217.             this.bridge.log(this._formatMessage(message, this.ICONS.INFO), 'info');
  218.         }
  219.         printl(message);
  220.     },
  221.    
  222.     warn: function(message) {
  223.         if (this.bridge) {
  224.             this.bridge.log(this._formatMessage(message, this.ICONS.WARN), 'warn');
  225.         }
  226.         printl(message);
  227.     },
  228.    
  229.     error: function(message) {
  230.         if (this.bridge) {
  231.             this.bridge.log(this._formatMessage(message, this.ICONS.ERROR), 'error');
  232.         }
  233.         printl(message);
  234.     },
  235.    
  236.     success: function(message) {
  237.         if (this.bridge) {
  238.             this.bridge.log(this._formatMessage(message, this.ICONS.SUCCESS), 'success');
  239.         }
  240.         printl(message);
  241.     },
  242.    
  243.     gold: function(message) {
  244.         if (this.bridge) {
  245.             this.bridge.log(this._formatMessage(message, this.ICONS.GOLD), 'gold');
  246.         }
  247.         printl(message);
  248.     }
  249. };

  250. /**
  251. * 使用示例:
  252. *
  253. * // 在你的主脚本中:
  254. * Import("LogBridge.js");
  255. *
  256. * var web = new WebView();
  257. * web.show();
  258. * web.loadFile('h5.html');
  259. *
  260. * // 初始化日志桥接 (会阻塞等待WebView加载)
  261. * LogManagerH5.init(web);
  262. *
  263. * // 现在所有日志都会输出到H5界面
  264. * LogManagerH5.info('系统启动');
  265. * LogManagerH5.success('任务完成');
  266. * LogManagerH5.gold('获得100金币');
  267. */
  268. /**
  269. * ============================================
  270. * &#127822; print日志系统完整示例
  271. * 功能: 日志记录、调试输出、画中画管理
  272. * 交流QQ群: 711841924 (群一) / 528816639 (苹果内测群)
  273. * ============================================
  274. */
复制代码

  1. // &#127822;交流QQ群:711841924(群)
  2. // &#127822;交流QQ群:528816639  (安卓内测群)

  3. // 初始化一个activity页面
  4. var ac = new activity();

  5. ac.loadXML(`
  6. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  7.     android:layout_width="match_parent"
  8.     android:layout_height="match_parent"
  9.     android:orientation="vertical"
  10. >
  11.     <WebView
  12.         android:id="@+id/web"
  13.         android:layout_width="match_parent"
  14.         android:layout_height="0dp"
  15.         android:layout_weight="1" />
  16. </LinearLayout>
  17. `);

  18. // 延迟确保布局加载完成
  19. sleep.millisecond(400);

  20. // 获取 WebView 组件
  21. var web1 = ac.findWebViewById('web');
  22. // 将WebView对象暴露为全局变量,供主脚本使用
  23. global.web1 = web1;

  24. // 加载本地 HTML 文件(使用绝对路径)
  25. web1.url('/代码/h5.html');

  26. // 三秒倒计时
  27. printl("\n3 秒后启动...");
  28. for (var i = 3; i > 0; i--) {
  29.     printl(i + "...");
  30.     sleep.millisecond(1000);
  31. }
  32. printl("启动完成!\n");

  33. // 导入日志桥接器
  34. Import("LogBridge.js");

  35. // 初始化日志桥接(会阻塞等待WebView加载完成)
  36. LogManagerH5.init(web1, ac);

  37. // 定义 H5 中调用的函数
  38. function test(arg) {
  39.     LogManagerH5.info("我被 H5 调用了,参数是: " + arg);
  40. }

  41. // 定义返回桌面的函数,供H5页面调用
  42. function returnToHome() {
  43.     LogManagerH5.info("执行返回桌面操作");
  44.     // 安卓环境下的返回桌面操作
  45.     if (typeof device !== 'undefined' && device.home) {
  46.         device.home();
  47.     } else {
  48.         LogManagerH5.warn("返回桌面功能在当前环境不可用");
  49.     }
  50. }

  51. // 发送测试日志到H5界面
  52. LogManagerH5.success("系统启动成功");
  53. LogManagerH5.info("WebView已就绪");

  54. // ============================================
  55. // 导入并执行 PrintLogSystem 演示
  56. // ============================================

  57. // 导入并执行 PrintLogSystem 演示
  58. Import("PrintLogSystem.js");

  59. // 延迟执行,确保文件加载完成
  60. sleep.millisecond(100);

  61. // 执行演示(确保 PrintLogSystem.js 已加载)
  62. if (typeof runPrintLogSystemDemo === 'function') {
  63.     runPrintLogSystemDemo();
  64. } else {
  65.     LogManagerH5.error("PrintLogSystem.js 加载失败");
  66. }
  67. /**
  68. * ============================================
  69. * &#127822; print日志系统完整示例
  70. * 功能: 日志记录、调试输出、画中画管理
  71. * 交流QQ群: 711841924 (群一) / 528816639 (苹果内测群)
  72. * ============================================
  73. */
复制代码







欢迎光临 自动发帖软件 (http://www.fatiegongju.com/) Powered by Discuz! X3.2