启动一个ACTION_VIEW活动来打开浏览器,如何返回到我的应用程序?

14

我的应用需要打开银行页面,让用户能够付款。 阅读 Android 文档后,我发现应该使用 ACTION_VIEW(而不是 WebView)来实现这一功能。

 Uri uri = Uri.parse("http://www.example.com");
 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
 startActivity(intent);
我的问题是:用户完成付款后,我如何回到应用程序
我的意思是,我想要做类似于:
startActivityForResult(intent, RESULT_CODE);

使用以下方法打开银行网站,等用户完成操作后返回应用程序:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

回调函数用于处理支付结果。

那么,我是否按照正确的方式进行了操作?或者还有其他方法可以实现这一点吗?


这听起来像是一次计划中的崩溃。登录系统可能已被恶意软件破坏。我建议尝试安装诺顿或麦卡菲全面防护来解决问题,然后发送电子邮件到银行总部描述问题。 - Dave C Briggs
4个回答

8
浏览器如何知道用户已经完成银行页面的操作呢?它没有办法知道。
另外,浏览器不会通过设置结果后结束来响应startActivityForResult()
因此,您不能使用Android浏览器完成此任务。
唯一可能的方法是启动WebView,并通过检测某些URL来检测用户何时完成了操作。这个URL通常会在用户完成银行任务时显示。

5
实际上,您可以采用不同的方法返回到您的调用活动。如果您处理的网页或允许您在用户完成某些处理后分配回调,则可以将该回调设置为URI,并将该URI分配给您的调用活动。如果活动启动模式是singleTask,则您将能够恢复您的活动。
唯一尚未解决的问题是我不知道如何从堆栈中删除浏览器,一旦它返回到您的调用活动。我希望实现这一点,因为一旦离开您的应用程序,Android会将浏览器活动推到前面,强制用户自己完成它。

2
您可以使用以下代码启动Web浏览器应用程序:intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);以防止它被添加到后台堆栈。 - Spoonface

2

应用程序无法确定用户是否完成了封禁页面。

通常,银行支付网关使用 callBackUrl 属性进行调用。

我处理这种情况的方式如下:

  1. 在我的 callBackUrl 上,我设置了一个用于验证支付页面(Web 页面)的 URL。
  2. 在验证付款页面的 HTML 中,我创建了一个名为“返回应用程序”的按钮,此按钮的 href 是一个类似于“/app/order/payed”的 URL。
  3. 在我的 Android 应用程序中,我使用了Android App Link

HTML 页面:

<div class="flex-center position-ref" style='height:30vh;'>
          <a href="http://myserver/app/order/payed" class="btn-success">
            Return To Application
          </a>
        </div>

在Android清单文件中:
<activity
            android:name=".shop.customer.order.OrderPayedActivity"
            android:launchMode="singleInstance"
            android:taskAffinity=".shop.customer.cart.CartActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="@string/BASE_URL_HOST"
                    android:pathPattern="/app/order/payed"
                    android:scheme="@string/BASE_URL_SCHEME" />
            </intent-filter>
        </activity>

在接收活动中:

//managed parent activities in the manifest in order to make task`s back stack 
 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this,OrderListActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

    TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this);
    taskStackBuilder.addNextIntentWithParentStack(intent);

    taskStackBuilder.startActivities();
    //startActivity(intent);
    finish();
}

-2

只需在您的startActivityForResult方法中添加一个ResultCode参数,例如=this.startActivityForResult(intent, PAYMENT_ACCEPTED)

当您完成第二个活动时,它将作为resultCode返回。


我知道这个问题,但是问题是“当支付完成后,如何停止第二个活动?” - Abramodj
Papachan,我知道这是一个旧答案,但是您说的添加Extra Bundle是什么意思?这会如何使您的浏览器返回到活动状态? - Silver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接