当前位置:   article > 正文

startActivityForResult弃用使用registerForActivityResult()方法的java代码(非kotlin)_registerforactivityresult java

registerforactivityresult java

startActivityForResult()方法如今已经被废弃了,官方推荐的是使用Activity Result API来实现两个Activity之间传递数据功能。其他的不讲,我们单独讲一下数据的回传:

注意1:registerForActivityResult只能在onCreate()中注册。onstart()之后就不能注册了。

注意2:registerForActivityResult()方法不要放在setOnClickListener()里面,要放在onCreate里。

注意3:  一种是在onCreat方法内写,一种是正常写。

下面上代码,以下是不在onCreat方法中写代码:

  1. package com.example.activityparamspass;
  2. import androidx.activity.result.ActivityResult;
  3. import androidx.activity.result.ActivityResultCallback;
  4. import androidx.activity.result.ActivityResultLauncher;
  5. import androidx.activity.result.contract.ActivityResultContracts;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. import android.app.Activity;
  8. import android.content.Intent;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.view.View;
  12. import java.io.Serializable;
  13. public class MainActivity extends AppCompatActivity {
  14. private static final String TAG = "tag";
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. }
  20. //这是一个onclick方法的点击事件
  21. public void jumpToActivity6ForResult(View view) {
  22. Intent intent = new Intent(this, Activity6.class);
  23. Activity6ResultLauncher.launch(intent);
  24. }
  25. //匿名内部类
  26. private ActivityResultLauncher<Intent> Activity6ResultLauncher = registerForActivityResult(
  27. new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
  28. @Override
  29. public void onActivityResult(ActivityResult result) {
  30. //这里写回调的数据接收
  31. if (result.getResultCode() == Activity.RESULT_OK){
  32. Intent intent = result.getData();
  33. if (intent != null) {
  34. String username = intent.getStringExtra("username");
  35. boolean isLogin = intent.getBooleanExtra("isLogin", false);
  36. int age = intent.getIntExtra("age", 0);
  37. Log.d(TAG, "onCreat---------------------------" + username);
  38. Log.d(TAG, "onCreat---------------------------" + isLogin);
  39. Log.d(TAG, "onCreat---------------------------" + age);
  40. }
  41. }
  42. }
  43. }
  44. );
  45. }

我们来讲一下这行代码:

if (result.getResultCode() == Activity.RESULT_OK)
  1. result.getResultCode()
    ActivityResult 对象有一个 getResultCode() 方法,它返回从另一个Activity返回的结果码。结果码是一个整数,用于表示操作的成功或失败,以及可能的其他状态。

  2. Activity.RESULT_OK
    这是一个常量,表示操作已成功完成。它是Android系统预定义的一个结果码,通常用于表示从Activity返回数据时一切正常。

  3. if (result.getResultCode() == Activity.RESULT_OK)
    这个if语句检查返回的结果码是否为 Activity.RESULT_OK。如果是,那么说明从另一个Activity返回的操作是成功的。


Activity6中需要传递数据到MainActity中的代码:

  1. package com.example.activityparamspass;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. public class Activity6 extends AppCompatActivity {
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_6);
  12. }
  13. //这也是一个onClick方法的点击事件
  14. public void jumpToActivityMainActivity(View view) {
  15. Intent intent = new Intent();
  16. intent.putExtra("username","苦逼男大");
  17. intent.putExtra("age",18);
  18. intent.putExtra("isLogin",true);
  19. setResult(Activity.RESULT_OK,intent);
  20. finish();
  21. }
  22. }

我们来讲一下这行代码: 

 setResult(Activity.RESULT_OK,intent);

 这里的Activity.RESULT_OK 是一个常量,通常用于表示操作成功完成,是在设置结果码。

下面是在onCreat方法中写代码,其实和前面一致喜欢用那种看个人习惯,但是onCreat方法有时候写着写着就很臃肿我还是推荐不在onCreat内写,下面上代码:

  1. package com.example.activityparamspass;
  2. import androidx.activity.result.ActivityResult;
  3. import androidx.activity.result.ActivityResultCallback;
  4. import androidx.activity.result.ActivityResultLauncher;
  5. import androidx.activity.result.contract.ActivityResultContracts;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. import android.app.Activity;
  8. import android.content.Intent;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.view.View;
  12. import java.io.Serializable;
  13. public class MainActivity extends AppCompatActivity {
  14. private static final String TAG = "tag";
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. Activity6ResultLauncher = registerForActivityResult(
  20. new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
  21. @Override
  22. public void onActivityResult(ActivityResult result) {
  23. if (result.getResultCode() == Activity.RESULT_OK){
  24. Intent intent = result.getData();
  25. if (intent != null) {
  26. String username = intent.getStringExtra("username");
  27. boolean isLogin = intent.getBooleanExtra("isLogin", false);
  28. int age = intent.getIntExtra("age", 0);
  29. Log.d(TAG, "onCreat---------------------------" + username);
  30. Log.d(TAG, "onCreat---------------------------" + isLogin);
  31. Log.d(TAG, "onCreat---------------------------" + age);
  32. }
  33. }
  34. }
  35. }
  36. );
  37. }
  38. }

代码都没什么区别,以上就完事了,个人觉得这个方法写起来非常方便. 

另外就是Activity Result API中内置的Contract有很多替代后的这个方法就属于其中,有很多很方便的方法,感兴趣的可以自己了解一下.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/886486
推荐阅读
相关标签
  

闽ICP备14008679号