`
longgangbai
  • 浏览: 7256884 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Native+WebApp中Phonegap调用Android Activity

 
阅读更多

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

demo如下:

 

Phonegap插件类:

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启动类:

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类:

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:

   <plugin name="AndroidActivity" value="com.easyway.etrip.plugins.AndroidActivityPlugin"/>

 

androidActivity.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());
});

 

 

调用的测试类:

 

<!DOCTYPE HTML>
<html>
  <head>
    <meta name="viewport" content="width=320; user-scalable=no" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>Minimal AppLaud App</title>

	  <script type="text/javascript" charset="utf-8" src="phonegap-1.4.1.js"></script>
	  <script type="text/javascript" charset="utf-8" src="androidActivity.js"></script>
	  <script type="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>
	 <input type="button" value="打开Android Activity" onclick="javascript:openAndroidActivity();">
</body>
</html>

 

分享到:
评论
11 楼 myruby520 2015-01-08  
myruby520 写道
AndroidActivityPlugin  中 64行:ctx.getBaseContext() 请问这个ctx哪来的???

刚才查了下,现在版本是这样获取的 cordova.getActivity()
10 楼 myruby520 2015-01-08  
AndroidActivityPlugin  中 64行:ctx.getBaseContext() 请问这个ctx哪来的???
9 楼 longgangbai 2013-06-18  
xie_en 写道
你的context用的太想当然了吧。

不明白,一个字汗, 
8 楼 xie_en 2013-06-18  
你的context用的太想当然了吧。
7 楼 longgangbai 2012-09-22  
小花_理想 写道
小花_理想 写道
楼主,导入之后显示版本问题。Unable to resolve target 'android-8'。改了project.properties中的版本还是不行。求指导

楼主,调试好了。但是感觉没有调用Activity。因为我在Activity打sysout与log.i都没有办法执行

你采用Debug模式启动,你就会发现,这是phonegap插件的原理,你调试应该就明白了
6 楼 小花_理想 2012-09-18  
小花_理想 写道
楼主,导入之后显示版本问题。Unable to resolve target 'android-8'。改了project.properties中的版本还是不行。求指导

楼主,调试好了。但是感觉没有调用Activity。因为我在Activity打sysout与log.i都没有办法执行
5 楼 小花_理想 2012-09-18  
楼主,导入之后显示版本问题。Unable to resolve target 'android-8'。改了project.properties中的版本还是不行。求指导
4 楼 zhiduo5 2012-08-24  
longgangbai 写道
zhiduo5 写道
简单点说就是让你你的程序能从ThirdAndroidActivity跳回PhonegapAndroidActivityActivity能跳回来吗,跳不回来我只能在插件里加载了!希望哥哥把你的程序改成能跳回来!

如果想从Activity中跳到js页面起始可以
1.采用插件方法。
插件调用js,js跳转到相关的页面
2.采用webview跳转到相关的页面。

不是很明白,把你的第一种方法,给个关键代码谢谢!
3 楼 longgangbai 2012-08-24  
zhiduo5 写道
简单点说就是让你你的程序能从ThirdAndroidActivity跳回PhonegapAndroidActivityActivity能跳回来吗,跳不回来我只能在插件里加载了!希望哥哥把你的程序改成能跳回来!

如果想从Activity中跳到js页面起始可以
1.采用插件方法。
插件调用js,js跳转到相关的页面
2.采用webview跳转到相关的页面。
2 楼 zhiduo5 2012-08-23  
简单点说就是让你你的程序能从ThirdAndroidActivity跳回PhonegapAndroidActivityActivity能跳回来吗,跳不回来我只能在插件里加载了!希望哥哥把你的程序改成能跳回来!
1 楼 zhiduo5 2012-08-23  
我想要从目标Activity跳回来,就是super.loadUrl("file:///android_asset/wwwindex.html");
咋跳啊,求代码!

相关推荐

Global site tag (gtag.js) - Google Analytics