《Android Studio开发实战》学习(七)- Activities之间的消息通讯
- 背景
- 使用Intent传递消息
- 布局文件的编写
- 代码文件的编写
- 运行结果
背景
在这里继续学习Android Studio 4.1.3的使用方法,编写一个聊天工具 1,实现两个Activity之间的跳转和消息通讯。现在想要设计一个包括两个页面的聊天工具,每个页面包括一个输入框EditText、一个按钮Button和一个文本视图TextView,实现第一个页面在输入框中输入一句文字,然后点击按钮,就跳转到第二个页面,并且在第二个页面的文本视图中显示第一个页面输入框中的文字和发送时间。在第二个页面的输入框中输入一句文字,然后点击按钮,就回到第一个页面,并且在文本视图中显示输入的文字。
使用Intent传递消息
在Android Studio中可以建立多个Activity页面,它们之间消息的传递是通过Intent实现的。setClass()方法用于指定来源类与目标类名,第一个参数是发送信息的Activity,第二个参数是收取信息的Activity。putExtra()方法用于传递参数。startActivity()方法用于请求数据的发送,startActivityForResult()方法用于还要处理目标页面应答数据的情况。
Intent intent = new Intent();
intent.setClass(MainActivity.this, ActResponseActivity.class);
intent.putExtra("request_time", getNowTime());
intent.putExtra("request_content", et_request.getText().toString());
startActivityForResult(intent, 0);
在目标页面,要接收前一个页面发送过来的数据,使用Bundle类的getExtras()方法。
Bundle bundle = getIntent().getExtras();
String request_time = bundle.getString("request_time");
String request_content = bundle.getString("request_content");
布局文件的编写
第一个页面的布局文件layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/guideline_1"
app:layout_constraintGuide_percent=".20"
android:orientation="horizontal"/>
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/guideline_2"
app:layout_constraintGuide_percent=".30"
android:orientation="horizontal"/>
<EditText
android:id="@+id/et_request"
android:layout_width="0dp"
android:layout_height="0dp"
android:inputType="text"
android:singleLine="true"
android:textSize="18sp"
android:textColor="@color/black"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@+id/guideline_1"/>
<Button
android:id="@+id/btn_request"
android:layout_width="170dp"
android:layout_height="0dp"
android:layout_gravity="center"
android:text="Show"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline_1"
app:layout_constraintBottom_toBottomOf="@+id/guideline_2" />
<TextView
android:id="@+id/tv_request"
android:layout_width="0dp"
android:layout_height="0dp"
android:gravity="left|top"
android:scrollbars="vertical"
android:textSize="18sp"
android:textColor="@color/black"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline_2"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
- 心得:ConstraintLayout中的辅助线和layout_width、layout_height可以混合使用,比如这里button控件的上边和下边用了辅助线限制
app:layout_constraintTop_toTopOf="@+id/guideline_1"
app:layout_constraintBottom_toBottomOf="@+id/guideline_2"
而左边和右边用了layout_width参数限制:
android:layout_width="170dp"
如图所示:
第二个页面的布局文件layout/activity_response.xml
<?xml version="1.0" encoding="utf-8"?>
<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=".Response">
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/guideline_1"
app:layout_constraintGuide_percent=".20"
android:orientation="horizontal"/>
<androidx.constraintlayout.widget.Guideline
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/guideline_2"
app:layout_constraintGuide_percent=".30"
android:orientation="horizontal"/>
<EditText
android:id="@+id/et_response"
android:layout_width="0dp"
android:layout_height="0dp"
android:inputType="text"
android:singleLine="true"
android:textSize="18sp"
android:textColor="@color/black"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="@+id/guideline_1"/>
<Button
android:id="@+id/btn_response"
android:layout_width="170dp"
android:layout_height="0dp"
android:layout_gravity="center"
android:text="Show"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline_1"
app:layout_constraintBottom_toBottomOf="@+id/guideline_2" />
<TextView
android:id="@+id/tv_response"
android:layout_width="0dp"
android:layout_height="0dp"
android:gravity="left|top"
android:scrollbars="vertical"
android:textSize="18sp"
android:textColor="@color/black"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/guideline_2"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
控件的摆放与第一个Activity完全一样,但是控件的名称不同。严格意义上说,控件的名称也可以相同,但是就没有意义了 2。
代码文件的编写
第一个页面的代码文件MainActivity.java
package com.example.activitycommunication;
import androidx.appcompat.app.AppCompatActivity;
import android.text.method.ScrollingMovementMethod;
import android.widget.*;
import android.os.Bundle;
import android.view.View;
import android.view.View.*;
import android.content.Intent;
import java.util.*;
import java.text.SimpleDateFormat;
public class MainActivity extends AppCompatActivity {
private EditText et_request;
private Button btn_request;
private TextView tv_request;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_request = (EditText) findViewById(R.id.et_request);
tv_request = (TextView) findViewById(R.id.tv_request);
tv_request.setMovementMethod(new ScrollingMovementMethod());
btn_request = (Button) findViewById(R.id.btn_request);
btn_request.setOnClickListener(new ClickTAction());
}
private class ClickTAction implements OnClickListener {
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_request) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, Response.class);
intent.putExtra("request_time", getNowTime());
intent.putExtra("request_content", et_request.getText().toString());
startActivityForResult(intent, 0);
}
}
}
private String getNowTime() {
SimpleDateFormat s = new SimpleDateFormat("HH:mm:ss");
return s.format(new Date());
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
String response_time = data.getStringExtra("response_time");
String response_content = data.getStringExtra("response_content");
String desc = String.format("收到返回消息:\n返回时间为:%s\n返回内容为:%s\n", response_time, response_content);
tv_request.setText(tv_request.getText() + desc);
}
}
}
第二个页面的代码文件Response.java
package com.example.activitycommunication;
import androidx.appcompat.app.AppCompatActivity;
import android.text.method.ScrollingMovementMethod;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Response extends AppCompatActivity {
private EditText et_response;
private TextView tv_response;
private Button btn_response;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_response);
et_response = (EditText) findViewById(R.id.et_response);
tv_response = (TextView) findViewById(R.id.tv_response);
tv_response.setMovementMethod(new ScrollingMovementMethod());
btn_response = (Button) findViewById(R.id.btn_response);
Bundle bundle = getIntent().getExtras();
String request_time = bundle.getString("request_time");
String request_content = bundle.getString("request_content");
String desc = String.format("收到请求消息:\n请求时间为:%s\n请求内容为:%s\n", request_time, request_content);
tv_response.setText(tv_response.getText() + desc);
btn_response.setOnClickListener(new ClickTAction());
}
private class ClickTAction implements View.OnClickListener {
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_response) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("response_time", getNowTime());
bundle.putString("response_content", et_response.getText().toString());
intent.putExtras(bundle);
setResult(Activity.RESULT_OK, intent);
finish();
}
}
}
private String getNowTime() {
SimpleDateFormat s = new SimpleDateFormat("HH:mm:ss");
return s.format(new Date());
}
}
运行结果
按之前探索的方法 [^3]生成apk文件,然后传输到手机上运行,结果如下:
- 欧阳燊. Android Studio开发实战. 清华大学出版社. 2017. ↩︎
- 《Android Studio开发实战》学习(一)- Hello World_