赞
踩
startActivityForResult()方法如今已经被废弃了,官方推荐的是使用Activity Result API来实现两个Activity之间传递数据功能。其他的不讲,我们单独讲一下数据的回传:
注意1:registerForActivityResult只能在onCreate()中注册。onstart()之后就不能注册了。
注意2:registerForActivityResult()方法不要放在setOnClickListener()里面,要放在onCreate里。
注意3: 一种是在onCreat方法内写,一种是正常写。
下面上代码,以下是不在onCreat方法中写代码:
- package com.example.activityparamspass;
-
-
- import androidx.activity.result.ActivityResult;
- import androidx.activity.result.ActivityResultCallback;
- import androidx.activity.result.ActivityResultLauncher;
- import androidx.activity.result.contract.ActivityResultContracts;
- import androidx.appcompat.app.AppCompatActivity;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
-
- import java.io.Serializable;
-
- public class MainActivity extends AppCompatActivity {
-
- private static final String TAG = "tag";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
-
- //这是一个onclick方法的点击事件
- public void jumpToActivity6ForResult(View view) {
- Intent intent = new Intent(this, Activity6.class);
-
- Activity6ResultLauncher.launch(intent);
-
- }
-
-
- //匿名内部类
- private ActivityResultLauncher<Intent> Activity6ResultLauncher = registerForActivityResult(
- new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
- @Override
- public void onActivityResult(ActivityResult result) {
- //这里写回调的数据接收
- if (result.getResultCode() == Activity.RESULT_OK){
- Intent intent = result.getData();
- if (intent != null) {
- String username = intent.getStringExtra("username");
- boolean isLogin = intent.getBooleanExtra("isLogin", false);
- int age = intent.getIntExtra("age", 0);
- Log.d(TAG, "onCreat---------------------------" + username);
- Log.d(TAG, "onCreat---------------------------" + isLogin);
- Log.d(TAG, "onCreat---------------------------" + age);
- }
- }
- }
- }
- );
- }
我们来讲一下这行代码:
if (result.getResultCode() == Activity.RESULT_OK)
result.getResultCode():ActivityResult
对象有一个 getResultCode()
方法,它返回从另一个Activity
返回的结果码。结果码是一个整数,用于表示操作的成功或失败,以及可能的其他状态。
Activity.RESULT_OK:
这是一个常量,表示操作已成功完成。它是Android系统预定义的一个结果码,通常用于表示从Activity
返回数据时一切正常。
if (result.getResultCode() == Activity.RESULT_OK):
这个if
语句检查返回的结果码是否为 Activity.RESULT_OK
。如果是,那么说明从另一个Activity
返回的操作是成功的。
Activity6中需要传递数据到MainActity中的代码:
- package com.example.activityparamspass;
-
- import androidx.appcompat.app.AppCompatActivity;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
-
- public class Activity6 extends AppCompatActivity {
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_6);
-
- }
-
- //这也是一个onClick方法的点击事件
- public void jumpToActivityMainActivity(View view) {
- Intent intent = new Intent();
- intent.putExtra("username","苦逼男大");
- intent.putExtra("age",18);
- intent.putExtra("isLogin",true);
- setResult(Activity.RESULT_OK,intent);
- finish();
- }
- }
我们来讲一下这行代码:
setResult(Activity.RESULT_OK,intent);
这里的Activity.RESULT_OK
是一个常量,通常用于表示操作成功完成,是在设置结果码。
下面是在onCreat方法中写代码,其实和前面一致喜欢用那种看个人习惯,但是onCreat方法有时候写着写着就很臃肿我还是推荐不在onCreat内写,下面上代码:
- package com.example.activityparamspass;
-
-
- import androidx.activity.result.ActivityResult;
- import androidx.activity.result.ActivityResultCallback;
- import androidx.activity.result.ActivityResultLauncher;
- import androidx.activity.result.contract.ActivityResultContracts;
- import androidx.appcompat.app.AppCompatActivity;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
-
- import java.io.Serializable;
-
- public class MainActivity extends AppCompatActivity {
-
- private static final String TAG = "tag";
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Activity6ResultLauncher = registerForActivityResult(
- new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
- @Override
- public void onActivityResult(ActivityResult result) {
- if (result.getResultCode() == Activity.RESULT_OK){
- Intent intent = result.getData();
- if (intent != null) {
- String username = intent.getStringExtra("username");
- boolean isLogin = intent.getBooleanExtra("isLogin", false);
- int age = intent.getIntExtra("age", 0);
- Log.d(TAG, "onCreat---------------------------" + username);
- Log.d(TAG, "onCreat---------------------------" + isLogin);
- Log.d(TAG, "onCreat---------------------------" + age);
- }
- }
- }
- }
- );
- }
- }
代码都没什么区别,以上就完事了,个人觉得这个方法写起来非常方便.
另外就是Activity Result API中内置的Contract有很多替代后的这个方法就属于其中,有很多很方便的方法,感兴趣的可以自己了解一下.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。