摘自:http://topmanopensource.iteye.com/blog/1577717

在项目采用Native+Web方式开发,Android团队开发一个模块的代码,WebApp phonegap开发几个模块,需要将Android中的模块潜入到Phonegap开发的几个模块中。需要通过Phonegap调用Android 的Activity。

demo如下:

Phonegap插件类:

Java代码
  1. package com.easyway.etrip.plugins;
  2. import org.json.JSONArray;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Handler;
  6. import android.os.Message;
  7. import android.util.Log;
  8. import com.phonegap.api.Plugin;
  9. import com.phonegap.api.PluginResult;
  10. /**
  11. * Phonegap 调用Android Activity的插件
  12. *
  13. * @Title:
  14. * @Description: 实现TODO
  15. * @Copyright:Copyright (c) 2011
  16. * @Company:易程科技股份有限公司
  17. * @Date:2012-7-5
  18. * @author longgangbai
  19. * @version 1.0
  20. */
  21. publicclass AndroidActivityPlugin extends Plugin{
  22. private Object synObj = new Object();
  23. @Override
  24. public PluginResult execute(String action, JSONArray data, String callbackID) {
  25. // TODO Auto-generated method stub
  26. if(action.equals("startActivity")){
  27. PluginResult result = null;
  28. try {
  29. PluginResult.Status status = PluginResult.Status.OK;
  30. if(action.equals("startActivity")){
  31. Log.e("test", "test plugin js -> java~~~~"+data.getString(0));
  32. Log.e("test", "test plugin js -> java~~~~");
  33. result = new PluginResult(status, data.getString(0));
  34. Message msg=new Message();
  35. msg.what=1;
  36. Log.e("参数信息:", data.toString());
  37. msg.obj=data.getString(0);
  38. handler.sendMessage(msg);
  39. sleep();
  40. }
  41. } catch (Exception e) {
  42. }
  43. return result;
  44. }else {
  45. returnnew PluginResult(PluginResult.Status.INVALID_ACTION);
  46. }
  47. }
  48. private Handler handler = new Handler() {
  49. publicvoid handleMessage(Message msg) {
  50. if (msg == null) {
  51. return;
  52. }
  53. switch (msg.what) {
  54. case1:
  55. String className=msg.obj.toString();
  56. try {
  57. Class activityClass = Class.forName(className);
  58. Intent intent = new Intent(ctx.getBaseContext(), activityClass);//你想去的activity(exp:Temp)
  59. ctx.startActivityForResult(AndroidActivityPlugin.this, intent, 1);
  60. } catch (ClassNotFoundException e) {
  61. Log.e("Why", "错误原因:"+className);
  62. e.printStackTrace();
  63. }
  64. break;
  65. }
  66. };
  67. };
  68. @Override
  69. publicvoid onActivityResult(int requestCode, int resultCode, Intent intent) {
  70. // TODO Auto-generated method stub
  71. if(requestCode==1){
  72. if(resultCode == Activity.RESULT_CANCELED){
  73. //返回时调用
  74. Log.e("test", "result plugin -> java~~~~");
  75. Log.e("test", "result plugin -> java~~~~");
  76. weakup();
  77. }
  78. }else{
  79. super.onActivityResult(requestCode, resultCode, intent);
  80. }
  81. }
  82. privatevoid sleep()
  83. {
  84. try
  85. {
  86. synchronized(synObj)
  87. {
  88. synObj.wait();
  89. }
  90. }
  91. catch (InterruptedException e)
  92. {
  93. e.printStackTrace();
  94. }
  95. }
  96. privatevoid weakup()
  97. {
  98. synchronized(synObj)
  99. {
  100. synObj.notify();
  101. }
  102. }
  103. }
package com.easyway.etrip.plugins;import org.json.JSONArray;import android.app.Activity;import android.content.Intent;import android.os.Handler;import android.os.Message;import android.util.Log;import com.phonegap.api.Plugin;import com.phonegap.api.PluginResult;/** * Phonegap 调用Android Activity的插件 *  * @Title:  * @Description: 实现TODO * @Copyright:Copyright (c) 2011 * @Company:易程科技股份有限公司 * @Date:2012-7-5 * @author  longgangbai * @version 1.0 */public class AndroidActivityPlugin  extends Plugin{ private Object synObj = new Object();@Overridepublic PluginResult execute(String action, JSONArray data, String callbackID) {// TODO Auto-generated method stubif(action.equals("startActivity")){PluginResult result = null;try {PluginResult.Status status = PluginResult.Status.OK;if(action.equals("startActivity")){ Log.e("test", "test plugin js -> java~~~~"+data.getString(0)); Log.e("test", "test plugin js -> java~~~~"); result = new PluginResult(status, data.getString(0));Message msg=new Message();msg.what=1;Log.e("参数信息:", data.toString());msg.obj=data.getString(0);handler.sendMessage(msg);sleep();}} catch (Exception e) {}return result;}else {            return new PluginResult(PluginResult.Status.INVALID_ACTION);}}private Handler handler = new Handler() {public void handleMessage(Message msg) {if (msg == null) {return;}switch (msg.what) {case 1:String className=msg.obj.toString();try {Class activityClass = Class.forName(className);Intent intent = new Intent(ctx.getBaseContext(), activityClass);//你想去的activity(exp:Temp)ctx.startActivityForResult(AndroidActivityPlugin.this, intent, 1);} catch (ClassNotFoundException e) {Log.e("Why", "错误原因:"+className);e.printStackTrace();}break;}};};@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent intent) {// TODO Auto-generated method stubif(requestCode==1){if(resultCode == Activity.RESULT_CANCELED){//返回时调用Log.e("test", "result plugin -> java~~~~"); Log.e("test", "result plugin -> java~~~~"); weakup();}}else{super.onActivityResult(requestCode, resultCode, intent);}}private void sleep()    {        try        {            synchronized(synObj)            {                synObj.wait();            }        }        catch (InterruptedException e)        {            e.printStackTrace();        }    }private void weakup()    {        synchronized(synObj)        {            synObj.notify();        }    }}

phonegap启动类:

Java代码
  1. package com.easyway.etrip;
  2. import android.os.Bundle;
  3. import com.phonegap.DroidGap;
  4. /**
  5. * phonegap启动类
  6. *
  7. * @Title:
  8. * @Description: 实现TODO
  9. * @Copyright:Copyright (c) 2011
  10. * @Company:易程科技股份有限公司
  11. * @Date:2012-7-5
  12. * @author longgangbai
  13. * @version 1.0
  14. */
  15. publicclass PhonegapAndroidActivityActivity extends DroidGap {
  16. /** Called when the activity is first created. */
  17. @Override
  18. publicvoid onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. super.loadUrl("file:///android_asset/www/index.html");
  21. }
  22. }
package com.easyway.etrip;import android.os.Bundle;import com.phonegap.DroidGap;/** * phonegap启动类 *  * @Title:  * @Description: 实现TODO * @Copyright:Copyright (c) 2011 * @Company:易程科技股份有限公司 * @Date:2012-7-5 * @author  longgangbai * @version 1.0 */public class PhonegapAndroidActivityActivity extends DroidGap  {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);          super.loadUrl("file:///android_asset/www/index.html");    }}

