onActivityResult已废弃,快来看看更好用的Ac
大家更新了SDK后,应该都发现了之前用的很多的startActivityForResult和onActivityResult方法已经声明已废弃了,在查看源码后,我们可以看到onActivityResult方法上声明了Deprecated,建议我们使用ActivityResultAPI来代替{inheritDoc}deprecatedThismethodhasbeendeprecatedinfavorofusingtheActivityResultAPIwhichbringsincreasedtypesafetyviaan{linkActivityResultContract}andtheprebuiltcontractsforcommonintentsavailablein{linkandroidx。activity。result。contract。ActivityResultContracts},provideshooksfortesting,andallowreceivingresultsinseparate,testableclassesindependentfromyouractivity。Use{linkregisterForActivityResult(ActivityResultContract,ActivityResultCallback)}passingina{linkStartActivityForResult}objectforthe{linkActivityResultContract}。OverrideDeprecatedpublicvoidstartActivityForResult(SuppressLint(UnknownNullness)Intentintent,intrequestCode){super。startActivityForResult(intent,requestCode);}{inheritDoc}deprecatedThismethodhasbeendeprecatedinfavorofusingtheActivityResultAPIwhichbringsincreasedtypesafetyviaan{linkActivityResultContract}andtheprebuiltcontractsforcommonintentsavailablein{linkandroidx。activity。result。contract。ActivityResultContracts},provideshooksfortesting,andallowreceivingresultsinseparate,testableclassesindependentfromyouractivity。Use{linkregisterForActivityResult(ActivityResultContract,ActivityResultCallback)}withtheappropriate{linkActivityResultContract}andhandlingtheresultinthe{linkActivityResultCallbackonActivityResult(Object)callback}。CallSuperOverrideDeprecatedprotectedvoidonActivityResult(intrequestCode,intresultCode,NullableIntentdata){if(!mActivityResultRegistry。dispatchResult(requestCode,resultCode,data)){super。onActivityResult(requestCode,resultCode,data);}}
我们可以直接使用registerForActivityResult来代替startActivityForResultlateinitvaractivityResultLauncher:ActivityResultLauncherIntentoverridefunonCreate(savedInstanceState:Bundle?){super。onCreate(savedInstanceState)activityResultLauncherregisterForActivityResult(ActivityResultContracts。StartActivityForResult()){处理回调}跳转页面activityResultLauncher。launch(Intent(this,SecondActivity::class。java))}
但是这种方法有个弊端,如果我们有多个页面跳转的话,我们无法在同一个activityResultLauncher的回调中判断是来自哪一个的回调,因为缺少了requestCode,这时候我们只能通过注册多个来解决这个问题,这样不是比之前更麻烦了么,有没有更好的办法呢?NonNullOverridepublicfinalI,OActivityResultLauncherIregisterForActivityResult(NonNullfinalActivityResultContractI,Ocontract,NonNullfinalActivityResultRegistryregistry,NonNullfinalActivityResultCallbackOcallback){returnregistry。register(activityrqmNextLocalRequestCode。getAndIncrement(),this,contract,callback);}NonNullOverridepublicfinalI,OActivityResultLauncherIregisterForActivityResult(NonNullActivityResultContractI,Ocontract,NonNullActivityResultCallbackOcallback){returnregisterForActivityResult(contract,mActivityResultRegistry,callback);}
我们继续看源码发现,registerForActivityResult其实是调用ActivityResultRegistry来注册的,而ActivityResultRegistry我们是可以直接获取到的,我们可以自己封装一下privatevalrequestCodeAtomicInteger()privatevalkey:Stringget()activityrq{requestCode。getAndIncrement()}valactivityContractsActivityResultContracts。StartActivityForResult()suspendfunI,OComponentActivity。launch(contract:ActivityResultContractI,O,input:I):O{varcaller:ActivityResultLauncherI?nullreturnsuspendCancellableCoroutineO{continuationcalleractivityResultRegistry。register(key,contract){continuation。resume(it)}。apply{launch(input)}}。also{caller?。unregister()callernull}}funI,OComponentActivity。launch(contract:ActivityResultContractI,O,input:I,output:ActivityResultCallbackO){varcaller:ActivityResultLauncherI?nullcalleractivityResultRegistry。register(key,contract){output。onActivityResult(it)caller?。unregister()callernull}。apply{launch(input)}}启动activity获取返回值funComponentActivity。launchActivityForResult(intent:Intent,output:ActivityResultCallback)launch(activityContracts,intent,output)
使用方法如下正常使用launchActivityForResult(Intent(this,SecondActivity::class。java)){处理回调}在协程中使用lifecycleScope。launch{valactivityResultlaunch(contractactivityContracts,inputIntent(thisMainActivity,SecondActivity::class。java))处理回调}
看起来是不是简洁很多了,而且代码逻辑也清晰不少。
ActivityResultContracts中,除了StartActivityForResult外,还内置了一些常用的RequestPermission:单个权限请求RequestMultiplePermissions:多个权限请求TakePicturePreview:拍照预览TakePicture:拍照TakeVideo:摄像PickContact:选择联系人GetContent:获取文件的UriGetMultipleContents:获取多个文件的UriOpenDocument:打开文件OpenMultipleDocuments:打开多个文件OpenDocumentTree:打开文件夹CreateDocument:创建文件
欧冠首轮小组赛!主场迎战苦主拜仁,巴萨能否避免一场大溃败?在国际比赛日结束之后,欧洲五大联赛和欧冠联赛都将重燃战火,其中欧冠联赛将迎来首轮小组赛,在之前的分组情况出炉之后,球迷大呼过瘾纷纷表示电影都拍不出这样的桥段,多支有着无数看点的球队
要想学好武术,必须练好哪些基本功?现今传统武术的境况,不太好,绝大多数习练者,只有科普的水平,没有实在的学术功底。什么叫科普水平呢?比如社会上的科学爱好者,也能谈霍金,谈爱因斯坦,谈相对论,读过lt时间简史gtlt
为什么比特币之类的数字货币,明显是规则制定者们做出来的陷阱,还这么多人趋之若鹜呢?因为都没你这么聪明跟当初炒作兰花郁金香一样人们都认为自己不会是那最后一个人你开个道场,给迷茫的大众,布什下你的智慧。怎么明显怎么就是陷阱了?你看过比特币的白皮书吗?你搞懂区块链是啥
华为手机和电脑之间怎样互传照片?感谢邀请。发现更多精彩功能,请访问玩机技巧应用。经过一段时间的发展,手机和电脑之间图片的互相传输成为一种非常必要的条件。目前手机和电脑进行交互的方式主要有四种。第一种方案是手机连接
七岁半孩子门牙在牙龈中半年,一直长不出来是怎么回事?医生,我女儿门牙都掉了一年了,还没长出来,这可怎么办咯?小美的妈妈焦急地问。7岁的小美的上门牙去年就掉了,但是该换出来的恒牙像害羞的小姑娘,犹抱琵琶半遮面,近在咫尺,却又迟迟不露面
kindle值得买吗?用途多吗?你不会因为买了一个kindle而爱上看书,如果你本身不看书,那它最大的作用就是盖方便面。不如5块钱的盘子实惠。但是如果你本身很爱看书,那就挺好用,买最简单的背光款就好,可以在睡前,
酒驾检察院不起诉就算无罪吗?你好,这种说法是不准确的。检察院的不起诉有三种法定的不起诉(绝对不起诉),是指没有犯罪事实或者行为不属于犯罪或者法律规定不追究,这种不起诉决定是绝对的无罪。酌定的不起诉(相对不起诉
占坑式辩护受争议,法律援助律师应当何时指派如何履职?首先说下现在法援在什么时候介入,除未成年人以及一些涉及死刑的重犯,在侦查阶段提供法援服务外,基本都是在法院审判阶段才派法援律师。其实已经错过了最佳辩护时间!起诉书已经起诉要再来提证
怎样腌制酸黄瓜呢?我家腌制酸黄瓜的方法是,鲜嫩黄瓜3斤,洗净切成条形,过一下开水捞出冲凉,沥干水分,放进容器里,根据自己的口味放白糖,水塔陈醋,食用盐,鲜姜片,大蒜,一个红辣椒,喜欢吃果香味的可以放
黄瓜配什么炒好吃?黄瓜是很常见的蔬菜,它富含多种对人体有益的营养成分,味道清香,可以和很多种食材搭配制作出美味的菜肴,做法有很多种,但都不算困难,大家多动手尝试制作几次就可以熟练掌握下面我分享一下我
不出去打工的农民,一般有哪些收入?我们这边不出去打工的农民很多,有做养殖行业的,有承包土地干种植的,还有做小本生意的,还有一部分年轻人在家玩大型机械挣钱的,这些活都是些头脑灵活,不怕吃苦受累,有上进心努力奋斗的人去