Native+WebApp中Phonegap调用Android Activity
2012-12-09 21:58
561 查看
摘自:http://topmanopensource.iteye.com/blog/1577717
在项目采用Native+Web方式开发,Android团队开发一个模块的代码,WebApp phonegap开发几个模块,需要将Android中的模块潜入到Phonegap开发的几个模块中。需要通过Phonegap调用Android 的Activity。
demo如下:
Phonegap插件类:
Java代码
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
*/
publicclass AndroidActivityPlugin extends Plugin{
private Object synObj = new Object();
@Override
public PluginResult execute(String action, JSONArray data, String callbackID) {
// TODO Auto-generated method stub
if(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 {
returnnew PluginResult(PluginResult.Status.INVALID_ACTION);
}
}
private Handler handler = new Handler() {
publicvoid handleMessage(Message msg) {
if (msg == null) {
return;
}
switch (msg.what) {
case1:
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;
}
};
};
@Override
publicvoid onActivityResult(int requestCode, int resultCode, Intent intent) {
// TODO Auto-generated method stub
if(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);
}
}
privatevoid sleep()
{
try
{
synchronized(synObj)
{
synObj.wait();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
privatevoid weakup()
{
synchronized(synObj)
{
synObj.notify();
}
}
}
phonegap启动类:
Java代码
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
*/
publicclass PhonegapAndroidActivityActivity extends DroidGap {
/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.loadUrl("file:///android_asset/www/index.html");
}
}
Android的Activity类:
Java代码
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
*/
publicclass ThirdAndroidActivity extends Activity {
/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
}
}
phonegap的插件配置类phonegap.xml:
Xml代码
<pluginname="AndroidActivity"value="com.easyway.etrip.plugins.AndroidActivityPlugin"/>
androidActivity.js
Js代码
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代码
<!DOCTYPE HTML>
<html>
<head>
<metaname="viewport"content="width=320; user-scalable=no"/>
<metahttp-equiv="Content-type"content="text/html; charset=utf-8">
<title>Minimal AppLaud App</title>
<scripttype="text/javascript"charset="utf-8"src="phonegap-1.4.1.js"></script>
<scripttype="text/javascript"charset="utf-8"src="androidActivity.js"></script>
<scripttype="text/javascript"charset="utf-8">
function openAndroidActivity(){
window.plugins.androidActivity.startActivity(
function(r){//alert(r);
},
function(e){//alert(e);
},
"com.easyway.etrip.ThirdAndroidActivity"
);
}
</script>
</head>
<body>
<h1>Hello World</h1>
<inputtype="button"value="打开Android Activity"onclick="javascript:openAndroidActivity();">
</body>
</html>
在项目采用Native+Web方式开发,Android团队开发一个模块的代码,WebApp phonegap开发几个模块,需要将Android中的模块潜入到Phonegap开发的几个模块中。需要通过Phonegap调用Android 的Activity。
demo如下:
Phonegap插件类:
Java代码
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
*/
publicclass AndroidActivityPlugin extends Plugin{
private Object synObj = new Object();
@Override
public PluginResult execute(String action, JSONArray data, String callbackID) {
// TODO Auto-generated method stub
if(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 {
returnnew PluginResult(PluginResult.Status.INVALID_ACTION);
}
}
private Handler handler = new Handler() {
publicvoid handleMessage(Message msg) {
if (msg == null) {
return;
}
switch (msg.what) {
case1:
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;
}
};
};
@Override
publicvoid onActivityResult(int requestCode, int resultCode, Intent intent) {
// TODO Auto-generated method stub
if(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);
}
}
privatevoid sleep()
{
try
{
synchronized(synObj)
{
synObj.wait();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
privatevoid weakup()
{
synchronized(synObj)
{
synObj.notify();
}
}
}
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(); @Override public PluginResult execute(String action, JSONArray data, String callbackID) { // TODO Auto-generated method stub if(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; } }; }; @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { // TODO Auto-generated method stub if(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代码
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
*/
publicclass PhonegapAndroidActivityActivity extends DroidGap {
/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.loadUrl("file:///android_asset/www/index.html");
}
}
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代码
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
*/
publicclass ThirdAndroidActivity extends Activity {
/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
}
}
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代码
<pluginname="AndroidActivity"value="com.easyway.etrip.plugins.AndroidActivityPlugin"/>
<plugin name="AndroidActivity" value="com.easyway.etrip.plugins.AndroidActivityPlugin"/>
androidActivity.js
Js代码
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());
});
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代码
<!DOCTYPE HTML>
<html>
<head>
<metaname="viewport"content="width=320; user-scalable=no"/>
<metahttp-equiv="Content-type"content="text/html; charset=utf-8">
<title>Minimal AppLaud App</title>
<scripttype="text/javascript"charset="utf-8"src="phonegap-1.4.1.js"></script>
<scripttype="text/javascript"charset="utf-8"src="androidActivity.js"></script>
<scripttype="text/javascript"charset="utf-8">
function openAndroidActivity(){
window.plugins.androidActivity.startActivity(
function(r){//alert(r);
},
function(e){//alert(e);
},
"com.easyway.etrip.ThirdAndroidActivity"
);
}
</script>
</head>
<body>
<h1>Hello World</h1>
<inputtype="button"value="打开Android Activity"onclick="javascript:openAndroidActivity();">
</body>
</html>
相关文章推荐
- Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例
- Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例
- WebApp mui&H5+ 视频处理之拍摄视频一(Native.js for Android)
- Android总结:Activity Intent Flags、Task相关属性及利用Intent属性调用系统app
- 支持android&ios高度自适应及JS相互调用的组件react-native-webview2
- WebApp mui&H5+ 用户头像处理之选择照片并剪切(Native.js for Android)
- WebApp mui&H5+ 视频处理之拍摄视频二(Native.js for Android)
- android 调用webview控件,为逆向h5app做准备
- Android查看某个App功能是Native实现还是Webview实现
- 调用getActionBar()总会报Call requires API level 11 (current min is 8): android.app.Activity#getActionBar
- android app 与 web 之间的调用
- app或者android library调用android library之activity
- PhoneGap+jQm webapp本地化(2)-摄像头调用和本地数据库
- Android中webview js与native方法互相调用
- android 微信app支付的一些坑 resp.errCode=-1 微信不调用:WXPayEntryActivity
- Android中外部程序activity调用本地程序的app方法。
- XX程序媛学习笔记--Cordova(PhoneGap)通过plugins调用Android Native并回调
- PhoneGap(Cordova) :js调用native(2) ------Android篇
- Android 不同app之间调用activity,通过action实现
- PhoneGap+jQm webapp本地化(2)-摄像头调用和本地数据库