zoukankan      html  css  js  c++  java
  • 如何为Android写一个PhoneGap插件

    在此教程中,你将学会如何为Android写一个自定义的插件,然后再PhoneGap应用中使用,此教程包含如下:
       •如果写一个自定义PhoneGap插件来添加一个到自己Android设备的本地日历接口
       •如何用Javascript和原生Java实现插件的功能
       •如何使用新的PhoneGap CLI来创建一个相同基类的应用并运行它
       •如何配置和测试有相同插件的案例应用
       可以在我的github账号里得到最终的工作项目,链接在这里:
       https://github.com/hollyschinsky/CalendarPluginSample
       幻灯片里的第一部分跟此指引和代码都能提供额外的细节。
    概述
       PhoneGap通过开放源代码来允许你添加自己定制的功能来扩展当前PhoneGap的功能。插件可以通过JS和本地源码的桥接进行通信。对Android来说,需要使
    用Java编写自己的本地插件代码,对iOS来说则需要使用Object-C来编写。PhoneGap的全部API都是用相同的模式创建的。此教程集中将为Android开发插件。
       在容器里,调用JS的cordova.exec()方法来直接映射本地插件Java类里的execute()方法,当然需要传入包括成功和错误的回调函数。
    Android和iOS的桥接实现还是有所差距的。在Java里,对象对WebView是可访问的,而在iOS里,则需要通过一个带自定义模式的由本地Object-C翻译的
    源://xyz的URL来实现。虽然跟你的插件开发没关系,但是值得一提。
    第一部分:编写本地Java接口
       首先我们编写本地代码来添加日历入口到Android设备上,这样我们就能准确控制JS接口边需要的参数了。
       1.打开你熟悉的编辑器,定义一个CalenderPlugin.java的类,此类继承CordovaPlugin类.
    1. public class CalendarPlugin extends CordovaPlugin { }
    复制代码


       然后定义一个静态变量来定义插件类的addCalenderyEntry动作。这是我们从JS端传入用来添加日历入口的动作执行。可想而知,多个插件会有多个动作来
    执行类似的操作。例如你可以为了以后需要,再添加编辑和删除日历的入口。添加下面的静态变量到CalendarPlugin类。结果如下:
    1. public class CalendarPlugin extends CordovaPlugin { public static final String ACTION_ADD_CALENDAR_ENTRY = "addCalendarEntry"; }
    复制代码

       还是在CalendarPlugin.java里,添加下面的execute函数。此方法是从CordovaPlugin类继承得到,因此我们需要添加override标记:
    1. @Overridepublic boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { }
    复制代码


       之后需要添加必须的导入类,再为CalenderPlugin.java添加一个包名。需要注意的是,除了CordovaPlugin类外我们还需要导入cordova的CallbackContext来发送成功或者错误信息,也需要JSON类来处理传入的参数。在CalenderPlug.java类的顶部添加如下代码:
    1. package com.example.myplugin; import org.apache.cordova.api.CallbackContext; import org.apache.cordova.api.CordovaPlugin; import org.json.JSONObject; import org.json.JSONArray; import org.json.JSONException;
    复制代码


       在execute()函数里,添加代码来检测传入的动作,然后使用本地Android代码提供的的Intent和Activity类来添加日历的入口。Intent将建立活动的类型以及其他数据,然后获得Activity对象来开始基于Intent数据的新获得。参考Activity和Intent类段落里的链接来查看详细内容。
    1. try { 
    2.     if (ACTION_ADD_CALENDAR_ENTRY.equals(action)) {  
    3.     JSONObject arg_object = args.getJSONObject(0); 
    4.     Intent calIntent = new Intent(Intent.ACTION_EDIT) 
    5.         .setType("vnd.android.cursor.item/event") 
    6.         .putExtra("beginTime", arg_object.getLong("startTimeMillis")) 
    7.         .putExtra("endTime", arg_object.getLong("endTimeMillis")) 
    8.         .putExtra("title", arg_object.getString("title")) 
    9.         .putExtra("description", arg_object.getString("description")) 
    10.         .putExtra("eventLocation", arg_object.getString("eventLocation")); 
    11.   
    12.        this.cordova.getActivity().startActivity(calIntent); 
    13.        callbackContext.success(); 
    14.        return true; 
    15.     } 
    16.     callbackContext.error("Invalid action"); 
    17.     return false; 
    18. } catch(Exception e) { 
    19.     System.err.println("Exception: " + e.getMessage()); 
    20.     callbackContext.error(e.getMessage()); 
    21.     return false; 
    22. }
    复制代码
      需要注意的是Activity引用是来自cordova接口的。
    1. import android.app.Activity; import android.content.Intent;
    复制代码


       一般来说会检测action参数和调用实现必须动作的一个独立私有函数。为了简化,它放在了execute函数里。
       最后,添加Activity和Intent的Android所需类,添加本地日历入口到CalenderPlugin.java类上,在下面导入org.json.JSonException。 
      2.现在保存文件,然后来第二部分吧。
    第二部分 编写JS接口
       下一步我们将编写插件的JS接口。这里是应用跟外边JS和本地桥梁之家的跨越,以便执行本地代码。
    1. var calendarPlugin = { createEvent: function(title, location, notes, startDate, endDate, successCallback, errorCallback) { } }
    复制代码


       打开编辑器,创建一个叫calender.js的文件。可以放到CalenderPlugin.java文件所在地。 
       在calender.js里,编写一个叫createEvent的函数,里面有一个new的calenderPlugin变量,这个函数用来获取自定义参数,和用来在本地代码上创建日历入口的回调函数。
    1. var calendarPlugin = { 
    2.     createEvent: function(title, location, notes, startDate, endDate, successCallback, errorCallback) { 
    3.         cordova.exec( 
    4.             successCallback, // success callback function 
    5.             errorCallback, // error callback function 
    6.             'CalendarPlugin', // mapped to our native Java class called "CalendarPlugin" 
    7.             'addCalendarEntry', // with this action name 
    8.             [{                  // and this array of custom arguments to create our entry 
    9.                 "title": title, 
    10.                 "description": notes, 
    11.                 "eventLocation": location, 
    12.                 "startTimeMillis": startDate.getTime(), 
    13.                 "endTimeMillis": endDate.getTime() 
    14.             }] 
    15.         );  
    16.      } 
    17. }
    复制代码


       然后将代码添加到createEvent函数里,调用cordova.exec(),传入下述参数。
       •成功时的回调函数
       •出错时的回调函数
       •服务名
       •动作名
       •参数数组
       添加好cordov.exec()后,calender.js文件如下: 
       参数需要映射到本地java类,具体如下:
       •服务名映射到本地插件类名
       •动作名作为execute()函数的首个参数
       •参数数组作为JSON数组传入execute()函数作为第二个参数
       •成功或者出错回调函数作为CallbackContext对象的一部分作为execute()函数的第三个参数
       现在保持JS文件,然后进行下一步。
    第三部分:实现
       以一个基本的PhoneGap项目作为开始。使用PhoneGap或则Cordova CLI创建,或者只是用命令行工具,然后为Android创建一个项目。
       警告:如果使用命令行工具的话,你需要确认你的环境变量建立时候包括了你的Android工具文件夹的位置以及平台工具文件夹的位置。
       我推荐使用新的PhoneGap CLI。可以快速的建立项目,之后除了Android外还可以在更多的平台添加项目,同时也提供方便的方法来将项目从命令行上传到PhoneGap Build。
       通过npm安装好PhoneGap CLI之后,运行下面的命令来创建一个基本的PhoneGap 项目,为Android添加和构建并自动部署连接到Android设备或者模拟器。
    1. phonegap create ~/MyPhoneGapApp
    2. cd ~/MyPhoneGapApp
    3. phonegap run android
    复制代码


       注意:指明你喜欢的项目路径,我为了方便,使用用户根目录作为项目路径。如果有错误的话,可能是你的路径设置有问题。参考上面警告中关于添加
    android sdk工具以及平台工具的文件夹。
       如果Android设备或者模拟器上有一个基本的PhoneGap应用运行的话,你会在环境配置成功的情况下,看到下述信息:
       phonegap 检测到Android SDK环境...
       phonegap 使用本地环境
       phonegap 添加Android平台...
       phonegap 编译Android...
       phonegap 成功编译Android应用
       phonegap 安装应用到Android设备,回到模拟器上。
       如果你从来没使用Android设备做过开发,你需要到设置里将开发者模式开启。此设置根据设备不同而不同,可以查看下开发者选项。你也可以将USB调试模
    式打开。
       配置基本应用来使用插件
       •用你喜欢的编辑器打开最新创建的项目
       •在项目的www/js文件夹下添加calender.js文件
       •将在上步中创建CalenderPlugin.java文件添加到myPhoneGapApp/platforms/android/src/com/example/myplugin文件夹下
    需要记住你的包名,因为下一步需要用到哦。
       平台的config.xml文件包含所有应用使用的插件的映射。我们需要添加我们新的插件映射到此文件。文件在项目里的路径是project-root/android/res/xml/config.xml。将下面的映射添加到你config.xml文件的功能列表后。
    1. <feature name="CalendarPlugin"> <param name="android-package" value="com.example.myplugin.CalendarPlugin" /> </feature>
    复制代码


       注意:在默认PhoneGap项目的www文件夹下也有一个config.xml文件。不要讲此文件添加到文件里。需要保证是将其添加到之前标注的指明平台的res/xml/config.xml
       •打开www/index.html,在index.js脚本标签前添加我们插件中的calend.js文件的引用。
    1. <script type="text/javascript" src="js/calendar.js"></script>
    复制代码


       •打开www/js/index.js文件,在receiveEvent函数下添加下面的函数
    1. addToCal: function() { 
    2.         var startDate = new Date("July 19, 2013 8:00:00"); 
    3.         var endDate = new Date("July 19, 2013 18:00:00"); 
    4.         var notes = "Arrive on time, don't want to miss out (from Android)"; 
    5.         var title = "PhoneGap Day"; 
    6.         var location = "Portland, OR"; 
    7.         var notes = "Arrive on time, don't want to miss out!"; 
    8.         var success = function() { alert("Success"); }; 
    9.         var error = function(message) { alert("Oopsie! " + message); }; 
    10.         calendarPlugin.createEvent(title, location, notes, startDate, endDate, success, error); 
    11. }
    复制代码


       •然后添加下面代码,在onDeviceReady函数里调用它
    1. app.addToCal();
    复制代码


       •另外:在应用里添加一个按钮,这样你就可以使用新功能来重复增加日历入口了。
    第五部分:运行
       回到命令行,并到项目根目录下,运行下面的命令:
       Phonegap run android
       应用打开的时候,就会在设备上看到打开根据代码里指明的标题,日期,备注,位置等信息的本地日历。下面是在Nexus7上的一个运行截屏:

    想.png


       测试和调试提示:
       1. 输入 phonegap help来获取PhoneGap CLI命令提示
       2. 输入adb logcat来显示android控制台调试 
    *** 第六部分:选看-实现多线程
       在Android WebView里的JS运行在主线程上,这也是Java运行函数的地方,当然这可能导致线程的阻塞问题。可以选择让它运行一个单独的线程。你可以根
    据你的本地代码来选择下述两者之一的选项。
       如果你的本地代码是需要跟用户界面交互,那么在CalenderPlugin.java里,你可能想指明它来直接在本地用户界面线程里运行,如下动作检测后:
    1. cordova.getThreadPool().execute(new Runnable() { 
    2.     public void run() { 
    3.         // Main Code goes here 
    4.         callbackContext.success();  
    5.     } 
    6. });
    复制代码



    *** 第七部分:选看:最后整理
       1.创建一个readme文件来说明插件的使用方式
       2.同时考虑将代码贡献给开源插件库
       3.如果你考虑提交给PhoneGap Build支持中心,确信你为新插件创建了plugin.xml
       帮助链接:
       • PhoneGap Plugin Development Guide
       • 查看Simon McDonald的博文,来学习如何写PhoneGap插件的详细内容。他会告诉你如何使用少量的先进方式来开发JS端代码,类似PhoneGap 的API-http://simonmacdonald.blogspot.c ... ap-200-android.html  
    • PhoneGap Command Line Interface 
       • iOS Calendar Plugin Option
       • Android Calendar Plugin Option
       • Another Android Calendar Plugin Option

    原文链接:http://devgirl.org/2013/07/17/tutorial-how-to-write-a-phonegap-plugin-for-android/

  • 相关阅读:
    Think in java 4th读书笔记__last update20151130
    Angular学习笔记--last_update 20151106
    程序员技术练级攻略(转载)
    缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题(转载)
    简单理解 RPC(转载)
    Redis 为什么使用单进程单线程方式也这么快(转载)
    redis详解(三)-- 面试题(转载)
    redis应用-sortedset实现排行榜(转载)
    LRU原理和Redis实现——一个今日头条的面试题(转载)
    全面理解Java内存模型(JMM)及volatile关键字(转载)
  • 原文地址:https://www.cnblogs.com/mcdnf/p/5158313.html
Copyright © 2011-2022 走看看