日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Goolgle推荐   onActivityResult的替代方式

發(fā)布時(shí)間:2023/12/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Goolgle推荐   onActivityResult的替代方式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。