V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bthulu
V2EX  ›  程序员

有没有什么简单的能用 js 开发安卓应用并能收发原生广播的东西么

  •  
  •   bthulu · 92 天前 · 2126 次点击
    这是一个创建于 92 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 在搞 PLC 上位机. 后台, 安卓, web 前端, 桌面端一条龙, 天天在 java, c#, js 之间无缝切换.
    • 经常是一个功能接着一个功能, 一个前端接着一个前端, 一个 android app 接着一个 android app, 换个客户就要根据客户厂内实际情况改这里改那里.
    • 功能都不复杂, 要的就是快速响应, 越快越好.
    • 最近 android app 变更频繁, 我本来主攻 c#和 java 后台. 安卓实在是不熟, 开发速度慢了被催死了, 天天加班加到晚上十点十二点周末无休的.
    • 想问问有没有啥办法能用 js 开发么? 安卓我一来不熟悉开发慢, 二来每次改了点啥看效果, 都要点下 android studio 上面的 debug 按钮, 然后编译打包 install 到 PDA, 光这个 debug 每次就要等个 30 秒, 太恶心了.
    • 如果是 js, vue 这种, 改了啥立马就能刷新效果的就好了, 我就不用天天熬夜了.
    • 曾想过直接开发 pwa 应用, 但是没办法, 工业用的安卓 PDA 需要对接 PDA 上的扫码器. 基本就是发个广播通知 PDA 上的扫码器, 再注册个广播接收扫码结果. 纯 js 它干不了这个啊. 我该怎么办? 在原生安卓里添加一个 webview, 再把收到的扫码结果传递到 webview 里去么?
    • 调用 PDA 扫码器和接收扫码结果的代码如下:
        private static final String ACTION_CLAIM_SCANNER = "com.honeywell.aidc.action.ACTION_CLAIM_SCANNER";
        private static final String EXTRA_PROPERTIES = "com.honeywell.aidc.extra.EXTRA_PROPERTIES";
    
        @Override
        public void use() {
            // 指定扫码结果广播接收器的 ACTION 名称
            Bundle properties = new Bundle();
            properties.putBoolean("DPR_DATA_INTENT", true);
            properties.putString("DPR_DATA_INTENT_ACTION", ACTION_BARCODE_DATA);
            // 如需启用指定的 profile, 可 putExtra(EXTRA_PROFILE, "MyProfile1")
            Intent intent = new Intent(ACTION_CLAIM_SCANNER).putExtra(EXTRA_PROPERTIES, properties);
            context.sendBroadcast(intent);
    
            // 注册扫码结果广播接收器
            context.registerReceiver(receiver, new IntentFilter(ACTION_BARCODE_DATA));
        }
    
        private static final String ACTION_RELEASE_SCANNER = "com.honeywell.aidc.action.ACTION_RELEASE_SCANNER";
    
        @Override
        public void release() {
            listeners.clear();
            context.unregisterReceiver(receiver);
            context.sendBroadcast(new Intent(ACTION_RELEASE_SCANNER).setPackage("com.intermec.datacollectionservice"));
        }
    
    31 条回复    2022-07-06 21:48:56 +08:00
    yzkos
        1
    yzkos  
       92 天前
    uniapp 可以用 js 开发安卓 APP ,不太了解你说的 [收发原生广播] 如果 uniapp 不支持,可以用原生开发个 [收发原生广播] 的插件,引入到 uniapp 里用 js 调用即可。
    lbb2445
        2
    lbb2445  
       92 天前
    uniapp ,然后试着做安卓插件
    ifdef
        3
    ifdef  
       92 天前
    你 webview 不是要放在 activity/fragment 里吗,在广播的 onReceive 里 reload 一下不就传进 webview 里了?
    b1iy
        4
    b1iy  
       92 天前
    一般 PDA 都能设置结果返回方式,先找设置改改试试

    广播就只能自定义 native 插件,native 保存 js callback 引用,间接实现广播
    jswh
        5
    jswh  
       92 天前   ❤️ 1
    1. 混合开发有挺多方案的。uniapp ,react native ,Ionic ,也基本都支持原生插件。
    2. webview 可以用 jsbridge 通信。
    3. 按你的需求弄个小程序结构的程序框架蛮合适的。
    lizhenda
        6
    lizhenda  
       92 天前
    专业的人做专业的事,钱多另说
    nitmali
        7
    nitmali  
       92 天前   ❤️ 1
    uniapp 可以
    demo:

    //获取 activity
    const main = plus.android.runtimeMainActivity();
    const IntentFilter = plus.android.importClass('android.content.IntentFilter');
    const filter = new IntentFilter ();
    // 监听广播
    filter.addAction("你的广播")
    const receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
    onReceive: function(context, intent) {
    plus.android.importClass(intent)
    // TODO 操作数据
    console.log(JSON.stringify(intent))
    }
    })

    // 注册监听
    main.registerReceiver(receiver, filter);

    // 关闭
    // main.unregisterReceiver(receiver);
    bthulu
        8
    bthulu  
    OP
       92 天前
    @nitmali 感谢. 刚才试装了下 uniapp 官方 demo, 感觉卡顿还是比较严重, PDA 上的 cpu 是 MSM8916, 比手机上的性能差远了.
    gzf6
        9
    gzf6  
       92 天前 via Android
    Capacitor 或者 cordova ,按照他们的规范自己写插件也行
    x13945
        10
    x13945  
       92 天前 via Android
    那就换 rn 吧,开发效率和前端有一拼
    vone
        11
    vone  
       92 天前
    Android PDA 的扫码器不都是模拟键盘的输入然后加一个回车键,扫码结果可以通过焦点状态的输入框接收到的,不用自己写接收逻辑。

    而且就算是你们需要底层开发去支持扫码器,也应该是开发一个单独的应用去提供扫描和接收结果的功能,然后有需要的时候安装这个应用,由这个应用在需要时触发扫码,然后把扫描结果转发给焦点状态的输入框。
    bthulu
        12
    bthulu  
    OP
       92 天前
    @vone 你是没开发过工厂工人用的 app, 工人还给你去戳一下输入框激活焦点? 想都不用想. 工人只想按一下 PDA 上的物理扫码键然后就完事了. 再多点一下输入框, 工人要造反的.
    lsyAndroid
        13
    lsyAndroid  
       92 天前
    走 jsbridge ,前端页面用 js 写,原生 app 侧接收 js 发送的数据,进行数据处理。
    wenruoliushui
        14
    wenruoliushui  
       92 天前
    js 只能跟原生交互,离不开原生。
    vone
        15
    vone  
       92 天前
    @bthulu js 调用 input.focus() 获取一下焦点。
    james2013
        16
    james2013  
       92 天前
    是不是你用 Android Studio 的方式不对呢?
    使用 Android Studio 运行是使用 Run 按钮
    点击 Run 按钮可以直接安装到设备上,你这种小的 app 估计只需要几秒就能装上
    flytsuki
        17
    flytsuki  
       92 天前
    android 加 flutter 吧,比 webview 好用多了
    bthulu
        18
    bthulu  
    OP
       92 天前
    @james2013 哪这么快哦, 可能是我笔记本性能太差了吧, PDA 性能也不行吧, 神州本, i5-8300H, 实测至少 15 秒.
    xiangyuecn
        19
    xiangyuecn  
       92 天前
    自己简单写一个 jsbridge 就行了,java+js 200 行撑死,网页界面页面可以直接复用桌面版的,微调一下改成移动版

    别听什么 uniapp react flutter ,纯粹心智负担
    FaiChou
        20
    FaiChou  
       92 天前 via iPhone
    autojs
    yuuko
        21
    yuuko  
       92 天前
    Capacitor native 部分搞个 native 插件
    guxin0123
        22
    guxin0123  
       92 天前
    我干过 js 读取 nfc
    也是 jsbridge
    codehz
        23
    codehz  
       92 天前
    你把检测原生广播的部分用 java 写,收到后调用页面中特定命名的全局函数,js 部分把这个函数实现了,后续工作就在 web 里做不就好了?
    wangtian2020
        24
    wangtian2020  
       92 天前
    https://quasar.dev/
    quasar 框架,vite 的毫秒级更新
    在上面用自己编写的 cordova 插件,可以实现所有原生的功能,还能保留 web 的灵活性

    用 PLC ,你们也是工业软件公司吗
    NonClockworkChen
        25
    NonClockworkChen  
       92 天前   ❤️ 2
    让新手搞 RN 的,大大地凉心
    OldDriver8848
        26
    OldDriver8848  
       92 天前
    flutter 热重载,改完立刻就能看到效果
    cenbiq
        27
    cenbiq  
       92 天前 via iPhone
    可以试试 jetpack compose
    404neko
        28
    404neko  
       92 天前
    很多年前撸过一个小 APP, Javascript 是用 Rhino 支持的, 可以接收到广播
    DOLLOR
        29
    DOLLOR  
       92 天前
    我也觉得 webview+jsbridge 是最好的,web 不搞花里胡哨的东西性能就不会差。
    whyrookie
        30
    whyrookie  
       92 天前
    原生写个广播接收器,收到广播之后调用 js 中的方法,感觉这样比较轻量
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1287 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 00:07 · PVG 08:07 · LAX 17:07 · JFK 20:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.