MUI_5+SDK_Native.js

5+SDK提供丰富的API以此来访问Native层的对象/方法,本篇主要功能实现html层调用native层的自定义方法以及从html层调转到指定的Activity,以及Activity关闭或者Html关闭后回调启动onActivityResult
涉及到Html5+方法:

importClass: 导入Java类对象
newObject: 创建实例对象
invoke: 调用对象(类对象/实例对象)的方法

runtimeMainActivity: 获取应用主Activity实例对象


1. html层调用Native层自定义方法

  1.1 html调用当前所处实列对象(Activity)的方法:

      代码片段:
      html层:(native.html)
       invokecurrentbt.addEventListener('tap', function() {
			// 获取当前运行Activity实列对象
			StartWebApp = plus.android.runtimeMainActivity();
			// 调用当前实列对象的静态方法
			plus.android.invoke(StartWebApp, 'testMethod');
		});
           
      java层:(StartWebApp.class)
       public static void testMethod(){
		  Toast.makeText(context, "OMG!native方法被html调用了", Toast.LENGTH_SHORT).show();
	    }

  1.2 html调用Native层指定类的方法:

      代码片段:

      html层:(native.html)
       invokecommonbt.addEventListener('tap', function() {
		StartWebApp = plus.android.runtimeMainActivity();
		/**
		* 方法1:通过importClass导入Java类对象,通过对象调用方法
		* 缺 点:导入java类消耗内存过大
		* 优 点:创建对象后灵活调用方法不局限静态方法
		*/
		var Commutils = plus.android.importClass('com.example.utils.Commutils'); // 导java类对象
		var mcommonutils = new Commutils(); // new方式创建对象实例
		mcommonutils.showToast(); // 调用对象方法
		/**
		* 方法2:通过newObject创类对象,通过invoke方式调用类对象静态方法
		* 缺点:只能调用静态方法
		* 优点:减少系统资源消耗</span>
		*/
		var Commutils = plus.android.newObject('com.example.utils.Commutils');  // 创建对象实例
		plus.android.invoke(Commutils, 'showToast',StartWebApp,'newObjecinvoke');// 调用对象方法
		/**
		* 方法三:直接使用invoke调用类的静态方法
		* 缺点:只能调用静态方法
		* 优点:减少系统资源消耗
		*/
		plus.android.invoke('com.example.utils.Commutils', 'showToast', StartWebApp, 'invoke');
	 });
       
      java层:(Commutils.class)
       public class Commutils {
	       public static void showToast(Context context,String text){
		     Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
	       }
	
       public static void showToast(){
		    System.out.println("html invoke native method");
	      }
      }

2. html层跳转指定Activity

  方法一:
         $1. html层通过importClass/newObject 获取Intent对象
         $2. 通过runtimeMainActivity获取当前的主Activity实列对象
         $3. 调用startActivity(intent)跳转目标Activity
      代码片段:
         var Intent = plus.android.importClass("android.content.Intent");
         var ComponentName = plus.android.importClass("android.content.ComponentName");
         var intent= new Intent();
         intent.setComponent(new ComponentName("com.example", "com.example.JumpActivity"));
         var currentActivity = plus.android.runtimeMainActivity();
         currentActivity .startActivity(intent);

  方法二:
      通过Native层封装方法跳转方法,供html层调用即可
      代码片段:
      JAVA层:   
       public static void jumptoActivity(Context contxt){
		  Intent intent = new Intent(contxt,JumpActivity.class);
		      contxt.startActivity(intent);
       }
      HTML层:
       jumpactivity.addEventListener('tap', function() {
		  /**
		   * 方法1:通过native层封装,html层调用封装方法即可
		   */
		   currentActivity = plus.android.runtimeMainActivity();
		   plus.android.invoke('com.example.utils.Commutils', 'jumptoActivity', currentActivity);
		});

