尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Cordova-Android 高级特性指南:多 Activity、权限、生命周期 3 个机制一次讲清

Cordova-Android 高级特性指南:多 Activity、权限、生命周期 3 个机制一次讲清 Cordova-Android 高级特性指南多 Activity、权限、生命周期 3 个机制一次讲清【免费下载链接】cordova-androidApache Cordova Android项目地址: https://gitcode.com/gh_mirrors/co/cordova-androidCordova-Android 是 Apache Cordova 跨平台容器的 Android 平台适配层把 Web 页面打包成原生 App。本文覆盖 Cordova-Android 高级特性里的三块多 Activity 页面流程、动态权限申请、生命周期状态同步每块都给出可直接照做的步骤。一、把页面流程搭起来多 Activity 应用搭建步骤 什么时候必须跳出单 ActivityCordova 默认形态是一个 CordovaActivity 承载全部页面绝大多数应用够用。以下情况才需要拆多 Activity深度链接要直达某个原生页面如扫码结果页、登录回跳页需要独立的生命周期控制比如支付页不能被系统随首页一起回收页面间要隔离内存避免长列表 WebView 互相拖累继承 CordovaActivity 的最小改动官方模板生成的 Activity 非常薄照着继承即可public class SecondActivity extends CordovaActivity { Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); loadUrl(launchUrl); } }super.onCreate()必须调Cordova 桥和 WebView 初始化都在父类完成launchUrl来自 config.xml 的content srcindex.html /也可以直接换你要的页面完整模板还处理了cdvStartInBackground后台启动场景见 templates/project/Activity.java新建的 Activity 必须在 Manifest 里声明activity节点参照 templates/project/AndroidManifest.xmlActivity 之间怎么传值去程用 Intent extraintent.putExtra(orderId, A1024)接收端在onCreate里getIntent().getExtras().getString(orderId)回程结果用setResultonActivityResult或者干脆落存储只传 ID别在 Intent 里塞大对象复杂数据先持久化、再传引用二、让权限申请过一次审Cordova 权限申请流程 Android 6.0 权限模型对插件意味着什么安装期只声明普通权限相机、定位、存储这类危险权限必须在运行时向用户申请Cordova-Android 把发起请求 结果回传整条链路封装进框架插件只负责发起不要自造权限弹窗复用框架通道结果分发才不会丢检查与请求怎么写老插件常用静态助手类 PermissionHelper已标记 deprecated为兼容 5.0 之前项目保留if (!PermissionHelper.hasPermission(this, Manifest.permission.CAMERA)) { PermissionHelper.requestPermission(this, 1001, Manifest.permission.CAMERA); }新代码直接走cordova.requestPermission(plugin, requestCode, permission)少一层反射requestCode是业务自定义编号结果回来时靠它识别是哪次请求助手类实现见 framework/src/org/apache/cordova/PermissionHelper.java结果怎么回到插件系统回调入口是 Activity 的onRequestPermissionsResult默认实现在 framework/src/org/apache/cordova/CordovaActivity.java框架按 requestCode 找到发起请求的插件调用插件的onRequestPermissionResult(requestCode, permissions, grantResults)插件里不需要碰 Activity 回调实现这一个方法即可判断依据是grantResults[0] PackageManager.PERMISSION_GRANTED被拒后怎么办先区分拒绝和拒绝且不再询问后者系统不会再弹框前者展示用途说明给用户二次授权入口后者只能引导去 设置 → 应用详情 → 权限 手动开给降级路径相机被拒可改从相册上传定位被拒提供手选城市把拒绝事件埋点上报方便后续判断哪些功能真的缺这个权限三、Web 层和原生层的状态对齐Cordova 生命周期管理 ⚡插件的生命周期钩子框架会把 Activity 的每次状态变化广播给所有已注册插件分发逻辑在 framework/src/org/apache/cordova/PluginManager.javapublic void onPause(boolean multitasking) { /* 暂停轮询、暂停计时器 */ } public void onResume(boolean multitasking) { /* 恢复轮询、拉新数据 */ }五个钩子一一对应 Android 的 Activity 状态CordovaPlugin 里有默认空实现按需重写multitasking为 true 表示 keepRunning 生效应用退后台后仍保活时机 → 原生方法 → JS 事件触发时机原生插件方法JS 侧事件应用变为可见onStart()无直接事件切走 / 锁屏onPause(boolean)pause回到前台onResume(boolean)resume不再可见onStop()无直接事件Activity 销毁onDestroy()无直接事件JS 侧只需要监听两个事件路由实现在 cordova-js-src/platform.jsdocument.addEventListener(pause, () stopTimer(), false); document.addEventListener(resume, () startTimer(), false);keepRunning 偏好怎么生效config.xml 的KeepRunning默认 true决定后台是否继续跑 WebView为 true 时onPause不销毁视图计时器、动画照跑为 false 则 JS 整体挂起框架在 CordovaActivity 里读该值并传给handlePause/handleResume插件无需感知四、落地清单权限与生命周期 checklist ️方向建议页面流程有独立生命周期需求才拆多 Activity其余在 Web 层做路由页面流程新 Activity 全部在 AndroidManifest 声明需要被外部唤起时补 intent-filter页面流程Intent 只传简单值复杂数据先持久化再传 ID权限按最小权限原则申请只申请当前功能真正用到的权限每个危险权限都配一条被拒降级路径不能只弹提示框权限每个插件规划自己的 requestCode 号段避免互相覆盖生命周期网络请求、定时器在onPause释放onResume里恢复生命周期需要后台存活的应用显式确认 KeepRunning 为 true并实测回前台流程收尾想动手验证本文的机制把仓库拉下来git clone https://gitcode.com/gh_mirrors/co/cordova-android建议优先翻framework/src/org/apache/cordova/目录CordovaActivity、PluginManager、CordovaPlugin、CordovaWebViewImpl 四个文件装下了绝大部分原生逻辑。写插件前先把这四个文件过一遍权限和生命周期的问题基本都能当场定位。【免费下载链接】cordova-androidApache Cordova Android项目地址: https://gitcode.com/gh_mirrors/co/cordova-android创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表