阳光博文 你的空间 知识的容器

phonegap跳转Activity android插件调用原生

本节主要记录调用Activity的方式;  并提供 插件Demo下载

 

插件开发4个步骤:

1 在assents 目录下的  cordova-plugins.js文件添加配置

2 在assets/www 的 plugin目录下编写javascript接口

3 在res/xml 目录下配置  config.xml 文件

4 在src目录下编写java文件 实现跳转

 

 

 

工程:

 

 

1  配置 cordova _plugins.js 文件

首先给大家展示cordova _plugins.js 文件:

 

  1. cordova.define('cordova/plugin_list'function(require, exports, module) {  
  2. module.exports = [  
  3.     {  
  4.         "file""plugins/org.apache.cordova.camera/www/CameraConstants.js",  
  5.         "id""org.apache.cordova.camera.Camera",  
  6.         "clobbers": [  
  7.             "Camera"  
  8.         ]  
  9.     },  
  10.     {  
  11.         "file""plugins/org.apache.cordova.camera/www/CameraPopoverOptions.js",  
  12.         "id""org.apache.cordova.camera.CameraPopoverOptions",  
  13.         "clobbers": [  
  14.             "CameraPopoverOptions"  
  15.         ]  
  16.     },  
  17.     {  
  18.         "file""plugins/org.apache.cordova.camera/www/Camera.js",  
  19.         "id""org.apache.cordova.camera.camera",  
  20.         "clobbers": [  
  21.             "navigator.camera"  
  22.         ]  
  23.     },  
  24.     {  
  25.         "file""plugins/org.apache.cordova.camera/www/CameraPopoverHandle.js",  
  26.         "id""org.apache.cordova.camera.CameraPopoverHandle",  
  27.         "clobbers": [  
  28.             "CameraPopoverHandle"  
  29.         ]  
  30.     },  
  31.     {  
  32.         "file""plugins/org.apache.cordova.dialogs/www/notification.js",  
  33.         "id""org.apache.cordova.dialogs.notification",  
  34.         "merges": [  
  35.             "navigator.notification"  
  36.         ]  
  37.     },  
  38.     {  
  39.         "file""plugins/org.apache.cordova.dialogs/www/android/notification.js",  
  40.         "id""org.apache.cordova.dialogs.notification_android",  
  41.         "merges": [  
  42.             "navigator.notification"  
  43.         ]  
  44.     },  
  45.     {  
  46.         "file""plugins/org.apache.cordova.vibration/www/vibration.js",  
  47.         "id""org.apache.cordova.vibration.notification",  
  48.         "merges": [  
  49.             "navigator.notification"  
  50.         ]  
  51.     },  
  52.     {  
  53.         "file""plugins/intent.js",  
  54.         "id""org.apache.cordova.intent",  
  55.         "merges": [  
  56.             "navigator.intent"  
  57.         ]  
  58.     },  
  59. ];  
  60. module.exports.metadata =   
  61. // TOP OF METADATA  
  62. {  
  63.     "org.apache.cordova.camera""0.2.7",  
  64.     "org.apache.cordova.dialogs""0.2.6",  
  65.     "org.apache.cordova.vibration""0.3.7",  
  66.     "org.apache.cordova.intent" :"0.0.1",  
  67.   
  68. }  
  69. // BOTTOM OF METADATA  
  70. });  

 

2 在plugin目录下编写javascript接口


 

 

 

贴上intent.js的接口代码

  1. cordova.define("org.apache.cordova.intent"function(require, exports, module) {   
  2.   
  3. var exec = require('cordova/exec');  
  4.   
  5.   
  6.   
  7. module.exports = {  
  8.   
  9.     /** 
  10.      * 一共5个参数 
  11.        第一个 :成功会掉 
  12.        第二个 :失败回调 
  13.        第三个 :将要调用的类的配置名字(在config.xml中配置 稍后在下面会讲解) 
  14.        第四个 :调用的方法名(一个类里可能有多个方法 靠这个参数区分) 
  15.        第五个 :传递的参数  以json的格式 
  16.      */  
  17.     demo: function(mills) {  
  18.         exec(function(winParam){  
  19.             alert(winParam);  
  20.         }, null"Demo""intent", [mills]);  
  21.     },  
  22. };  
  23.   
  24. });  


Demo中成功返回 会弹出一个Alert();   

 

 

在javascript中的 调用语句是

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
  1. navigator.intent.demo(1);  


 

