欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android从第三方App返回的数据传输

程序员文章站 2022-03-03 12:02:42
...

 近日在处理一个需求,外表看上去挺简单的,但是却搞了好久。

需求如下: 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,个中苦逼有谁懂……