前言
一、Activity
Activity
代表应用程序的单个屏幕,用户可以使用该屏幕执行单一、集中的任务,Activity 通常以全屏窗口的形式呈现给用户;- Activity 是一个,单个用户任务的单个屏幕;
- 每个 Activity 都有自己的布局文件;
- 可以为 Activity 分配父子关系,以在应用程序中启用向上导航;
- 一个应用程序通常由多个彼此松散的屏幕组成。每个屏幕都是一个 Activity;
- 应用程序中有一个
主Activity
(MainActivity.java),在应用程序启动时呈现给用户;通过主Activity
可以启动其他 Activity 来执行不同的操作; - 每次启动新活动,前一个 Activity 都会停止,但系统会将该 Activity 保留在堆栈中;当新 Activity 启动时,该新 Activity 被推入后台堆栈并获取用户焦点;当用户完成当前 Activity 并按下后退按钮时,该 Activity 将从堆栈中弹出并销毁,并恢复上一个 Activity;
- Activity 是有意图地开始或激活的。
Intent
是一条异步消息,可以在 Activity 中使用它来请求来自另一个 Activity 或某个其他应用程序组件的操作;可以使用 Intent 从一个 Activity 启动另一个 Activity,并在 Activity 之前传递数据;
二、Intent
- 允许从应用程序中的另一个请求操作。例如,从另一个组件启动一个 Activity;
- 显示 Intent:可以指示接收数据的特定目标组件;
- Intent 附加信息是 Bundle,键值对;
三、需求
- 创建并构建两个 Activity(
Activity1
和Activity2
); Activity1
作为主 Activity,主要包含一个 “发送” 按钮,当用户点击此按钮将使用Intent
来启动Activity2
;
- 主 Activity 中添加 EditText,用户输入消息,并点击发送按钮,主 Activity 使用 Intent 来启动第二个 Activity 并将用户的消息发送到第二个 Activity,第二个 Activity 显示它接收到的消息
- 第二个 Activity 添加 EditText 和回复按钮;用户键入回复消息并点击回复按钮,使用 Intent 将回复消息从第二个 Activity 传递给主 Activity,并显示;
四、代码实现
- 创建第一个Activity 布局
// activity_main.xml(主Activity)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginRight="16dp"
android:textColor="@android:color/background_dark"
android:layout_marginBottom="16dp"
android:onClick="launchSecondActivity"
android:text="@string/button_main" />
<EditText
android:id="@+id/editText_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="32dp"
android:layout_marginLeft="32dp"
android:layout_marginBottom="19dp"
android:ems="10"
android:inputType="text"
android:text="Name" />
</RelativeLayout>
- 创建第二个Activity 布局
// 第二个Activity
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".SecondActivity">
<TextView
android:id="@+id/text_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:text="@string/text_header"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="60dp"
android:layout_marginTop="40dp"
android:text=""
android:textAppearance="AppCompat.Medium"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_header" />
</androidx.constraintlayout.widget.ConstraintLayout>
- 主 Activity 添加 Intent
public void launchSecondActivity(View view) {
// 将显示Intent添加到主Activity,Intent用于单击发送按钮时激活第二个Activity
// 参数1:应用程序Context和将接收该Intent的特定组件
// 当点击发送按钮时,MainActivity发送Intent并启动第二个Activity 出现在屏幕
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
}
}
- 从主 Activity 发送数据到第二个 Activity
- 使用 Intent 将数据从一个 Activity 发送到另一个 Activity
- Intent 传递数据到目标 Activity 的方式
- 1)数据字段:Intent 数据指要操作的特定数据的 URl
- 2)Intent 附加信息,如果传递的数据不是 URl 或想要发送多条信息,可以将附加信息
extras
中。 - Intent 附加信息内容是
Bundle
。Bundle 是数据,存储形式为; - 从一个 Activity 传递信息到另一个 Activity,可以将键和值放入发送 Activity 的 Intent extra 中,然后在接收 Activity 中将它们取出;
Bundle 中包含其他数据,本需求中为用户输入的字符串
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = MainActivity.class.getSimpleName();
public static final String EXTRA_MESSAGE = "com.example.myapplication.extra.MESSAGE";
private EditText mMessageEditText;
public static final int TEXT_REQUEST = 1; // 第二个Activity回复响应的键
private TextView mReplyHeadTextView; // 回复标头Textview
private TextView mReplyTextView; // 回复TextView元素
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 指定一个视图
mMessageEditText = findViewById(R.id.editText_main); // 使用findViewById()获取对 EditText 的引用
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
}
public void launchSecondActivity(View view) {
// 将显示Intent添加到主Activity,Intent用于单击发送按钮时激活第二个Activity
// 参数1:应用程序Context和将接收该Intent的特定组件
// 当点击发送按钮时,MainActivity发送Intent并启动第二个Activity 出现在屏幕
Intent intent = new Intent(this, SecondActivity.class);
String message = mMessageEditText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivityForResult(intent, TEXT_REQUEST);
}
@Override
// 回调方法
// requestCode:请求
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// 处理返回数据
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TEXT_REQUEST) {
if (requestCode == RESULT_OK) {
String reply =
data.getStringExtra(SecondActivity.EXTRA_REPLY);
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(reply);
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
}
- 将数据从第二个 Activity 返回给主 Activity
startActivity():使用显式 Intent 启动另一个 Activity 时,不会期望返回任何数据,只是激活该 Activity;
如果想从激活的 Activity 中获取数据,则需要以 startActivityForResult() 启动它
public class SecondActivity extends AppCompatActivity {
public static final String EXTRA_REPLY = "com.example.myapplication.extra.REPLY";
private EditText mReply;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mReply = findViewById(R.id.editText_second);
// 获取激活此Activit的Intent
Intent intent = getIntent();
// 获取Intent extra中包含的字符串
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
// 获取要显示的控件的引用
TextView textView = findViewById(R.id.text_message);
// 通过引用在此控件上显示获取Intent extra中包含的字符串
textView.setText(message);
}
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
finish();
}
}