您好,登录后才能下订单哦!
这篇文章主要介绍“怎么使用Android registerForActivityResult实现两个Activity间数据传递”,在日常操作中,相信很多人在怎么使用Android registerForActivityResult实现两个Activity间数据传递问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用Android registerForActivityResult实现两个Activity间数据传递”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
今天在做项目的时候,遇到了需要打开文件管理中某个文件夹的需求,在网上看到一个大佬是这样写的:
private void openMusic(){ Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary:Music"); Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri); startActivityForResult(intent, 1); }
本想着借鉴过来直接使用,但是IDE上清晰的 startActivityForResult,让我觉得应该仔细研究一下这个方法了。
在以前,我们经常会遇到启动一个 Activity,并从中获取数据的需求,此外还有一些常见的场景是调用系统相机、调用相册获取照片、调用通讯录等。通常的做法就是使用 Intent 携带数据,之后将 Intent 和请求码传入 startActivityForResult
方法来启动下一个Activity
startActivityForResult(intent,1)
最终在 onActivityResult
方法中来接收返回的数据。实现 onActivityResult 方法
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 1 && resultCode == Activity.RESULT_OK){ // 处理带回的数据 } }
但是随着应用的开发 onActivityResult 回调方法难以解耦复用,后期维护困难。于是Google推出Activity Results API
Activity Results API 是 Google官方推荐的Activity、Fragment获取数据的方式。它有两个主要的用途:
取代 startActivityForResult 方法,去启动Activity并返回结果
取代 requestPermissions 方法,去请求运行时权限
在 AppCompatActivity 或者 Fragment 中使用 registerForActivityResult() 方法来代替 startActivityForResult() (Android api29中使用startActivityForResult提示已过时,应该变成registerForActivityResult)。该方法接收两个参数并返回ActivityResultLauncher。其中两个参数一个是ActivityResultContract,一个是ActivityResultCallback。最终使用 activityResultLauncher 调用launch(...)
启动目标Activity。
ActivityResultLauncher
用于启动另一个 Activity
ActivityResultContract
这是一个协议类,它的两个泛型分别表示启动参数的类型和返回结果的类型。可以通过继承的方式来自定义 ActivityResultContract
ActivityResultCallback
是单一方法接口,内部只有 onActivityResult 这一个方法,可以接受ActivityResultContract 中定义的输出类型的对象
registerForActivityResult部分源码
ActivityResultCallback部分源码
下面实现一个最基本的小例子,首先我在 MainActivity 的 onCreate 方法中,进行如下实现
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK) { //获取返回的结果 String data = result.getData().getStringExtra("data"); Log.d(TAG, "onCreate: " + data); Toast.makeText(this, data, Toast.LENGTH_SHORT).show(); } }); Button button1 = findViewById(R.id.button_2); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); activityResultLauncher.launch(intent); } }); }
之后我在 SecondActivity 的 onCreate 方法中,进行如下实现
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_2); Intent intent = new Intent(); intent.putExtra("data", "这是回调的数据"); setResult(RESULT_OK, intent); finish(); }
需要注意的是:
registerForActivityResult只能在onCreate()中注册,不然在使用的时候会报异常
java.lang.IllegalStateException: LifecycleOwner com.yxf.extensions.MainActivity@f8e47f4 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.
到此,关于“怎么使用Android registerForActivityResult实现两个Activity间数据传递”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。