3. Activity/Html关闭回调 onActivityResult

  3.1 Activity关闭回调 html中实现的onActivityResult

      流程: 从A.html中跳转BActivity,BActivity退出后携带参数回调A.html中实现的onActivityResult。
      代码片段:
      HTML层:
       jumpActivitybackvalue.addEventListener('tap', function() {
			var currentActivity = plus.android.runtimeMainActivity();
			var Intent = plus.android.importClass('android.content.Intent')
			var ComponentName = plus.android.importClass("android.content.ComponentName");
			var intent = new Intent();
			intent.setComponent(new ComponentName("com.example.fristdemo_5sdk", "com.example.fristdemo_5sdk.JumpActivity"));
			currentActivity.startActivityForResult(intent, 100);
			currentActivity.onActivityResult = function(requestCode, resultCode, data) {
				plus.android.importClass(data);
				var str = data.getStringExtra('zcmain');
				alert('回调成功啦....' + str);
			}
		});
      Java层:
       Intent intent = new Intent();
	   intent.putExtra("zcmain", "张三");
	   setResult(100,intent);
	   finish();

  3.2 Activity通过startWebApp方式启动html,html关闭退出携带参数回调 Activity的onActivityRersult方法

      流程: AActivity 启动 BActivity通过B.html页面通过startWebApp启动html,B.html退出回调AActivity的onActivityResult方法
      代码片段:
      Java层:
       AActivity:
       bt.setOnClickListener(new OnClickListener() {
		    @Override
			public void onClick(View v) {
			     Intent intent = new Intent(MainActivity.this,StartWebApp.class);
			     startActivityForResult(intent, 200);  
			   }
		});			
			
       @Override
       protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Bundle mBundle = data.getBundleExtra("bundle");
            String  user = (String) mBundle.get("person");
            Gson gosn = new Gson();
            User m = gosn.fromJson(user, User.class);
			log.i(TAG,"html退出传回参数为:" + m.getName());
       }

<pre code_snippet_id="1658073" snippet_file_name="blog_20160422_10_2633119" name="code" class="java">       StartWebApp:
// webapp 目录 String appBasePath = "/apps/sandcard"; mIApp = SDK.startWebApp(acitvity, appBasePath, null, new IWebviewStateListener() { //TODO。。。}
 
   
      HTML层:
	   B.html:
       /**
		 * Activity 跳转html 并接受html返回数据
		 */
		jumpHtmlbackvalue.addEventListener('tap', function() {
				var person = new Object();
				person.name='张三';
				person.age= '20';
				person.address = 'shanghai';
				var str = JSON.stringify(person);
				var currentActivity = plus.android.runtimeMainActivity();
				var Intent = plus.android.importClass('android.content.Intent')
				var intent = new Intent();
				var Bundle = plus.android.importClass('android.os.Bundle');
				//var Serializable = plus.android.importClass('java.io.Serializable');
				var bundle = new Bundle();
				bundle.putString("person",str);
				intent.putExtra('bundle', bundle);
				currentActivity.setResult(200, intent);
				currentActivity.finish();
		});

4.HTML跨页面方法调用参数传递

      通常开发中常会遇见多个html页面之间相互传递数据以及调用方法:这里介绍2个方法:
      mui.fire();  // 通过mui.fire()方法可触发目标窗口的自定义事件:
      evalJS();    // 将JS脚本发送到Webview窗口中运行,可用于实现Webview窗口间的数据通讯。

      fire()使用:调用目标窗口自定的事件(可携带参数)
      代码案列:
       A页面:
	     //初始化预加载详情页面
	     mui.init({
	        preloadPages:[{    // 预加载B页面
		       id:'detailed.html',
		       url:'detailed.html'           
	         }
	      ]
	    });
	  
	    //添加列表项的点击事件
	    document.getElementById('testfire').addEventListener('tap', function(e) {
	       detailPage = plus.webview.getWebviewById('detailed.html');
	       mui.fire(detailPage,'newsId',{//触发(调用)详情页面的newsId事件
		     id:id
	       });      
	       mui.openWindow({ //打开详情页面
		     id:'detailed.html'
	       });
	    }); 
       detailed页面:
        //添加newId自定义事件监听
        window.addEventListener('newsId',function(event){
           var id = event.detail.id;//获得事件参数,根据id向服务器请求新闻详情
           .....
        });
      
       evalJS()使用 // 案列从A页面打开B页面,b页面操作完成关闭后将数据返回给A页面
       A页面:
		 mui.openWindow({
		       url: 'B.html',
		       id: 'B.html',
		       extras: {
				name: content
				}
			});

        function Callback(str){
			alert('返回啦' + str);
		}

       B页面:(返回触发 beforeback函数)
		  mui.init({
			beforeback: function() {
				var html_data_interaction = plus.webview.getWebviewById('html/A.html');
				 var str = 'zcmain';
				 html_data_interaction.evalJS("back('"+str+"')");
				return true;
			}
		});

HTML5+ API 参考: http://www.html5plus.org/doc/zh_cn/android.html






评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值