Откройте приложение с несколькими внутренними намерениями и дождитесь результата - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть приложение (APP1), которое должно открыть другое приложение (APP2) и дождаться результата.Я делаю это таким образом.

private fun startBridgeActivity(fileName: String, isProduction: Boolean) {
        val intent = Intent(Intent.ACTION_MAIN)
        when (isProduction) {
            true -> {
                intent.component = ComponentName(
                    "com.myapp",
                    "com.myapp.view.ui.ItemSelectionActivity"
                )
            }
            else -> {
                intent.component = ComponentName(
                    "com.myapp.dev",
                    "com.myapp.view.ui.ItemSelectionActivity"
                )
            }
        }
        try {
            startActivityForResult(intent, REQUEST_CODE)
        } catch (e: Exception) {
            e.printStackTrace()
            Toast.makeText(this@MainActivity, "This activity does not exist", Toast.LENGTH_LONG).show()
        }
    }

Затем APP2 получает это намерение и открывает себя.Метод запуска на этом APP2 - это просто стандарт.Навигация внутри APP2 выглядит следующим образом:

ReceiverActivity - Step1Activity - Step2Activity - LastActivity

Я попытался установить результат и завершить LastActivity, но это не сработало.Также пытались с finishAffinity и finishAndRemoveTasks, но они также не работали.

Затем я вызывал ReceiverActivity из LastActivity, устанавливал там результат и заканчивал его.Но это оставляет меня на домашнем экране, и результат не дойдет до APP1.

val receiverActivityIntent = Intent(this@LastActivity, ReceiverActivity::class.java)
        receiverActivityIntent.putExtra("end", true)
        TaskStackBuilder.create(this@ReceiverActivity)
                .addParentStack(ReceiverActivity::class.java)
                .addNextIntent(receiverActivityIntent)
                .startActivities()
        finish()

Я прочитал некоторые другие ответы SO, где кто-то написал, что Activity из APP1 будет добавлено в стек APP2, и это может бытьпочему приложение переходит на домашний экран.

Любая помощь будет оценена.

Спасибо.

1 Ответ

0 голосов
/ 13 февраля 2019

Ваше приложение запускает ItemSelectionActivity, используя startActivityForResult().Ваше приложение получит обратный вызов onActivityResult() после завершения ItemSelectionActivity.Он получит результаты, которые ItemSelectionActivity устанавливает при вызове setResult().

Если ItemSelectionActivity необходимо запустить другие действия, прежде чем он сможет получить результаты для отправки обратно в ваше приложение, вы можете сделать это внесколько возможных способов:

  1. Использование FLAG_ACTIVITY_FORWARD_RESULT

Когда ItemSelectionActivity запускает еще один Activity, он должен установить флаг Intent.FLAG_ACTIVITY_FORWARD_RESULT в Intent и вызовите startActvity() ( НЕ звоните startActivityForResult(). Запускаемый Activity должен затем вызвать setResult() с результатами, и эти данные будут переданы обратноВаше приложение. Вы в основном «пересылаете» запрос на результат от одного Activity к следующему. Так как вам, кажется, нужно выполнить несколько действий, прежде чем вы получите результат, вы можете продолжать переадресовывать ответственность с одного Activity к следующему Activity. Последнему в цепочке следует вызвать setResult(), и эти результаты будут переданы обратно в ваше приложение в onActivityResult().

Цепочка startActivityForResult() вызовов:

Когда ItemSelectionActivity запускает еще один Activity, он должен вызвать startActvityForResult().Activity, который запускается, должен затем вызвать setResult() с результатами, и эти данные будут переданы обратно в ItemSelefctionActivity в onActivityResult().Затем ItemSelectionActivity должен сам вызвать setResult() с данными и finish().Результаты будут переданы обратно в ваше приложение.Поскольку вам, кажется, нужно выполнить несколько действий, прежде чем вы получите результат, вы можете продолжить цепочку этих вызовов, чтобы каждый Activity запускал следующий Activity, используя starActivityForResult() и вызываемый Activity needs to pass the results back using setResult () `.

Пусть LastActivity доставит результат ItemSelectionActivity:

Это решение, которое вы уже пытались внедрить.LastActivity возвращает результат непосредственно в ItemSelectionActivity.Однако ваша реализация не работает. НЕ ИСПОЛЬЗУЙТЕ TaskStackBuilder для достижения этой цели! TaskStackBuilder имеет много побочных эффектов, которые разрушают стек Activity внутри задачи.Вместо этого вы хотите сделать следующее:

val receiverActivityIntent = Intent(this@LastActivity, ReceiverActivity::class.java)
receiverActivityIntent.putExtra("end", true)
// add the results to the Intent
receiverActivityIntent.putExtra("results", results)
// Set the CLEAR_TOP and SINGLE_TOP flags (if necessary) to remove any
//  activities that are on the stack between ReceiverActivity and LastActivity
receiverActivityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
    Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(receiverActivityIntent)
// Calling finish() here isn't necessary if you set the Intent flags
finish()

ПРИМЕЧАНИЕ. Мой синтаксис Kotlin может быть не на 100% правильным, но, надеюсь, вы поняли идею.

С этим решением результаты будутдоставить до ReceiverActivity в onNewIntent().Вам нужно будет переопределить onNewIntent(), получить результаты из переданного Intent и затем вызвать setResult() с результатами, чтобы передать их обратно в ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...