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

http://mobile.51cto.com/others-289021.htm 

WebView项目中PhoneGap插件使用细节是本文要介绍的内容,主要是来了解PhoneGap插件的用法,作过android开发的对于startActivityForResult这个方法的调用,应该不会陌生。

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

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

当直接使startActivityForResult(intent,requestcode)这个方法,会提示PhoneGap出错,

  1. PhoneGapException:CallstartActivityForResult(Command,Intent)instead. 

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

源码中还有另一个PhoneGap扩展的方法:

  1. publicvoidstartActivityForResult(Plugincommand,Intentintent,intrequestCode) 

,一开始也没管那么多,直接就调这个,那个Plugincommand的参数,因为我是主程序调用的,所以很自然的就直接置为null.

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

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

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

Java代码

  1. publicvoidstartActivityForResult(Plugincommand,Intentintent,intrequestCode){  
  2.  
  3. this.activityResultCallback=command;  
  4.  
  5. thisthisthis.activityResultKeepRunning=this.keepRunning;  
  6.  
  7. //Ifmultitaskingturnedon,thendisableitforactivitiesthatreturnresults  
  8.  
  9. if(command!=null){  
  10.  
  11. this.keepRunning=false;  
  12.  
  13. }  
  14.  
  15. //Startactivity  
  16.  
  17. super.startActivityForResult(intent,requestCode);  
  18.  
  19. }  
  20.  
  21. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentintent){  
  22.  
  23. super.onActivityResult(requestCode,resultCode,intent);  
  24.  
  25. Plugincallback=this.activityResultCallback;  
  26.  
  27. if(callback!=null){  
  28.  
  29. callback.onActivityResult(requestCode,resultCode,intent);  
  30.  
  31. }  
  32.  
  33. }  
  34.  
  35. publicvoidstartActivityForResult(Plugincommand,Intentintent,intrequestCode){  
  36.  
  37. this.activityResultCallback=command;  
  38.  
  39. thisthisthis.activityResultKeepRunning=this.keepRunning;  
  40.  
  41. //Ifmultitaskingturnedon,thendisableitforactivitiesthatreturnresults  
  42.  
  43. if(command!=null){  
  44.  
  45. this.keepRunning=false;  
  46.  
  47. }  
  48.  
  49. //Startactivity  
  50.  
  51. super.startActivityForResult(intent,requestCode);  
  52.  
  53. }  
  54.  
  55. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentintent){  
  56.  
  57. super.onActivityResult(requestCode,resultCode,intent);  
  58.  
  59. Plugincallback=this.activityResultCallback;  
  60.  
  61. if(callback!=null){  
  62.  
  63. callback.onActivityResult(requestCode,resultCode,intent);  
  64.  
  65. }  
  66.  

看来想在主程序(继承GapDroid)中使用startActivityForResult方法,只能采用绑定插件的办法了。

分析过程是相当无聊。只列出来解决办法,希望有更好处理的同仁,给予回复:

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

Java代码

  1. /**  
  2. *自定义一个空的插件,仅为完成原DroidGap中的事件处理逻辑  
  3. */  
  4. classEmptyPluginextendsPlugin{  
  5. @Override  
  6. publicPluginResultexecute(Stringaction,JSONArrayargs,  
  7. StringcallbackId){  
  8. //TODOAuto-generatedmethodstub  
  9. returnnull;  
  10. }  
  11. @Override  
  12. publicvoidonActivityResult(intrequestCode,intresultCode,  
  13. Intentintent){  
  14. //TODOAuto-generatedmethodstub  
  15. if(resultCode==RESULT_OK){  
  16. if(requestCode==SETTING_CODE){  
  17. ........................................自己的处理代码............  
  18. }  
  19. }  
  20. }  
  21. }  
  22. /**  
  23. *自定义一个空的插件,仅为完成原DroidGap中的事件处理逻辑  
  24. */  
  25. classEmptyPluginextendsPlugin{  
  26. @Override  
  27. publicPluginResultexecute(Stringaction,JSONArrayargs,  
  28. StringcallbackId){  
  29. //TODOAuto-generatedmethodstub  
  30. returnnull;  
  31. }  
  32. @Override  
  33. publicvoidonActivityResult(intrequestCode,intresultCode,  
  34. Intentintent){  
  35. //TODOAuto-generatedmethodstub  
  36. if(resultCode==RESULT_OK){  
  37. if(requestCode==SETTING_CODE){  
  38. ........................................自己的处理代码............  
  39. }  
  40. }  
  41. }  

Java代码

  1. privatefinalEmptyPluginep=newEmptyPlugin();  
  2. privatefinalEmptyPluginep=newEmptyPlugin(); 

Java代码

  1. startActivityForResult(ep,intent,111111); 

小结:WebView项目中PhoneGap插件使用细节startActivityForResult的内容介绍完了,希望通过本文的学习能对你有所帮助! 

posted on 2012-06-16 19:57  民谣  阅读(288)  评论(0编辑  收藏  举报

导航