Goolgle推荐 onActivityResult的替代方式
Goolgle推薦? ?onActivityResult的替代方式
1、Activity Results API
Activity Results API 是 Google官方推薦的Activity、Fragment獲取返回結(jié)果的方式。
Activity Results API 到底怎么用?相比onActivityResult有哪些優(yōu)勢(shì)?接下來(lái),將一一為你解答。
在介紹如何使用之前,先為大家介紹Activity Results API 中兩個(gè)重要的組件:
ActivityResultContract和ActivityResultLauncher。
- ActivityResultContract: 協(xié)議,它定義了如何傳遞數(shù)據(jù)和如何處理返回的數(shù)據(jù)。ActivityResultContract是一個(gè)抽象類,你需要繼承它來(lái)創(chuàng)建自己的協(xié)議,每個(gè) ActivityResultContract 都需要定義輸入和輸出類,如果您不需要任何輸入,可使用 Void
- ActivityResultLauncher: 啟動(dòng)器,調(diào)用ActivityResultLauncher的launch方法來(lái)啟動(dòng)頁(yè)面跳轉(zhuǎn),作用相當(dāng)于原來(lái)的startActivity()
2、使用 Activity Results API 獲取Activity返回的結(jié)果
在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是輸出的類型。需要實(shí)現(xiàn)2個(gè)方法,createIntent和parseResult,輸入類型I作為createIntent的參數(shù),輸出類型O作為parseResult方法的返回值
public class MyActivityResultContract extends ActivityResultContract<String,Integer>{@NonNull@Overridepublic Intent createIntent(@NonNull Context context, String input) {//Intent 跳轉(zhuǎn)到其它頁(yè)面,可攜帶參數(shù)return null;}@Overridepublic Integer parseResult(int resultCode, @Nullable Intent intent) {//獲取返回?cái)?shù)據(jù)的resultreturn null;}}注冊(cè)MyActivityResultContract,registerForActivityResult方法,得到返回值A(chǔ)ctivityResultLauncher的對(duì)象launcher,通過(guò)launcher跳轉(zhuǎn)
3、為了方便使用,google給出預(yù)定義了很多Contract來(lái)使用
-
StartActivityForResult: 通用的Contract,不做任何轉(zhuǎn)換,Intent作為輸入,ActivityResult作為輸出,這也是最常用的一個(gè)協(xié)定。
-
RequestMultiplePermissions:用于請(qǐng)求一組權(quán)限
-
RequestPermission: 用于請(qǐng)求單個(gè)權(quán)限
-
TakePicturePreview: 調(diào)用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值為Bitmap圖片
-
TakePicture: 調(diào)用MediaStore.ACTION_IMAGE_CAPTURE拍照,并將圖片保存到給定的Uri地址,返回true表示保存成功。
-
TakeVideo: 調(diào)用MediaStore.ACTION_VIDEO_CAPTURE 拍攝視頻,保存到給定的Uri地址,返回一張縮略圖。
-
PickContact: 從通訊錄APP獲取聯(lián)系人
-
GetContent: 提示用選擇一條內(nèi)容,返回一個(gè)通過(guò)ContentResolver#openInputStream(Uri)訪問(wèn)原生數(shù)據(jù)的Uri地址(content://形式) 。默認(rèn)情況下,它增加了Intent#CATEGORY_OPENABLE, 返回可以表示流的內(nèi)容。
-
CreateDocument: 提示用戶選擇一個(gè)文檔,返回一個(gè)(file:/http:/content:)開(kāi)頭的Uri。
-
OpenMultipleDocuments: 提示用戶選擇文檔(可以選擇多個(gè)),分別返回它們的Uri,以List的形式。
-
OpenDocumentTree: 提示用戶選擇一個(gè)目錄,并返回用戶選擇的作為一個(gè)Uri返回,應(yīng)用程序可以完全管理返回目錄中的文檔。
通過(guò)registerForActivityResult進(jìn)行注冊(cè),下面給出兩個(gè)例子作為演示:一個(gè)是正常的數(shù)據(jù)回傳,一個(gè)是運(yùn)行時(shí)權(quán)限的申請(qǐng)
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、小結(jié)
新的Activity Result API提供了一種執(zhí)行許多常見(jiàn)任務(wù)的簡(jiǎn)便方法,比如我們調(diào)用第三方APP 獲取數(shù)據(jù),請(qǐng)求權(quán)限、拍照、選圖片、獲取聯(lián)系人等等。除此之外,降低了代碼的耦合,減少了樣板代碼(比如,定義requestCode常量)。
另外,startActivityForResult和onActivityResult已經(jīng)被廢棄,官方也是強(qiáng)烈建議使用這種方式來(lái)進(jìn)行數(shù)據(jù)傳遞并獲取Activity返回的數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的Goolgle推荐 onActivityResult的替代方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: chart图表
- 下一篇: 源码看JAVA【十】Short