一.实验环境:
Windows系统,Android Studio
二.界面功能
1.实现对Activity生命周期的理解,使用log展示生命周期的状态变化
2.增加列表项的单项点击功能,点击“联系录”界面的item可以弹出另一个itemactivity
3.实现最新的activityforresult功能,点击itemactivity中的button按钮可以收到resultactivity的返回值
三.界面设计代码
1.activity_item
点击“查看当前时间按钮”即可在下方“返回信息”处显示当前的时间信息
<?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">
<TextView
android:id="@+id/itemtextView1"
android:layout_width="188dp"
android:layout_height="47dp"
android:text="详情页面"
android:textAlignment="center"
android:textSize="34sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.56"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.175" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="132dp"
android:text="查看当前时间"
android:textSize="34sp"
app:iconPadding="15sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.554"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/itemtextView1" />
<TextView
android:id="@+id/itemtextView2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="32sp"
android:layout_marginRight="32sp"
android:text="返回信息"
android:textAlignment="textStart"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.668" />
</androidx.constraintlayout.widget.ConstraintLayout>
设置后的效果界面如下
2.itemActivity
作为点击recycleview后跳转的activity
package com.example.work2;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
public class ItemActivity extends AppCompatActivity {
private Button button;
private TextView textView;
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item);
textView = findViewById(R.id.itemtextView2);
button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ItemActivity.this,resultActivity.class);
test.launch(intent);
}
});
}
public ActivityResultLauncher test = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>(){
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == 2){
Log.d("xr","onActivityResultLauncher...");
textView.setText(result.getData().getStringExtra("result"));
}
}
});
}
3.resultActivity
实现点击button按钮后的返回值接收功能
package com.example.work2;
import static java.util.Calendar.*;
import android.content.Intent;
import android.icu.text.SimpleDateFormat;
import android.os.Bundle;
import android.security.FileIntegrityManager;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class resultActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
Intent intent = getIntent();
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
intent.putExtra("result","现在的时间是:"+ getInstance().getTime());
setResult(2,intent);
finish();
}
}
4.Adapter
在Adapter文件中的BindViewHolder函数中对recycleView的item添加点击监听,并创建bundle,intent,通过intent将bundle传给已创建好的新的activity中。
四.关于activity的周期
Activity 在生命周期中共存在三个状态,这三个状态如下:
1) 运行态
指 Activity 运行于屏幕的最上层并且获得了用户焦点。
2) 暂停态
指当前 Activity 依然存在,但是没有获得用户焦点。
在其之上有其他的 Activity 处于运行态,但是由于处于运行态的 Activity 没有遮挡住整个屏幕,当前 Activity 有一部分视图可以被用户看见。处于暂停态的 Activity 保留了自己所使用的内存和用户信息,但是在系统极度缺乏资源的情况下,有可能会被杀死以释放资源。
3) 停止态
指当前 Activity 完全被处于运行态的 Activity 遮挡住,其用户界面完全不能被用户看见。
处于停止态的 Activity 依然存活,也保留了自己所使用的内存和用户信息,但是一旦系统缺乏资源,停止态的 Activity 就会被杀死以释放资源。
activity的回调方法有以下7种:
1.onCreate(Bundle savedInstanceState)
2.onStart()
3.onResume()
4.onPause()
5.onStop()
6.onRestart()
7.onDestroy()
启动 Activity:在这个阶段依次执行 3 个生命周期方法:onCreate、onStart 和 onResume。
Activity 失去焦点:如果在 Activity 获得焦点的情况下进入其他的 Activity 或应用程序,这时当前的 Activity 会失去焦点。在这一阶段,会依次执行 onPause 和 onStop 方法。
Activity 重获焦点:如果 Activity 重新获得焦点,会依次执行 3 个生命周期方法:onRestart、onStart 和 onResume。
关闭 Activity:当 Activity 被关闭时,系统会依次执行 3 个生命周期方法:onPause、onStop 和 onDestroy。
五.运行结果展示
点击recycleview后的界面
点击“查看当前时间”按钮后的界面
六 .实验小结
在本次实验中,实现了各个activity之间的转换,对activity的生命周期更加了解,也通过activityforresult功能实现了用button来传值,在实验中我也遇到了很多困难。
比如在进行result中要加入finish函数才可以结束activity,从而产生回传值;对于intent中的key和resultcode一开始并没有弄清楚,导致回传值一直出不来;
对于itemActivity的onCreate函数,一开始我将onCreate打成了OnCreate,所以导致了点击recycleview后弹出的界面为空白界面;
在设置回传值的时间时,一开始我使用了calendar类和date类时,显示的时间总是GMT时间,和系统时间相差8小时,在经过网络上的搜索过后也尝试了很多方法,但最后发现加入了TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));语句后就可以正常显示了。(改时区的方法我试过不知道为什么没用,电脑的时区也是正确的,可能是注册表的问题)
源码地址附在最后:安卓仓库: 安卓作业仓库,存放源码 (gitee.com)