AndroidはonActivityResultのsetResult呼び出しを無視しているようです

MowDownJoe

私は2つのアプリを持っています。1つは他を呼び出すために存在する非常に単純なおもちゃのアプリです。

const val AUTHENTICATE_CODE = 42

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        fab.setOnClickListener {
            Intent(Intent.ACTION_VIEW, Uri.parse("testapp://hello.world/")) //2nd app has intent filter to intercept this.
                .also { intent -> startActivityForResult(intent, AUTHENTICATE_CODE) }

        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        val textView = findViewById<TextView>(R.id.hello_text)

        if (requestCode == AUTHENTICATE_CODE && resultCode == Activity.RESULT_OK) {
            requireNotNull(data) {
                textView.text = "Error: Intent was null. Data lost."
                return@onActivityResult
            }
        val dataExtra = data.getStringExtra("com.example.app.DATA")
        requireNotNull(dataExtra){
            textView.text = "Error: Intent did not contain data."
            return@onActivityResult
        }
            Log.d("TestAppPlsIgnore", "Result Intent received")
            textView.text = "Success! $dataExtra"
        } else {
            textView.text = "Something went wrong. Request = $requestCode; Result = $resultCode"
        }
    }
//...
}

他のアプリはもう少し複雑です:

  • おもちゃのアプリが起動するアプリ2のアクティビティは、Jetpackのナビゲーションライブラリを実装します。
  • そのアクティビティのナビゲーショングラフにあるほとんどのフラグメントは、同じViewModelを実装します。すなわちprivate val mainViewModel by activityViewModels<MainActivityViewModel>()
  • 中にMainActivityViewModelは、LiveData<String>と呼ぶものがありますdataアプリ2のMainActivityには、次のようなデータを監視するオブザーバーがいます。

    val dataObserver = Observer<String> { data ->
        val result = Intent()
        result.putExtra("com.example.app.DATA", data)
        Log.d("MainActivity.DataObserver", "Sending data $data")
        setResult(Activity.RESULT_OK, result)
        finish()
    }
    mainViewModel.data.observe(this, dataObserver)
    
  • 文字列が挿入されるポイントに到達するための一般的なフローdataでは、メインアクティビティのナビゲーションビューが1つ以上のフラグメント間を移動する可能性があります。

期待される結果dataアプリ2で文字列が追加されると、オブザーバーは結果インテントを作成し、それを結果として設定して、アプリ2を終了します。アプリ1は結果を受け取り、onActivityResultを呼び出し、「Success! 「」プラスいくつかのデータ。

私が得るもの:オブザーバーは機能します。ログステートメントは、オブザーバーが正しいデータを受信したことを示しています。アプリ2が終了します。また、アプリ1のonActivityResultは失敗のケースを表示し、正しいリクエストコードを示しますが、レスポンスコード== Activity.RESULT_CANCELLEDです。requireNotNull(data)ステートメントがステートメントの外に移動された場合if、アプリ1は代わりに、返されたインテントがnullであったことを示します。

私の質問:

  1. RESULT_CANCELLEDが明示的に返されていないため、データを含むインテントを返そうとしています。したがって、RESULT_CANCELLEDが返される理由として、アクティビティがクラッシュしたままになるだけです。ナビゲーショングラフをナビゲートすると、必然的に一部のフラグメントがライフサイクルの終わりに到達します。Androidはそれをアクティビティのクラッシュと混同しますか?
  2. onActivityResultが呼び出されているときにnullインテントがあるのはなぜですか?ほとんどの場合、もう少し詳しく説明すると、ドキュメント概説されている内容従っています。
  3. これは、2つの特定のアプリ間で単純な文字列を送信する正しい方法ではありませんか?共有インテントは使用したくありません。これは、アプリとアプリのカテゴリ間の幅広いコミュニケーションではなく、特定のアプリ間のより直接的なコミュニケーションを目的としているためです。
MowDownJoe

finishAfterTransition()私のようなオブザーバーベースのセットアップを使用してデータを送信する場合は、アプリの他の場所に電話をかけるべきではないことがわかりましたstartActivityForResult()finishAfterTransition()への呼び出しと競合が発生しfinish()、nullの結果とRESULT_CANCELLEDのResultCodeが送信されます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

NSubstituteのparams引数を無視して呼び出しをテストするにはどうすればよいですか?

分類Dev

残りのパラメーターを無視したいときに、正しいパラメーターでサービスを呼び出しているかどうかを確認するにはどうすればよいですか?

分類Dev

Mockitoは:どのようにする方法を確認するために、他のメソッドへの呼び出しを無視して、正確なパラメータで一度だけ呼ばれていましたか?

分類Dev

に対応する?selfがメソッドを呼び出すことができる場合はfalseを返し、superは入力への変更を無視しているようです

分類Dev

入力番号の警告を検出して無視するにはどうすればよいですか?

分類Dev

入力番号の警告を検出して無視するにはどうすればよいですか?

分類Dev

F#関数を定義しているが呼び出していないのに、関数はまだ呼び出されているようです

