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

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

  •  
  •   bthulu · 2022-07-06 08:44:44 +08:00 · 3699 次点击
    这是一个创建于 850 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 在搞 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  
       2022-07-06 08:52:42 +08:00
    uniapp 可以用 js 开发安卓 APP ,不太了解你说的 [收发原生广播] 如果 uniapp 不支持,可以用原生开发个 [收发原生广播] 的插件,引入到 uniapp 里用 js 调用即可。
    lbb2445
        2
    lbb2445  
       2022-07-06 08:53:24 +08:00
    uniapp ,然后试着做安卓插件
    ifdef
        3
    ifdef  
       2022-07-06 08:53:38 +08:00
    你 webview 不是要放在 activity/fragment 里吗,在广播的 onReceive 里 reload 一下不就传进 webview 里了?
    b1iy
        4
    b1iy  
       2022-07-06 09:02:12 +08:00
    一般 PDA 都能设置结果返回方式,先找设置改改试试

    广播就只能自定义 native 插件,native 保存 js callback 引用,间接实现广播
    jswh
        5
    jswh  
       2022-07-06 09:03:02 +08:00   ❤️ 1
    1. 混合开发有挺多方案的。uniapp ,react native ,Ionic ,也基本都支持原生插件。
    2. webview 可以用 jsbridge 通信。
    3. 按你的需求弄个小程序结构的程序框架蛮合适的。
    lizhenda
        6
    lizhenda  
       2022-07-06 09:07:10 +08:00
    专业的人做专业的事,钱多另说
    nitmali
        7
    nitmali  
       2022-07-06 09:11:02 +08:00   ❤️ 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
       2022-07-06 09:32:46 +08:00
    @nitmali 感谢. 刚才试装了下 uniapp 官方 demo, 感觉卡顿还是比较严重, PDA 上的 cpu 是 MSM8916, 比手机上的性能差远了.
    gzf6
        9
    gzf6  
       2022-07-06 09:43:40 +08:00 via Android
    Capacitor 或者 cordova ,按照他们的规范自己写插件也行
    x13945
        10
    x13945  
       2022-07-06 09:44:01 +08:00 via Android
    那就换 rn 吧,开发效率和前端有一拼
    vone
        11
    vone  
       2022-07-06 09:50:09 +08:00
    Android PDA 的扫码器不都是模拟键盘的输入然后加一个回车键,扫码结果可以通过焦点状态的输入框接收到的,不用自己写接收逻辑。

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

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

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