Activity的生命周期与跳转
一、项目整体说明
设计目标
1.实现对Activity生命周期的理解,使用log展示生命周期的状态变化;
2.在上一个项目的基础上,新建一个Activity1,实现Activity之间的跳转。
3.实现最新的Activityforresult功能,新建一个Activity2,在Activity1上收到activity2的回传值。
使用技术
1.Activity生命周期
1.1 onCreate()
在首次创建Activity时调用。系统向此方法传递一个Bundle对象,其中包含Activity的上一状态,之后会调用onStart方法。
1.2 onStart()
在Activity即将对用户可见之前调用。而后如果Activity转入了前台就会调用onResume方法。
1.3 onResume()
在Activity即将开始与用户进行交互之前调用。此时,Activity处于Activity堆栈的顶层,并具有用户输入焦点。当跳转另一个Activity,或者退出当前Activity后会调用onPause方法。
1.4 onPause()
在系统即将开始继续另一个Activity时调用,之后正常情况下会调用onStop方法。
1.5 onStop()
在Activity对用户不再可见时调用,之后如果Activity恢复与用户的交互,则会调用onRestart方法,如果Activity被销毁,则会调用onDestroy方法。
1.6 onRestart()
在Activity被停止后再次启动时调用,而后会调用onStart方法。
1.7 onDestroy()
在Activity被销毁前调用,这是Activity收到的最后调用。当Activity结束,或系统为节省空间而暂时销毁该Activity实例时,可能会调用它。
2.Intent启动Activity
在一个主界面通过Intent跳转到不同的Activity
3.Activityforresult
利用下一个activity给当前的activity传值
运行环境
计算机型号:小新 15IIL 2020
处理器:Intel® Core™ i7-1065G7 CPU @ 1.30GHz 1.50 GHz
机带RAM:8.00 GB (7.78 GB 可用)
操作系统:Windows 10 家庭中文版
编译器:Android Studio Dolphin | 2021.3.1
二、功能说明及代码解析
1.实现Activity之间的跳转
以聊天页面为例实现点击聊天框进入聊天页面
MainActivity2(聊天页面)
在java目录下新建一个Empty Activity组件命名为MainActivity2,使用自动生成的布局名称
activity_main2界面设计(layout文件)
<?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=".MainActivity2">
<TextView
android:id="@+id/textView6"
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:textSize="30dp"
android:background="#D0D0D0"
android:textColor="@color/black"
android:text="昵称" />
<TextView
android:id="@+id/textView7"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:background="@drawable/line"
android:layout_weight="1"
android:gravity="center"
android:text="没有聊天记录"
android:textSize="24dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/textView8"
android:layout_width="326dp"
android:layout_height="match_parent"
android:background="@drawable/underline"
android:paddingLeft="15dp"
android:paddingTop="15dp"
android:paddingRight="10dp"
android:paddingBottom="10dp"
android:text="请输入内容"
android:textSize="25dp" />
<Button
android:id="@+id/btn_send"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="#D0D0D0"
android:text="发送"
android:textColor="@color/white"
android:textSize="24sp"
tools:ignore="TextContrastCheck" />
</LinearLayout>
</LinearLayout>
代码中使用到的边框文件设计如下:
在drawable中新建一个line.xml文件
相关代码
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 边框颜色值 -->
<item>
<shape>
<solid android:color="@color/black" />
</shape>
</item>
<!-- 主体背景颜色值 -->
<item
android:bottom="1dp"><!--设置只有底部和右边有边框-->
<shape>
<solid android:color="@color/white" />
</shape>
</item>
</layer-list>
设置完成后组件和效果图如下
相关java文件编写(RecyclerAdapter文件续写)
首先在MyViewHolder中新绑定item_dome中的LinearLayout控件,先定义控件及名称,后用findViewById()方法绑定,即添加下列语句
LinearLayout linearLayout;//定义控件
linearLayout = itemView.findViewById(R.id.linearLayout);//绑定控件
接下来在onBindViewHolder() 下为消息列表的单项绑定点击事件,实现跳转功能,即在之前项目的onBindViewHolder() 中添加如下内容
holder.linearLayout.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent(context,MainActivity2.class);
intent.putExtra("name",list.get(position).get("昵称").toString());
context.startActivity(intent);
}
});
2.使用log展现生命周期的状态变化
相关代码编写
在MainActivity2的java文件中添加如下代码
@Override
protected void onPostResume() {
super.onPostResume();
log.d("life","activity2 is onPostResume...");
}
@Override
protected void onStart() {
super.onStart();
log.d("life", "activity2 is onStart...");
}
@Override
protected void onRestart() {
super.onRestart();
log.d("life","activity2 is onRestart...");
}
@Override
protected void onStop() {
super.onStop();
log.d("life","activity2 is onStop...");
}
@Override
protected void onDestroy() {
super.onDestroy();
log.d("life","activity2 is onDestroy...");
}
@Override
public void finish(){
super.finish();
log.d("life","activity2 is finish...");
}
@Override
public void finishActivity(int requestCode){
super.finishActivity(requestCode);
log.d("life","finishActivity2...");
}
实现状态展示
可点击run查看
下图为单击消息栏后跳到聊天页面的生命周期状态变化
下图为点击发送获取消息的生命周期状态变化
下图为点击返回后显示的生命周期状态变化
3.实现最新的Activityforresult功能
点击发送显示具体发送内容,实现Activity间回传值
MainActivity3(具体发送消息页面)
在java目录下新建一个Empty Activity组件命名为MainActivity3,使用自动生成的布局名称
activity_main3界面设计(layout文件)
<?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=".MainActivity3">
</androidx.constraintlayout.widget.ConstraintLayout>
相关java文件编写
调用ActivityResultLauncher的launch方法实现页面内跳转到另一个Activity,在MainActivity2中续写相关代码如下
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
log.d("life","activity2 is onCreate...");
Toast.makeText(this, "activity2 is onCreate...", Toast.LENGTH_SHORT).show();
TextView textView6=findViewById(R.id.textView6);
Intent intent = getIntent();
String name = intent.getStringExtra("name");
textView6.setText(name);
btn_send = findViewById(R.id.btn_send);
btn_send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent1 = new Intent(MainActivity2.this,MainActivity3.class);
test.launch(intent1);
}
});
}
public ActivityResultLauncher test = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if(result.getResultCode() == 999){
TextView textView8 = findViewById(R.id.textView8);
textView8.setText(result.getData().getStringExtra("msg"));
}
}
});
在MainActivity3的java文件中添加如下代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
Intent intent = getIntent();
intent.putExtra("msg","哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈");
//给intent赋值后返回MainActivity2
//自己设置的数字,和MainActivity2中保持一致
setResult(999,intent);
finish();//结束生命周期
三、遇到的问题及解决方法
1.配置完成后无法进入界面发生闪退
解决方法:对照logcat中找相关问题,发现linearlayout控件定义后忘记绑定,绑定后成功运行
四、运行结果展示
gif图片压缩后有失真/掉帧现象,正常运行流畅
五、clone地址
gitee地址无效请直接搜索https://gitee.com/waiaiy/android.git