来来去去
来来去去
  • 发布:2017-08-10 18:55
  • 更新:2017-08-11 14:42
  • 阅读:2457

原生java代码怎么向页面传数据

分类:5+ SDK

app主html页面里怎么接收 原生传来的数据。
数据是原生主动传过来的,不是通过插件返回的

2017-08-10 18:55 负责人:无 分享
已邀请:
来来去去

来来去去 (作者)

谢谢大家,已经实现了,重点就是在把调用插件的Webview缓存下来,下次要发消息,就调用这个webview,向他传消息就好了。

参考官方给的插件样例,增加一个init方法。
js端,在官方test.js的PluginTestFunctionSyncArrayArgu 方法后面加上init方法

PluginTestFunctionSyncArrayArgu : function (Argus)   
        {                                     
            return B.execSync(_BARCODE, "PluginTestFunctionSyncArrayArgu", [Argus]);  
        },  
        // Android methods  
        init : function(Argus) {  
            B.exec(_BARCODE, "init", [Argus]);  
        }

java端,在官方给的PGPlugintest.java上增加这两个方法

        private static IWebview mIWebview;//记录初始化插件的webview  
    public void init(IWebview webview, String data) {  
        mIWebview = webview;  
        startListenerTask();  
    }  
    public void sendMsg(String msg){  
        System.out.println(msg);  
        String format = "receiveTest(%s);";//填写接收端的方法  
        final String js = String.format(format, msg);  
        mIWebview.getActivity().runOnUiThread(new Runnable() {  
            @Override  
            public void run() {  
                mIWebview.loadUrl("javascript:" + js);  
            }  
        });  
    }

其中init方法把请过来的IWebview webview,记录下来,sendMsg里面就是用缓存了的webview发消息。

在html页面,增加些:

mui.plusReady(function() {  
    //初始插件调用的webview  
    plus.plugintest.init('aaaaa');  
});  
//接收插件传过来的消息  
function receiveTest(data){  
    console.log(data)  
}

在plusReady里init里一下插件,后台就可以缓存当前的webview了,receiveTest与String format = "receiveTest(%s);";中的方法是对应的。

这样就行了,以后在java端只用调用 sendMsg方法就可以向这个页面传数据,数据会被receiveTest接收。
上面只是写的一个小测试,能实现数据的传输,进一步改装都不再是问题了

根据这个思路,我感觉 应该还有更简单的传数据方法。
比如说
1、可以不可以在后台通过PandoraEntry直接找到主activity,进而找到app的主html的webview
这样就可以直接向主webview发消息,在主webview做接收就好了。
2、官方push就有接收推送消息的办法,plus.push.addEventListener( "receive", function( msg ) {});怎么样写数据,直接让这个receive能收到消息

如果官方有人看到,麻烦指导一下。。。

赵梦欢

赵梦欢 - 专注前端,乐于分享!

来来去去

来来去去 (作者)

这是推送啊。。。。
在同一个app里混合开发

  • 赵梦欢

    参考这个写插件。

    2017-08-11 09:55

Kapsugar

Kapsugar

可以用JQ AJAX来传值
String result="success";
response.setCharacterEncoding("UTF-8");
response.getWriter().write(result);

--------------------前台data接受的就是success这个值了

  • 来来去去 (作者)

    谢谢,但你这是服务后台传参代码,我要的是同一个app里的原生与h5的交互

    2017-08-11 10:04

  • Kapsugar

    我理解错了?不是服务端向前段传值?不能用JSP之类的?

    2017-08-11 10:08

来来去去

来来去去 (作者)

去看了下极光推送的源码,找到了一些代码

JSONObject data = getMessageObject(msg, extras);  
String format = "plus.Push.receiveMessageInAndroidCallback(%s);";  
final String js = String.format(format, data.toString());  
        mIWebview.getActivity().runOnUiThread(new Runnable() {  
            @Override  
            public void run() {  
                mIWebview.loadUrl("javascript:" + js);  
            }  
        });

应该是可以用的,我再试试,改装一下

赵梦欢

赵梦欢 - 专注前端,乐于分享!

仔细看看我上面发的那个插件的代码:

JS部分

fireDocumentEvent : function(ename, jsonData) {  
    var event = document.createEvent('HTMLEvents')  
    event.initEvent(ename, true, true)  
    event.eventType = 'message'  

    jsonData = JSON.stringify(jsonData)  
    var data = JSON.parse(jsonData)  
    event.arguments = data  
    document.dispatchEvent(event)  
},  
onGetRegistrationId : function(rId) {  
    if(plus.os.name == 'Android') {  
        this.fireDocumentEvent('jpush.onGetRegistrationId', rId)  
    }  
}

原生代码里面有调用fireDocumentEvent的地方,仔细看看就可以看到。
java部分:

public static void transmitGetRegistrationId(String rId) {  
        String format = "plus.Push.onGetRegistrationId(%s);";  
        final String js = String.format(format, rId);  
        if (mIWebview == null) {  
            mRegistrationId = rId;  
        } else {  
            mIWebview.getActivity().runOnUiThread(new Runnable() {  
                @Override  
                public void run() {  
                    mIWebview.loadUrl("javascript:" + js);  
                }  
            });  
        }  
 }

该问题目前已经被锁定, 无法添加新回复