一、启停活动界面
1.Activity的启动与结束
从当前页跳到新页面,跳转代码如下:
startActivity(new Intent(源页面.this,目标页面.class));
从当前页面回到上一个页面,相当于关闭当前页面,返回代码如下:
finish();//结束当前活动页面
例子:
activity_act_satrt.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_back"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@mipmap/ic_back"/>
<Button
android:id="@+id/btn_finish"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="完成" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="按返回键,或者点击左上角的箭头图标,或者点击上面的完成按钮,均可关闭当前界面、返回上个页面" />
</LinearLayout>
Java代码:
public class ActStartActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_start);
findViewById(R.id.btn_act_next).setOnClickListener(this);
}
@Override
public void onClick(View v) {
startActivity(new Intent(this,ActFinishActivity.class));
}
}
activity_act_finish.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<Button
android:id="@+id/btn_act_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="跳到下一个界面"/>
</LinearLayout>
ActFinishActivity:
public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_finish);
findViewById(R.id.iv_back).setOnClickListener(this);
findViewById(R.id.btn_finish).setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId()==R.id.iv_back||v.getId()==R.id.btn_finish){
//结束当前活动页面
finish();
}
}
}
记得改注册表。
2.Activity的生命周期
onCreate:创建活动。把页面布局加载进内存,进入了初始状态。
onStart:开始活动。把活动页面显示在屏幕上,进入了就绪状态。
onResume:恢复活动。活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等等。
onPause:暂停活动。页面进入暂停状态,无法与用户正常交互。
onStop:停止活动。页面将不在屏幕上显示。
onDestroy:销毁活动。回收活动占用的系统资源,把页面从内存中清除。
onRestart:重启活动。重新加载内存中的页面数据。
onNewIntent:重用已有的活动实例。
打开新页面的方法调用顺序为“
onCreate->onStart->onResume
关闭旧页面的方法调用顺序为:
onPause->onStop->onDestroy
3.Activity的启动模式
某APP先后打开两个活动,此时活动栈的变动情况如图所示。
依次结束已打开的两个活动,此时活动栈的变动情况如下图。
在Java代码里面设置启动模式:
Intent.FLAG_ACTIVITY_NEW_TASK:开辟一个新的任务栈
Intent.FLAG_ACTIVITY_SINGLE_TOP:当栈顶为待跳转的活动实例之时,则重用栈顶的实例
Intent.FLAG_ACTIVITY_CLEAR_TOP:当栈中存在待跳转的活动实例时,则重新创建一个新实例,并清除原实例上方的所有实例
Intent.FLAG_ACTIVITY_NO_HISTORY:栈中不保存新启动的活动实例
Intent.FLAG_ACTIVITY_CLEAR_TASK:跳转到新页面时,栈中的原有实例都被清空
二、在活动之间传递消息
1.显示Intent和隐式Intent
Intent是各组件之间信息沟通的桥梁,它用于Android各组件之间的通信,主要完成下列工作:
- 标明本次通信请求从哪里来、到哪里去、要怎么走。
- 发起方携带本次通信需要的数据内容,接收方从收到的意图解析数据
- 发起方若想判断接收方的处理结果,意图就要负责让接收方传回应答的数据内容。
Intent的组成成分:
(1)显示Intent
显示Intent,直接指定来源活动与目标活动,属于精确匹配,它的三种构建模式: - 在Intent的构造函数中构造
Intent intent = new Intent(this, ActNextActivity.class); // 创建一个目标确定的意图
- 调用意图对象的setClass方法指定
Intent intent = new Intent(); // 创建一个新意图
intent.setClass(this, ActNextActivity.class); // 设置意图要跳转的目标活动
- 调用意图对象的setComponent方法指定。
Intent intent = new Intent(); // 创建一个新意图
// 创建包含目标活动在内的组件名称对象
ComponentName component = new ComponentName(this, ActNextActivity.class);
intent.setComponent(component); // 设置意图携带的组件信息
(2)隐式Intent
隐式Intent,没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,
属于模糊匹配。动作名称既可以通过setAction方法指定,也可以通过构造函数Intent(Str
ing action)直接生成意图对象
常见系统动作:
2.向下一个Activity发送数据(A->B)
Intent使用Bundle对象存放待传递的数据信息
Bundle对象操作各类型数据的读写方法说明见下表:
3.向上一个Activity返回数据
- 上一个页面打包好请求数据,调用startActivityForResult方法执行跳转动作
- 下一个页面接收并解析请求数据,进行相应处理
- 下一个页面在返回上一个页面时,打包应答数据并调用setResult方法返回数据包裹
- 下一个页面在返回上一个页面时,打包应答数据并调用setResult方法并返回数据包裹
- 上一个页面重写方法onActivityResult,解析获得下一个页面的返回数据
例子:
public class ActRequestActivity extends AppCompatActivity implements View.OnClickListener {
private String mRequest="哈哈哈";
private ActivityResultLauncher<Intent> register;
private TextView tv_response;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_request);
TextView tv_request =findViewById(R.id.tv_request);
tv_request.setText("待发消息为"+mRequest);
tv_response = findViewById(R.id.tv_response);
findViewById(R.id.btn_request).setOnClickListener(this);
register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result!=null){
Intent intent=result.getData();
if (intent!=null&&result.getResultCode()== Activity.RESULT_OK){
Bundle bundle= intent.getExtras();
String response_time=bundle.getString("response_time");
String response_content=bundle.getString("response_content");
String desc=String.format("接收请求消息:\n应答时间为%s\n应答内容为%s",response_time,response_content);
//把返回消息的详情显示在文本视图上
tv_response.setText(desc);
}
}
}
});
}
@Override
public void onClick(View v) {
Intent intent=new Intent(this,ActResponseActivity.class);
//创建一个新包裹
Bundle bundle=new Bundle();
bundle.putString("request_time", DataUtil.getNowTime());
bundle.putString("request_content",mRequest);
intent.putExtras(bundle);
startActivity(intent);
register.launch(intent);
}
}
public class ActResponseActivity extends AppCompatActivity implements View.OnClickListener {
private static final String mReponse="嘻嘻!";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_response);
TextView tv_request=findViewById(R.id.tv_request);
//从上一个页面传来的意图中获取快递包裹
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",request_time,request_content);
//把请求消息的详情显示在文本视图上
tv_request.setText(desc);
findViewById(R.id.btn_response).setOnClickListener(this);
TextView tv_response=findViewById(R.id.tv_response);
tv_response.setText("待返回的消息为:"+mReponse);
}
@Override
public void onClick(View v) {
Intent intent=new Intent();
//创建一个新包裹
Bundle bundle=new Bundle();
bundle.putString("response_time", DataUtil.getNowTime());
bundle.putString("response_content",mReponse);
intent.putExtras(bundle);
//携带意图返回上一个页面。Result_OK表示处理成功
setResult(Activity.RESULT_OK,intent);
//结束当前界面
finish();
}
}
三、为活动补充附加信息
1.利用资源文件配置字符串
public class ReadStringActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_read_string);
TextView tv_resouce=findViewById(R.id.tv_resource);
String value=getString(R.string.weather_str);
tv_resouce.setText(value);
}
}
把内容写在Strings.xml里面不需要重新编译
2.利用元数据传递配置信息
适用于需要第三方SDK,例如微信登录。
步骤:
调用getPackageManager方法获得当前应用的包管理器;
调用包管理器的getActivityInfo方法获得当前活动的信息对象;
活动信息对象的metaData是Bundle包裹类型,调用包裹对象的getString即可获得指
定名称的参数值。