Android的Activity类:

Java代码
  1. package com.easyway.etrip;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. /**
  5. *
  6. *
  7. * @Title:
  8. * @Description: 实现TODO
  9. * @Copyright:Copyright (c) 2011
  10. * @Company:易程科技股份有限公司
  11. * @Date:2012-7-5
  12. * @author longgangbai
  13. * @version 1.0
  14. */
  15. publicclass ThirdAndroidActivity extends Activity {
  16. /** Called when the activity is first created. */
  17. @Override
  18. publicvoid onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. super.setContentView(R.layout.main);
  21. }
  22. }
package com.easyway.etrip;import android.app.Activity;import android.os.Bundle;/** *  *  * @Title:  * @Description: 实现TODO * @Copyright:Copyright (c) 2011 * @Company:易程科技股份有限公司 * @Date:2012-7-5 * @author  longgangbai * @version 1.0 */public class ThirdAndroidActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        super.setContentView(R.layout.main);    }}

phonegap的插件配置类phonegap.xml:

Xml代码
  1. <pluginname="AndroidActivity"value="com.easyway.etrip.plugins.AndroidActivityPlugin"/>
   <plugin name="AndroidActivity" value="com.easyway.etrip.plugins.AndroidActivityPlugin"/>

androidActivity.js

Js代码
  1. var AndroidActivity=function(){};
  2. AndroidActivity.prototype.startActivity = function(success, fail,parmas)
  3. {
  4. return PhoneGap.exec(
  5. function(args){ success(args); },
  6. function(args){ fail(args); },
  7. 'AndroidActivity', //java类
  8. 'startActivity', //action
  9. [parmas] //params
  10. );
  11. };
  12. PhoneGap.addConstructor(function() {
  13. PhoneGap.addPlugin('androidActivity', new AndroidActivity());
  14. });
var AndroidActivity=function(){}; AndroidActivity.prototype.startActivity = function(success, fail,parmas){     return PhoneGap.exec(             function(args){ success(args); },             function(args){ fail(args); },             'AndroidActivity', //java类             'startActivity', //action             [parmas] //params              ); };PhoneGap.addConstructor(function() {    PhoneGap.addPlugin('androidActivity', new AndroidActivity());});

调用的测试类:

Html代码
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <metaname="viewport"content="width=320; user-scalable=no"/>
  5. <metahttp-equiv="Content-type"content="text/html; charset=utf-8">
  6. <title>Minimal AppLaud App</title>
  7. <scripttype="text/javascript"charset="utf-8"src="phonegap-1.4.1.js"></script>
  8. <scripttype="text/javascript"charset="utf-8"src="androidActivity.js"></script>
  9. <scripttype="text/javascript"charset="utf-8">
  10. function openAndroidActivity(){
  11. window.plugins.androidActivity.startActivity(
  12. function(r){//alert(r);
  13. },
  14. function(e){//alert(e);
  15. },
  16. "com.easyway.etrip.ThirdAndroidActivity"
  17. );
  18. }
  19. </script>
  20. </head>
  21. <body>
  22. <h1>Hello World</h1>
  23. <inputtype="button"value="打开Android Activity"onclick="javascript:openAndroidActivity();">
  24. </body>
  25. </html>

更多相关文章

  1. Android消息推送机制调研
  2. android 定时器的实现
  3. Android(安卓)Studio开发(二)使用RecyclerView实现瀑布流展示
  4. android有用的知识
  5. Android开发实践 带你理解使用WebView
  6. Android源代码查看途径
  7. Android各版本源码下载链接
  8. Android实现微信分享及注意事项
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. Android设置TextView行间距(非行高)
  2. Android--gravity、layout_gravity、padd
  3. Hello Android - Android中gravity与layo
  4. Android异步处理四:AsyncTask的实现原理
  5. Android(安卓)TableLayout 属性含义
  6. 移动支付之Android(安卓)HCE的基本使用
  7. Android Handler机制2之ThreadLocal
  8. android EditText inputType说明
  9. How to add a new keycode in android
  10. Android架构组件-App架构指南