即使使用 launchMode="singleTask" 也可以启动两次活动

Posted

技术标签:

【中文标题】即使使用 launchMode="singleTask" 也可以启动两次活动【英文标题】:launch activity twice even with launchMode="singleTask" 【发布时间】:2020-06-10 00:04:27 【问题描述】:

我有一个活动来显示两个不一致的目标的游览详细信息

第一 该活动有一个预订按钮,该按钮重定向到银行付款并在付款成功或不成功后返回活动。这就是为什么我在清单中设置启动模式以停止重新创建活动。

android:launchMode="singleTask"

第二 该活动有一个重定向到类似旅游的按钮,然后我必须在startActivity() 之前调用finish(); 以使意图工作!

onNewIntent() 内部活动获取第一部分的数据

@Override
protected void onNewIntent(Intent intent) 
    super.onNewIntent(intent);
    if (intent.getData() != null) 
        Helper.logDebug("fsfsfsgsgsgs", "inside get data not null");
        String query = intent.getData().getQuery();
        Helper.logDebug("fsfsfsgsgsgs","query is "+ query);
        if (query!=null && query.contains("Status=OK")) 
            if (frgBtmReserve!=null)
                frgBtmReserve.dismiss();
            
            String count=query.substring(16);
            Helper.logDebug("fsfsfsgsgsgs","count is "+ count);
            frgObjectInfo.updateReserveCount(count);
            Helper.logDebug("fsfsfsgsgsgs", "inside status ok");
            Helper.notifyUserDone(getResources().getString(R.string.success_tour_reserve), this,R.drawable.ic_tick);
         else 
            frgBtmReserve.dismiss();
            Helper.logDebug("fsfsfsgsgsgs", "inside status nok");
            Helper.notifyUserWarning(getResources().getString(R.string.error_tour_reserve), this);
        
    

点击第二部分,它应该创建当前活动的新实例,但由于活动的启动模式为singleTask.intent 直到我在finish() startActivity() 之前才起作用

Intent intent = new Intent(context, ActivityShowObject.class);
            intent.putExtra(ActivityShowObject.INTENT_KEY_TYPE, Obj.TYPE_TRAVEL);
            intent.putExtra(ActivityShowObject.INTENT_KEY_COLOR, color);
            intent.putExtra(ActivityShowObject.INTENT_KEY_OBJ_ID, obj.getAgencyId());
            ((AppCompatActivity)context).finish();
            startActivity(intent);
            Animatoo.animateShrink(context);

这是我的问题 想一想正在查看一些类似旅行的用户,然后按返回,应用程序会回到第一步!大家有什么建议吗?

【问题讨论】:

你需要展示你的代码让我们看懂代码! 我已经添加了一些我的代码!有帮助吗?如果不需要我的代码的哪一部分? 使用“singleTask”启动模式会导致问题。银行付款如何返回到您的应用? 【参考方案1】:

摆脱

android:launchMode="singleTask"

首先。我认为这是错误的用例,让你更难。

你有两种情况:

1) 本次行程新增活动付费 2) 新活动浏览另一个旅游

#2 使用正常的startActivity 路由,这将允许正常的后退导航

对于#1,您也可以使用普通的startActivity,但我有一种感觉,当他们成功付款时,您不希望他们按回以返回游览,但如果他们付款不成功,您确实想让他们回去?

如果是这种情况,您可以在导航到排名第一的付款方案时使用startActivityForResult

当他们成功完成支付时调用

setResult(RESULT_OK)

如果他们不成功

setResult(RESULT_CANCELLED)

然后当他们反击时,结果被传播到第一个活动,你可以使用它来调用 finish() 或不调用。

【讨论】:

谢谢布伦德尔!这听起来像是一个很好的解决方案。在您回答后我有一个想法,我将创建一个收据活动,在付款成功或不成功后加载。收据付款将有一个按钮导航到我的旅游活动,返回将导航到旅游信息。如果付款不成功,用户会自动导航游览信息活动...我会对此进行测试并告诉您结果。

以上是关于即使使用 launchMode="singleTask" 也可以启动两次活动的主要内容,如果未能解决你的问题,请参考以下文章

当使用 startActivityForResult 启动活动时,LaunchMode "singleTop" 会被忽略

onActivityResult 与 launchMode="singleTask"?

设置 launchMode="singleTask" 与设置活动 launchMode="singleTop"

android launchmode 使用场景

launchMode="singleTask" 不创建新任务

Activity 为 launchMode="SingleTask" 时,进度对话框未显示 2 次