ActivityResultContractでインテントを投げずに結果を返す
最終更新日:2022-05-08
    
    ActivityResultContract
 は結果のあるアクティビティを起動するのに使います。しかしパラメータの中身によってはインテントを投げずに結果を返したほうがはやい場合もあるかもしれません(例えば不正なパラメータが渡されたなど)。
その場合、 getSynchronousResult()
 をオーバーライドすることでインテントを投げずに結果を返すことができます。
class NextActivityResultContract: ActivityResultContract<Int, String>() {
  override fun createIntent(context: Context, input: Int?): Intent { ... }
  override fun parseResult(resultCode: Int, intent: Intent?): String { ... }
  override fun getSynchronousResult(context: Context, input: Int?): SynchronousResult<String>? {
    if (input == 1) {
      // 画面遷移不要で結果を返しちゃえ
      return SynchronousResult("OK")
    }
    return null
  }
}
null
 を返すとインテントを作成して投げる処理が行われます。
どんな場面で使う?
すいません、アプリ開発者が使う場面が浮かびませんでした。
なお、ライブラリでは RequestPermission
 や RequestMultiplePermissions
 で使われていました。すでに権限取得済みだったらインテントを投げる必要はないですね。
public static final class RequestPermission extends ActivityResultContract<String, Boolean> {
  @NonNull
  @Override
  public Intent createIntent(@NonNull Context context, @NonNull String input) { ... }
  @NonNull
  @Override
  public Boolean parseResult(int resultCode, @Nullable Intent intent) { ... }
  @Override
  public @Nullable SynchronousResult<Boolean> getSynchronousResult(
      @NonNull Context context, @Nullable String input) {
    if (input == null) {
      return new SynchronousResult<>(false);
    } else if (ContextCompat.checkSelfPermission(context, input)
         == PackageManager.PERMISSION_GRANTED) {
      return new SynchronousResult<>(true);
    } else {
      // proceed with permission request
      return null;
    }
  }
}
    
