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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Goolgle推荐   onActivityResult的替代方式

發布時間:2023/12/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的替代方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。