startactivityforresult 捨棄後替代方案:ActivityResultContracts (Java) === ### Activity 之間的通訊 - 新增一 `class` 需覆寫 `ActivityResultContract`,以及要**傳送**跟**接收**(`ActivityResultContract <I, O>`)的類型,以下範例是用 `String` 來示範 - 須註冊 callback 函式,用來接收返回結果 - 範例說明: `MainActivity` 傳 `"hello"` 給 `LoginActivity`; `LoginActivity` 回傳 `"world"` 給 `MainActivity`, ```java= public class MainActivity extends AppCompatActivity { final String TAG = "MainActivity"; ... @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Register callback ActivityResultLauncher<String> launcher = registerForActivityResult( new MainActivityResultContract(), new ActivityResultCallback<String>() { @Override public void onActivityResult(String result) { Log.d(TAG, result); } } ); // 切換 Activity, 如同舊方法 startActivity(intent) launcher.launch("hello"); } ... // 建立一覆寫 ActivityResultContract<I, O> 的類別 // 第一個 String 是 MainActivity 要傳給 LoginActivity 的資訊; // 第二個 String 是 LoginActivity 要回給 MainActivity 的資訊 public class MainActivityResultContract extends ActivityResultContract<String, String> { /** 傳送 */ @NonNull @Override public Intent createIntent(@NonNull Context context, String input) { Intent intent = new Intent(MainActivity.this, LoginActivity.class); intent.putExtra("login", input); return intent; } /** 接收回傳 */ @Override public String parseResult(int resultCode, @Nullable Intent intent) { if (resultCode != RESULT_OK) { return "error"; } String data = intent.getStringExtra("login_result"); return data; } } } ``` ```java= public class LoginActivity extends AppCompatActivity { final String TAG = "LoginActivity"; ... @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 接收 MainActivity 傳過來的 string String str = getIntent().getStringExtra("login"); Log.d(TAG, str); // 將結果 string 回傳給 MainActivity Intent intent = new Intent(); intent.putExtra("login_result", "world"); setResult(RESULT_OK, intent); finish(); } ... } ``` ### 申請權限/照片 相關服務 [參考](https://blog.csdn.net/nsacer/article/details/120156954) ## Ref. [Android startActivityForResult棄用?](https://codeilin.com/2021/08/06/android-startactivityforresult%E6%A3%84%E7%94%A8%EF%BC%9F/) (kotlin) [再见!onActivityResult!你好,Activity Results API!](https://zhuanlan.zhihu.com/p/268717257) (kotlin) [registerForActivityResult请求权限/拍照/选取视频图片/裁剪图片](https://blog.csdn.net/nsacer/article/details/120156954) (java) ###### tags: `實作相關`