Goolgle推荐 onActivityResult的替代方式
Goolgle推薦? ?onActivityResult的替代方式
1、Activity Results API
Activity Results API 是 Google官方推薦的Activity、Fragment獲取返回結果的方式。
Activity Results API 到底怎么用?相比onActivityResult有哪些優勢?接下來,將一一為你解答。
在介紹如何使用之前,先為大家介紹Activity Results API 中兩個重要的組件:
ActivityResultContract和ActivityResultLauncher。
- ActivityResultContract: 協議,它定義了如何傳遞數據和如何處理返回的數據。ActivityResultContract是一個抽象類,你需要繼承它來創建自己的協議,每個 ActivityResultContract 都需要定義輸入和輸出類,如果您不需要任何輸入,可使用 Void
- ActivityResultLauncher: 啟動器,調用ActivityResultLauncher的launch方法來啟動頁面跳轉,作用相當于原來的startActivity()
2、使用 Activity Results API 獲取Activity返回的結果
在app下的build.gragle中添加依賴
dependencies {def activity_version = "1.2.2"// Java language implementationimplementation "androidx.activity:activity:$activity_version"// Kotlinimplementation "androidx.activity:activity-ktx:$activity_version" }自定義contract繼承自ActivityResultContract<I,O>,其中,I是輸入的類型,O是輸出的類型。需要實現2個方法,createIntent和parseResult,輸入類型I作為createIntent的參數,輸出類型O作為parseResult方法的返回值
public class MyActivityResultContract extends ActivityResultContract<String,Integer>{@NonNull@Overridepublic Intent createIntent(@NonNull Context context, String input) {//Intent 跳轉到其它頁面,可攜帶參數return null;}@Overridepublic Integer parseResult(int resultCode, @Nullable Intent intent) {//獲取返回數據的resultreturn null;}}注冊MyActivityResultContract,registerForActivityResult方法,得到返回值ActivityResultLauncher的對象launcher,通過launcher跳轉
3、為了方便使用,google給出預定義了很多Contract來使用
-
StartActivityForResult: 通用的Contract,不做任何轉換,Intent作為輸入,ActivityResult作為輸出,這也是最常用的一個協定。
-
RequestMultiplePermissions:用于請求一組權限
-
RequestPermission: 用于請求單個權限
-
TakePicturePreview: 調用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值為Bitmap圖片
-
TakePicture: 調用MediaStore.ACTION_IMAGE_CAPTURE拍照,并將圖片保存到給定的Uri地址,返回true表示保存成功。
-
TakeVideo: 調用MediaStore.ACTION_VIDEO_CAPTURE 拍攝視頻,保存到給定的Uri地址,返回一張縮略圖。
-
PickContact: 從通訊錄APP獲取聯系人
-
GetContent: 提示用選擇一條內容,返回一個通過ContentResolver#openInputStream(Uri)訪問原生數據的Uri地址(content://形式) 。默認情況下,它增加了Intent#CATEGORY_OPENABLE, 返回可以表示流的內容。
-
CreateDocument: 提示用戶選擇一個文檔,返回一個(file:/http:/content:)開頭的Uri。
-
OpenMultipleDocuments: 提示用戶選擇文檔(可以選擇多個),分別返回它們的Uri,以List的形式。
-
OpenDocumentTree: 提示用戶選擇一個目錄,并返回用戶選擇的作為一個Uri返回,應用程序可以完全管理返回目錄中的文檔。
通過registerForActivityResult進行注冊,下面給出兩個例子作為演示:一個是正常的數據回傳,一個是運行時權限的申請
private ActivityResultLauncher<Intent> mLauncher;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);mLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {@Overridepublic void onActivityResult(ActivityResult result) {if (result.getResultCode() == Activity.RESULT_OK) {String stringExtra = result.getData().getStringExtra("result");Toast.makeText(MainActivity.this, stringExtra, Toast.LENGTH_SHORT).show();}} });btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this, Main2Activity.class);intent.putExtra("name","Tom");mLauncher.launch(intent);}});final String[] permission ={Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.READ_CONTACTS};ActivityResultLauncher<String[]> permissionLauncher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {@Overridepublic void onActivityResult(Map<String, Boolean> result) {for (int i = 0; i < permission.length; i++) {if(result.containsKey(permission[i])){Toast.makeText(MainActivity.this, permission[i], Toast.LENGTH_SHORT).show();}}}});permissionLauncher.launch(permission);}4、小結
新的Activity Result API提供了一種執行許多常見任務的簡便方法,比如我們調用第三方APP 獲取數據,請求權限、拍照、選圖片、獲取聯系人等等。除此之外,降低了代碼的耦合,減少了樣板代碼(比如,定義requestCode常量)。
另外,startActivityForResult和onActivityResult已經被廢棄,官方也是強烈建議使用這種方式來進行數據傳遞并獲取Activity返回的數據。
總結
以上是生活随笔為你收集整理的Goolgle推荐 onActivityResult的替代方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chart图表
- 下一篇: 源码看JAVA【十】Short