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: `實作相關`