贴上整的javascript

 

  1. <!DOCTYPE html>  
  2. <html>    
  3. <head>     
  4.   <title>Notification Example</title>   
  5.   <script type="text/javascript" charset="utf-8" src="cordova.js"></script>      
  6.   <script type="text/javascript" charset="utf-8">      
  7.    // Wait for device API libraries to load      
  8.    //      
  9.    document.addEventListener("deviceready", onDeviceReady, false);      
  10.    // device APIs are available      
  11.    //      
  12.    function onDeviceReady() {          
  13.      // Empty      
  14.     }      
  15.     // Show a custom alert      
  16.       
  17.     //    native的 Dialog 对话框  
  18.     function showAlert() {        navigator.notification.alert(            'You are the winner!',  // message              
  19.       'Game Over',              
  20.     // title              
  21.     'Done'                    
  22.     // buttonName          
  23.     );    }      
  24.     // Beep three times      
  25.     //    响铃3声  
  26.     function playBeep() {        navigator.notification.beep(3);    }      
  27.     // Vibrate for 2 seconds      
  28.     //    振动  
  29.     function vibrate() {         navigator.notification.vibrate(100000);    }      
  30.     //       跳转  
  31.     function intent() {          navigator.intent.demo(1);          }      
  32.   
  33.     </script>    
  34.     </head>    
  35.     <body>      
  36.     <p><a href="#" onclick="showAlert(); return false;">Show Alert</a></p>      
  37.     <p><a href="#" onclick="playBeep(); return false;">Play Beep</a></p>      
  38.     <p><a href="#" onclick="vibrate(); return false;">Vibrate</a></p>    
  39.     <p><a href="#" onclick="intent(); return false;">Html跳转到android界面</a></p>    
  40.     </body>  
  41.     </html>  


 

 

<3> 在res/xml 目录下配置  config.xml 文件

config.xml配置 加上 如下

  1. <feature name="Demo">  
  2.     <param name="android-package" value="plugins.Plugin_intent" />  
  3. </feature>  


feature的name属性   非常重要 

name必须是步骤< 4 >中   function中调用的类名

value属性指定插件在src目录下的java文件  (命名空间)

 

 

 

前3个步骤 参考上一章 phonegap插件开发

 

这里主要描述 

<4> 编写phonegap的java插件类  调用本地的activity

 

首先继承CordovaPlugin

重写execute方法    execute返回值为true时  此插件可用;返回为false时 此插件失效

在插件类当中获取   this 跳转

  1. Intent intent = new Intent(cordova.getActivity(), DemoActivity.class);  
  2.         cordova.startActivityForResult((CordovaPlugin) this,intent, 200);  


如果使用

  1. cordova.getActivity().startActivityForResult(intent,200);    

被调用的Activity 在   setResult之后;

并不会返回到当前的插件中   它将返回到的webView的CordovaActivity当中 ,

Plugin_intent 类的  onActivityResult将收不到消息    ;

我查看源码后得知    cordova这个是CordovaInterface类型的   已由CordovaPlugin实现

在CordovaInterface当中找到了

  1. /** 
  2.     * Launch an activity for which you would like a result when it finished. When this activity exits, 
  3.     * your onActivityResult() method will be called. 
  4.     * 
  5.     * @param command     The command object 
  6.     * @param intent      The intent to start 
  7.     * @param requestCode   The request code that is passed to callback to identify the activity 
  8.     */  
  9.    abstract public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode);  

 

 

 

 

完整实例

  1. package plugins;  
  2.   
  3. import org.apache.cordova.CallbackContext;  
  4. import org.apache.cordova.CordovaPlugin;  
  5. import org.json.JSONArray;  
  6. import org.json.JSONException;  
  7.   
  8. import android.content.Intent;  
  9. import android.util.Log;  
  10. import android.widget.Toast;  
  11.   
  12. import com.phonegap.helloworld.DemoActivity;  
  13.   
  14. public class Plugin_intent extends CordovaPlugin {  
  15.   
  16.     /** 
  17.      * 注意 构造方法不能为 
  18.      *  
  19.      * Plugin_intent(){} 
  20.      *  
  21.      * 可以不写或者 定义为如下 
  22.      *  
  23.      */  
  24.     public Plugin_intent() {  
  25.     }  
  26.   
  27.     CallbackContext callbackContext;  
  28.   
  29.     @Override  
  30.     public boolean execute(String action, JSONArray args,  
  31.             CallbackContext callbackContext) throws JSONException {  
  32.         this.callbackContext = callbackContext;  
  33.         Log.i("123", action);  
  34.   
  35.         if (action.equals("intent")) {  
  36.             // 获取args的第一个参数  
  37.             String message = args.getString(0);  
  38.             this.function();  
  39.             return true;  
  40.         }  
  41.         return false;  
  42.   
  43.     }  
  44.   
  45.     private void function() {  
  46.         // cordova.getActivity() 获取当前activity的this  
  47.         Log.i("123", cordova.getActivity().toString());  
  48.         Intent intent = new Intent(cordova.getActivity(), DemoActivity.class);  
  49.         cordova.startActivityForResult((CordovaPlugin) this,intent, 200);  
  50.   
  51.     }  
  52.   
  53.     @Override  
  54.     public void onActivityResult(int requestCode, int resultCode, Intent intent) {  
  55.           
  56.         super.onActivityResult(requestCode, resultCode, intent);  
  57.         //传递返回值 给js方法  
  58.         callbackContext.success("activity 跳转成功了");  
  59.         Toast.makeText(cordova.getActivity(), "123"0).show();  
  60.   
  61.     }  
  62. }  

 

设置返回值

 

成功返回值:

callbackContext.success("成功");

失败返回值:
callbackContext.error("失败"); 

 

 

 

提供下载Demo下载地址:   审核中.....

补 :插件Demo下载地址: http://download.csdn.net/detail/aaawqqq/6992627


在线咨询