【问题标题】:Activity finished after getting result with onActivityResult使用 onActivityResult 获得结果后活动完成
【发布时间】:2019-07-25 08:54:54
【问题描述】:

场景:

MainActivity(我们称之为活动A)有3个片段并启动活动B。活动B然后是startActivityForResult(活动C)。问题是当在活动 C 上设置结果 OK 并调用 onBackPress 时,在活动 B 上调用 startActivityForResult 但活动 B 在几秒钟后关闭。

活动A -> 活动B -> 活动C(用于结果),结果OK,完成

然后 -> Activity B onActivityResult 被调用,结果 OK,但 Activity B 完成并返回到 ActivityA,它重新加载了两次(我使用 Logcat 并看到 onDestroy 和 onCreate 被调用了两次 Activity B 和 Activity A)。

找到以下但对我帮助不大的Activity is closed after onActivityResult is called

尝试查看launchMode

这是清单:

<activity
            android:name=".activities.ActivityA"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@style/AppTheme.NoActionBar"
            android:windowSoftInputMode="stateHidden">
    </activity>

    <activity
            android:name=".activities.ActivityB"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@style/AppTheme.NoActionBar.Profile">
    </activity>

    <activity
            android:name=".activities.ActivityC"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@style/AppTheme.NoActionBar.Profile"
            android:windowSoftInputMode="stateHidden|adjustPan">
    </activity>

这是发布:

活动 A 到活动 B:

intent = Intent(this@ActivityA, ActivityB::class.java)
            intent.putExtra("user", user)
            startActivity(intent)

活动 B 到活动 C:

val intent = Intent(this@ActivityB, ActivityC::class.java)
    intent.putExtra("user", user)

Activity C设置结果OK并完成:

setResult(Activity.RESULT_OK)
finish()

行为截图:https://youtu.be/gMlH5iujoh0

任何帮助表示赞赏

编辑:Activity B onActivityResult

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    if (requestCode == REQUEST_CODE_EDIT_PROFILE && resultCode == Activity.RESULT_OK) {
        Timber.e("REQUEST_CODE_EDIT_PROFILE OK AND RESULT OK")
        HelperTools(applicationContext).toastStatus(
            getString(R.string.your_profile_has_been_updated),
            Toast.LENGTH_SHORT,
            ToastType.SUCCESS
        )
        populateData(user)
    }
}

【问题讨论】:

  • 你能把你的活动 B onActivityResult 逻辑贴在这里吗,
  • 什么是user 你能提供这个类的来源吗?如果它是可打包/可序列化的,你能确定它是否正确解析吗?
  • @DhavalSolanki 我用 Activity B onActivityResult 编辑了帖子,Radekj 用户是一个 Parcelable 类,并在正确填充数据时正确解析

标签: android kotlin


【解决方案1】:
val intent = Intent(this@ActivityB, ActivityC::class.java)
startActivityForResult(Intent(this@ActivityB,ActivityC::class.java),REQUEST_CODE_EDIT_PROFILE ))

请通过日志确认数据正确传递和接收, 并找出造成onDestroy的原因是什么

下面是获取parceble数据的示例代码

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case REQUEST_CODE_CONTACT_SELECTION:
            if (resultCode == Activity.RESULT_OK) {
                assert data != null;
                ContactModel mContactModel = data.getParcelableExtra("contactResult");

                new MessageDialog(this)
                        .setMessage(getString(R.string.are_you_sure_you_want_to_block_contact, mContactModel.getFullName()))
                        .setPositiveButton(getString(R.string.yes), (dialog, which) -> {
                            dialog.dismiss();
                            API_blockUnblockContact(mContactModel, true);
                        })
                        .setNegativeButton(getString(R.string.no), (dialog, which) -> dialog.dismiss()).show();
            }
            if (resultCode == Activity.RESULT_CANCELED) {
                //Write your code if there's no result
                Logger.e(TAG, "Result Canceled");
            }
            break;
    }
}

【讨论】:

  • 数据解析可以作为用户独立于活动 C(已经检查)。我尝试为 Activity C 设置 android:parentActivityName=".activities.ActivityA" (对于 Activity B)和 android:parentActivityName=".activities.ActivityB"。Activity B 现在不再被销毁,但 Activity B 的 onActivityResult 仍然重定向到Activity A(重新创建)
  • 您是否在 Activty B 上调用完成? ,因为我有和你一样的功能,我没有使用 android:parentActivityName 但它工作正常
  • 在设置结果是 Activity C 而不是 onBackPressed() 后,我最终调用了 finish(),但行为是相同的。我想问题是我在活动 B 中进行一些计算。更清楚地说:完成活动 C 后,我需要在活动 B 上“重新填充”数据。当我不这样做时,它工作正常,这意味着没有重定向到活动 A,但是当我在活动 B 的 onActivityResult 中调用重新填充时,我被重定向到活动 A
  • 我不明白为什么你把你的 populateData(user) 方法放在 if (requestcode == REQUEST_CODE_EDIT_PROFILE && resultCode == Activity.RESULT_OK) 之外?
  • populateData(user) 确实在 (requestcode == REQUEST_CODE_EDIT_PROFILE && resultCode == Activity.RESULT_OK) 的大括号 { } 内,括号 ( ) 用于 HelperTools 方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多