phonegap startActivityForResult插件

本文介绍在PhoneGap项目中正确使用startActivityForResult方法的技巧,通过创建空插件来确保活动回调能够准确地传递到预期的目标。此外,还详细展示了如何构建一个简单的插件以实现WebView应用与原生应用之间的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


WebView项目中PhoneGap插件使用细节startActivityForResult

作过android开的对于startActivityForResult这个方法的调用,应该不会陌生。

它就像是javascript中的模式对话模式,可以在弹出的新页面中,让用户进行操作,并把结果回传到所调用页面。当然在android中的实现,是有所差异。

 

在实现项目中,使用有PhoneGap插件,来作webview应用的开发。

当直接使startActivityForResult(intent,requestcode)这个方法,会提示PhoneGap出错,
PhoneGap Exception: Call startActivityForResult(Command, Intent) instead.

 

看源码,建设调用使用startActivityForResult(intent,-1).这样写的话,达不到“模式对话框”的目的。

源码中还有另一个PhoneGap扩展的方法:public void startActivityForResult(Plugin command, Intent intent, int requestCode)
,一开始也没管那么多,直接就调这个,那个Plugin command的参数,因为我是主程序调用的,所以很自然的就直接置为null.

 

测试正常,调用、回调都正常。以后没事了

 

项目运行一段时间后,发觉以前从插件发起的startActivityForResult都无法正常回调了。也就是插件里面定义的onActivityResult都没有被调到,跟踪发现,所有的回调都被主程序的onActivity给拦截了。

 

分析以下代码可以看出PhoneGap插件中,onActivityResult如何与对应插件相绑定,以及产生上述问题的原因:

  public void startActivityForResult(Plugin command, Intent intent, int requestCode) {
    	this.activityResultCallback = command;
    	this.activityResultKeepRunning = this.keepRunning;
    	
    	// If multitasking turned on, then disable it for activities that return results
    	if (command != null) {
    		this.keepRunning = false;
    	}
    	
    	// Start activity
    	super.startActivityForResult(intent, requestCode);
    }
  
  protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    	 super.onActivityResult(requestCode, resultCode, intent);
    	 Plugin callback = this.activityResultCallback;
    	 if (callback != null) {
    		 callback.onActivityResult(requestCode, resultCode, intent);
    	 }        
  }
   

  

 看来想在主程序(继承GapDroid)中使用startActivityForResult方法,只能采用绑定插件的办法了。
分析过程是相当无聊。只列出来解决办法,希望有更好处理的同仁,给予回复:

在主程序中定义一个空的插件,所有需要用到startActivityForResult的场合,都使用这个空的插件来作为第一参数。并在空插件中覆盖onActivityResult方法(里面可以是直接访问、调用主程序的代码)。

	/**
	 * 自定义一个空的插件,仅为完成原DroidGap中的事件处理逻辑
	 */
	class EmptyPlugin extends Plugin {

		@Override
		public PluginResult execute(String action, JSONArray args,
				String callbackId) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public void onActivityResult(int requestCode, int resultCode,
				Intent intent) {
			// TODO Auto-generated method stub
			if (resultCode == RESULT_OK) {
				if (requestCode == SETTING_CODE) {
........................................自己的处理代码............
								}
			}
		}

	}
private final EmptyPlugin ep = new EmptyPlugin();
startActivityForResult(ep,intent,111111);










1、新建一个java类,继承plugin类。重写它的execute方法:

 

publicclass pluginTest01 extends Plugin{

    

    private Object synObj = new Object();

    @Override

    public PluginResult execute(String action, JSONArray data, String callbackID) {

       // TODO Auto-generated method stub

       PluginResult result = null;

       

       try {      

           PluginResult.Status status = PluginResult.Status.OK;

           if(action.equals("getsubject")){ 

              Log.e("test", "test plugin js -> java~~~~"+data.getString(0)); 

              Log.e("test", "test plugin js -> java~~~~");            

              //result = new PluginResult(status, data.getString(0)); 

              handler.sendEmptyMessage(1);

              sleep();

           }

       } catch (Exception e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

       }

       return result;

    }

    

接着,自定义一个handler处理新页面的跳转工作,对于为什么要用handler我的理解是主线程被占了~~~:

    private Handler handler = new Handler() {

       publicvoid handleMessage(Message msg) {

           if (msg == null) {

              return;

           }

           switch (msg.what) {

           case 1:

              Intent intent = new Intent(ctx.getBaseContext(), Temp.class);//你想去的activity(exp:Temp)

              ctx.startActivityForResult(pluginTest01.this, intent, 1);

              break;

           }

       };

    };

    

然后,重写plugin类的onActivityResult方法,这个方法在返回webview时调用:

    @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);

       }

    }

    

下面自己构造sleep()和weakup(),不多解释:

    privatevoid sleep()

    {

        try

        {

            synchronized(synObj)

            {

                synObj.wait();

            }

        }

        catch (InterruptedException e)

        {

            e.printStackTrace();

        }

    }

    

    privatevoid weakup()

    {

        synchronized(synObj)

        {

            synObj.notify();

        }

    }

    

}

这样,一个phonegap插件就写好了。

 

2、在plugin.xml中加入以下代码,注册这个插件:

    <plugin name="pluginTest01" value="wgj.plugin.pluginTest01"/>

    解释:name-自己起的别名,value-真实的包名.类名

 

3、在phonegap提供的js文件(位置:assets/www/xxx.js)最后面加入一段代码:

var testAndroid01API=function(){}; 

testAndroid01API.prototype.getsubject = function(params, success, fail)

{ 

    return PhoneGap.exec( 

           function(args){ success(args); }, 

           function(args){ fail(args); }, 

           'pluginTest01', //java类

           'getsubject', //action 

           [params] //params 

            ); 

};

PhoneGap.addConstructor(function() {

    PhoneGap.addPlugin('testAndroid01API', new testAndroid01API());

    });

 

4、自己写个html页面,放在assets/www/文件夹下,贴个我的测试页面代码:

<!DOCTYPE HTML>

<html>

<head>

<title>PhoneGap</title>

<script type="text/javascript" charset="utf-8" src="phonegap.js"></script>

<script type="text/javascript">

    function test01(){ 

       var subject = document.getElementById("text1").value

       window.plugins.testAndroid01API.getsubject(subject,

              function(r){//alert(r);

                  },

              function(e){//alert(e);

              }

           );

    }

</script>

</head>

<body>

<h1>Hello World</h1>

    <input type="hidden" name="text1" id="text1" value="110"/>

    <button type="button">Click Me!</button>

</body>

</html>

 

5、新建一个android起始activity,继承DroidGap:

 

import android.os.Bundle;

import com.phonegap.*;

 

publicclass PhonegapDemo extends DroidGap {

    /** Called when the activity is first created. */

    @Override

    publicvoid onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        super.loadUrl("[url=]file:///android_asset/www/index.html[/url]");

    } 

}

 

 

大功告成啦,点击html中的button就可以跳转到你想去的activity了。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值