Android从第三方App返回的数据传输
近日在处理一个需求,外表看上去挺简单的,但是却搞了好久。
需求如下: App乙要更换新版本
App甲 A页面 -> App乙 B页面(判断APP是否升级,判断APP是否已经登录) -> App乙 B页面销毁 -> App乙 C页面 -> App乙 C页面做业务操作 -> App甲 A页面
正常来说,挺简单的,但是业务上有点复杂。先说App甲 ,,是一个混合开发,基本上可以理解为一个cordova+H5+vue的功能,所有调用外系统app使用cordova的插件。App乙的B页面,只是做鉴权用,而且B页面不能进行修改,使用后就立马销毁。App乙的C页面,可以修改。
有人说,从App乙 C页面做业务操作 -> App甲 A页面 不简单吗?一个finish就搞定了呀。笔者开头也是这样想的。结果发现,没返回值…… 什么情况呢?app甲已经用startActivityForResult去打开乙了呀,而App乙 C页面也是这样写
//把返回数据存入Intent
intent.putExtra("code", xxxx);
setResult(RESULT_OK, intent);
finish();
这就奇怪了,为什么呢?
好吧,由于时间要求,笔者在一边翻查资料的同时,思考其他方法。首先将需求抽象一下
目前的需求是A-B-C,但是B要销毁自己,并且C要直接返回A,且参数要带回去。
方法1: 用启动模式可以从C页面返回到A页面
方法2: B页面不finish, 在B页面做中转,用onActivityResult返回给A
方法3:在App乙 中指定包名类名,跳转到App甲,然后在intent中传参
方法4:找出原有方法不能传参的原因
方法5:用其他方法进行不同App间的参数传递
好吧,理清楚需求已经写好方法备案后,就可以着手测试了
方法1: 用启动模式可以从C页面返回到A页面,但是参数无法带回去,同原有方式一样(废弃)
方法2:用startActivityForResult 去实现,但是B页面需要finish,App乙的B页面不肯进行修改(废弃)
方法3:指定包名类名,跳转的方式,但是业务是在js端,跳转时候无法控制在原来页面上(废弃)
好吧,兜兜转转又回到原点,先查查资料吧。
2000 years later~~~
在A页面进行startActivityForResult打开B页面,其实是等待B页面的数据返回,B页面因为finish掉了,所以A页面无法获取返回。C页面的返回,其实是返回B,但是B中没有继续透传,因而导致数据丢失。
好吧,我45度仰天,深呼吸,深呼吸。由于App乙不肯改,我内心那一阵涟漪……
只剩下方法5了,用其他方式传参。有什么比较方便又建单直接的呢?这时,朋友在微信上发了个口令码,一堆火星文,然后粘贴到某宝里打开。 好吧,既然这么有缘,就用你吧,剪贴板。
App乙的C页面这样改造
Intent intent = new Intent();
//把返回数据存入Intent
intent.putExtra("code", "xixixixi");
setResult(RESULT_OK, intent);
//将intent保存到剪贴板里面
putTextIntoClip(ThirdActivity.this,intent);
finish();
这个也是有个问题,不会在界面A里面的onActivityResult里面获取到Intent或者剪贴板的数据。但是可以在程序的其他地方获取到。 WTF…… 什么情况? 这都要耍我?返回时候获取不了,不返回的时候又能获取到???
于是,再次查看资料……
2000 years later~~~
在某个网页中看见这么一句话
【android10中规定, 只有默认输入法(IME)或者是目前处于焦点的应用, 才能访问到剪贴板数据。】
………………来,谁开发的,出来一下,保证不打死你……
于是,延迟了个1秒,OK,问题解决……
最终,前端js不用修改,App乙不用大改,就是C页面进行写入剪贴板即可。而我…… 乍看上去改动不大,也就十几行代码。but,个中苦逼有谁懂……
推荐阅读
-
Android识别预装的第三方App方法实例
-
Android Studio finish()方法的使用与解决app点击“返回”(直接退出)
-
从Google官方App中学习Android应用架构的设计
-
Android App从服务器请求的图片到底该用多大?
-
Android App从服务器请求的图片到底该用多大?
-
Android从第三方App返回的数据传输
-
android 关于提高第三方app的service优先级
-
android 关于提高第三方app的service优先级
-
Android App首次安装完成后在安装界面直接打开应用,再按home键返回桌面,从桌面图标重新进入app,返回不到之前的界面问题
-
Android识别预装的第三方App方法实例