既然可以传递数据给下一个Activity,自然也可以返回数据给上一个Activity。返回上一个Activity时只需要点击back键就好,并没有一个用于启动Activity的Intent来传递数据,那怎么实现传递数据给上一个Activtiy呢?
数据回传举例:插入图片:从相册或者相机获取图片显示到备忘录。
其实Android是使用任务来管理Activity的,一个任务就是一组存放在栈里的Activity的集合,这个栈也被称作返回栈(back stack)。栈是一种后进先出的数据结构,在默认情况下,每当启动一个新的Activity,就会在返回栈中入栈,并处于栈顶的位置。每当按下返回键(back)或者调用finish()方法去销毁一个Activity时,处于栈顶的Activity就会出栈,前一个入栈的Activity就会重新处于栈顶的位置。
总结:每启动一个新的Activity就会覆盖在原Activity之上,点击Back键会销毁最上面的Activity,下面的一个Activity就会显示出来。
Activity类中还有一个用于启动Activity的startActivityForResult()方法,它期望在Activity销毁的时候能够返回一个结果给上一个Activity。
1.创建MainActivity和SingInActivity
我们在SingInActivity中输入账号和密码,按下返回按钮后使其在MainActivity中显示出来。
2.代码实现
activity_main.xml:就是一个跳转到SingInAvtivity的按钮和用于显示返回信息的TextView
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/recharge" android:layout_margin="30dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="注册!" /> <TextView android:id="@+id/result_text" android:textSize="23dp" android:layout_margin="30dp" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
activity_singin.xml:只是放了两个用于输入信息的EditText
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".SingInActivity"> <EditText android:id="@+id/user" android:layout_margin="30dp" android:hint="账号" android:layout_width="match_parent" android:layout_height="wrap_content"/> <EditText android:id="@+id/password" android:inputType="textPassword" android:layout_margin="30dp" android:hint="密码" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
MainActivity:
package com.java.androidstudy; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private Button recharge; private TextView result_text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); recharge.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SingInActivity.class); startActivityForResult(intent,1); //请求码是用来在onActivityResult()中判断数据的来源。也可以是别的数 //使用该方法启动的SingInActivity,在SingInActivity销毁后会调用onActivityResult()方法。我们重写该方法在这里接收返回过来的数据,并显示出来。 } }); } private void initView(){ recharge = findViewById(R.id.recharge); result_text = findViewById(R.id.result_text); } @Override //请求码,处理结果,返回的数据 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode ==1){ //如果请求码为1 if(resultCode ==RESULT_OK){ //下一个Activity返回的结果为RESULT_OK,则接收数据并显示出来 String user = data.getStringExtra("user"); String password = data.getStringExtra("password"); result_text.setText("账号:"+user+" 密码:"+password); } } } }
SingInActivity:
package com.java.androidstudy; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.MenuItem; import android.widget.EditText; import android.widget.Toast; public class SingInActivity extends AppCompatActivity { private EditText user; private EditText password; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_singin); initView(); //将左上角的返回图标显示出来 ActionBar actionBar = getSupportActionBar(); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); } private void initView(){ user = findViewById(R.id.user); password = findViewById(R.id.password); } @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()){ case android.R.id.home: //左上角返回图标点击事件 Intent intent = new Intent(); //还是用Intent传递数据,这里用的是Intent的空参构造器,不需要指定跳转的界面,因为按下返回按钮会返回到上一个Activity. intent.putExtra("user",user.getText().toString()); intent.putExtra("password",password.getText().toString()); setResult(RESULT_OK,intent);//使用该方法向上一个Activity返回数据。第一个参数是处理结果,第二个参数是将带有数据的intent传递回去。 finish(); } return super.onOptionsItemSelected(item); } }
运行效果:
这样就完成了数据的回传。