分類Dev

jQuery.get呼び出しで取得したURLを使用して別の呼び出しを実行するにはどうすればよいですか?

分類Dev

Dojo:すべてのxhr / ajax呼び出しは同期しているようで、他の呼び出しをブロックします

分類Dev

Androidタイマーは.cancelを無視しているようです

分類Dev

初期化されていない属性への呼び出しを無視する、よりクリーンなpythonicの方法はありますか?

分類Dev

ナビゲート()呼び出しを無視する:FragmentManagerはすでにその状態を保存しています

分類Dev

DateTime.Parseは文化を無視しているようです

分類Dev

numpy.genfromtxtはdtypeを無視しているようです

分類Dev

C ++:中括弧付きの関数呼び出し式-init-list-標準では、単一要素リストの些細なケースで中括弧を無視するように規定されていますか?

分類Dev

Webpackは私のtypescriptローダーを無視しているようです

分類Dev

MypyはTypeVarタイプの境界を無視しているようです

分類Dev

Makeは私のCFLAGSとLDFLAGSを無視しているようです

分類Dev

魚の殻はLD_LIBRARY_PATHを無視しているようですか?

分類Dev

Javaは私のtoStringメソッドを無視しているようです

分類Dev

@RefreshScopeはMockitoのモックを無視しているようです

分類Dev

SqlcommandANDは最初のパラメータを無視しているようです

分類Dev

すでに終了しているアクティビティから Activity.setResult() を呼び出す

分類Dev

関数を呼び出してその結果を使用するにはどうすればよいですか?

分類Dev

Makefileはフラグを無視しているようです。どうして?

分類Dev

Makefileはフラグを無視しているようです。どうして?

分類Dev

結果に基づいて、監視可能な別の呼び出しを行うにはどうすればよいですか?

分類Dev

MongoDB C#ドライバーを使用してobj.ToBsonDocument()を呼び出して、null値をグローバルに無視するにはどうすればよいですか?

分類Dev

print関数呼び出しを無視して、doctestのみを実行する方法はありますか?

Related 関連記事

  1. 1

    NSubstituteのparams引数を無視して呼び出しをテストするにはどうすればよいですか?

  2. 2

    残りのパラメーターを無視したいときに、正しいパラメーターでサービスを呼び出しているかどうかを確認するにはどうすればよいですか?

  3. 3

    Mockitoは:どのようにする方法を確認するために、他のメソッドへの呼び出しを無視して、正確なパラメータで一度だけ呼ばれていましたか?

  4. 4

    に対応する?selfがメソッドを呼び出すことができる場合はfalseを返し、superは入力への変更を無視しているようです

  5. 5

    入力番号の警告を検出して無視するにはどうすればよいですか?

  6. 6

    入力番号の警告を検出して無視するにはどうすればよいですか?

  7. 7

    F#関数を定義しているが呼び出していないのに、関数はまだ呼び出されているようです

  8. 8

    jQuery.get呼び出しで取得したURLを使用して別の呼び出しを実行するにはどうすればよいですか?

  9. 9

    Dojo:すべてのxhr / ajax呼び出しは同期しているようで、他の呼び出しをブロックします

  10. 10

    Androidタイマーは.cancelを無視しているようです

  11. 11

    初期化されていない属性への呼び出しを無視する、よりクリーンなpythonicの方法はありますか?

  12. 12

    ナビゲート()呼び出しを無視する:FragmentManagerはすでにその状態を保存しています

  13. 13

    DateTime.Parseは文化を無視しているようです

  14. 14

    numpy.genfromtxtはdtypeを無視しているようです

  15. 15

    C ++:中括弧付きの関数呼び出し式-init-list-標準では、単一要素リストの些細なケースで中括弧を無視するように規定されていますか?

  16. 16

    Webpackは私のtypescriptローダーを無視しているようです

  17. 17

    MypyはTypeVarタイプの境界を無視しているようです

  18. 18

    Makeは私のCFLAGSとLDFLAGSを無視しているようです

  19. 19

    魚の殻はLD_LIBRARY_PATHを無視しているようですか?

  20. 20

    Javaは私のtoStringメソッドを無視しているようです

  21. 21

    @RefreshScopeはMockitoのモックを無視しているようです

  22. 22

    SqlcommandANDは最初のパラメータを無視しているようです

  23. 23

    すでに終了しているアクティビティから Activity.setResult() を呼び出す

  24. 24

    関数を呼び出してその結果を使用するにはどうすればよいですか?

  25. 25

    Makefileはフラグを無視しているようです。どうして?

  26. 26

    Makefileはフラグを無視しているようです。どうして?

  27. 27

    結果に基づいて、監視可能な別の呼び出しを行うにはどうすればよいですか?

  28. 28

    MongoDB C#ドライバーを使用してobj.ToBsonDocument()を呼び出して、null値をグローバルに無視するにはどうすればよいですか?

  29. 29

    print関数呼び出しを無視して、doctestのみを実行する方法はありますか?

ホットタグ

アーカイブ