作过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 {@Overridepublic PluginResult execute(String action, JSONArray args,String callbackId) {// TODO Auto-generated method stubreturn null;}@Overridepublic void onActivityResult(int requestCode, int resultCode,Intent intent) {// TODO Auto-generated method stubif (resultCode == RESULT_OK) {if (requestCode == SETTING_CODE) {........................................自己的处理代码............}}}}
private final EmptyPlugin ep = new EmptyPlugin();
startActivityForResult(ep,intent,111111);

更多相关文章

  1. Android(安卓)Binder Mechanism (2) -- 如何获得ServiceManager
  2. 理解Android系统的进程间通信原理(二)----RPC机制
  3. AsyncTask 很好
  4. 【转】Invalidate和postInvalidate的区别
  5. 框架层理解Activity生命周期(APP启动过程)
  6. 关于activity和task的设计思路和方法
  7. android游戏绘制屏幕
  8. Android绘图基础:Canvas、Paint、Path的简单使用
  9. 【Android】EventBus 3.0 源码分析

随机推荐

  1. Android中如何使用对话框(单选对话框和多
  2. Android 如何让Dialog实现背景透明
  3. Android(安卓)sensor 大杂烩
  4. Android之自定义标题栏(组合控件)
  5. slidingmenu框架
  6. android使用Canvas画柱状图和饼图源码
  7. android弹出单选、多选菜单
  8. A20启动LUNCH选项修改
  9. android活动的跳转到另一个活动
  10. android studio 2.0 引导页示例