1.设计目标

ep2是承接ep1的内容,在第二个页面使用recyclerview,在前次作业的基础上增加列表项的单项点击功能。
具体要求是:

  • 新建一个新的activity1,recycleview的某一项点击后跳转到这个新的activity1。如:点击新闻列表会跳转到新闻详情页面;
  • 实现最新的activityforresult功能,具体要求如下:新建一个新的activity2,在activity1上添加按钮可收到activity2的回传值。如:新闻详情页面中点击收藏按钮可显示当前的收藏数量为N。

1、请根据课程内容实现对Activity生命周期的理解,使用log展示生命周期的状态变化;

当页面被启动时依次触发onCreate-> onStart->onResume

按home键使得activity进入后台后触发onPause->onStop,关闭后台程序时触发onDestory。

onCreate()

它会在系统首次创建 Activity 时触发。Activity 会在创建后进入“已创建”状态。在 onCreate() 方法执行基本应用启动逻辑,该逻辑在 Activity 的整个生命周期中只应发生一次。

onStart()

当 Activity 进入“已开始”状态时,系统会调用此回调。onStart() 调用使 Activity 对用户可见,因为应用会为 Activity 进入前台并支持互动做准备。例如,应用通过此方法来初始化维护界面的代码。
当 Activity 进入已开始状态时,与 Activity 生命周期相关联的所有生命周期感知型组件都将收到 ON_START 事件。

onResume()

Activity 会在进入“已恢复”状态时来到前台,然后系统调用 onResume() 回调。这是应用与用户互动的状态。应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一个 Activity,或设备屏幕关闭。
当发生中断事件时,Activity 进入“已暂停”状态,系统调用 onPause() 回调。

onPause()

系统将此方法视为用户将要离开您的 Activity 的第一个标志(尽管这并不总是意味着 Activity 会被销毁);此方法表示 Activity 不再位于前台(尽管在用户处于多窗口模式时 Activity 仍然可见)。使用 onPause() 方法暂停或调整当 Activity 处于“已暂停”状态时不应继续(或应有节制地继续)的操作,以及您希望很快恢复的操作。

onStop()

如果您的 Activity 不再对用户可见,说明其已进入“已停止”状态,因此系统将调用 onStop() 回调。例如,当新启动的 Activity 覆盖整个屏幕时,可能会发生这种情况。如果 Activity 已结束运行并即将终止,系统还可以调用 onStop()。
当 Activity 进入已停止状态时,与 Activity 生命周期相关联的所有生命周期感知型组件都将收到 ON_STOP 事件。这时,生命周期组件可以停止在组件未显示在屏幕上时无需运行的任何功能。
在 onStop() 方法中,应用应释放或调整在应用对用户不可见时的无用资源。例如,应用可以暂停动画效果,或从精确位置更新切换到粗略位置更新。使用 onStop() 而非 onPause() 可确保与界面相关的工作继续进行,即使用户在多窗口模式下查看您的 Activity 也能如此。

onDestroy()

销毁 Activity 之前,系统会先调用 onDestroy()。系统调用此回调的原因如下:

  • Activity 即将结束(由于用户彻底关闭 Activity 或由于系统为 Activity 调用 finish()),或者
  • 由于配置变更(例如设备旋转或多窗口模式),系统暂时销毁 Activity

当 Activity 进入已销毁状态时,与 Activity 生命周期相关联的所有生命周期感知型组件都将收到 ON_DESTROY 事件。这时,生命周期组件可以在 Activity 被销毁之前清理所需的任何数据。

2.功能说明

功能演示

具体功能的实现和解析放入代码解析部分中详解。

3.代码解析

主要文件以及页面布局:

itemActivity.java

recyclerview点击后进行跳转到达的页面,控制下一步跳转,以及result内容的接收及展示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.example.myclass;

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;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class itemActivity extends AppCompatActivity {

private Button button;
private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item);
Log.d("dolly>","on create.........");
if(getSupportActionBar()!=null){getSupportActionBar().hide();}
textView=findViewById(R.id.textView7);
button=findViewById(R.id.buttoncall);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(itemActivity.this,CallbackActivity.class);
test.launch(intent);
}
});
}

public ActivityResultLauncher test= registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {

@Override
public void onActivityResult(ActivityResult result) {
if(result.getResultCode()==200){
Log.d("dolly","onActivityResult called back....");
textView.setText(result.getData().getStringExtra("data"));

};
}
});

@Override
protected void onStart() {
super.onStart();
Log.d("dolly>","on start.........");
}

@Override
protected void onStop() {
super.onStop();
Log.d("dolly>","on stop.........");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d("dolly>","on destroy.........");
}

@Override
protected void onPause() {
super.onPause();
Log.d("dolly>","on pause.........");
}

@Override
protected void onResume() {
super.onResume();
Log.d("dolly>","on resume.........");
}

@Override
protected void onRestart() {
super.onRestart();
Log.d("dolly>","on restart.........");
}

}

activity_item.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?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=".itemActivity">

<include
android:id="@+id/include3"
layout="@layout/top"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />

<Button
android:id="@+id/buttoncall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="419dp"
android:text="@string/click_for_return"
android:textColor="#757575"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView6"
app:layout_constraintVertical_bias="0.98" />

<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="dialing........"
android:textSize="35sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/include3"
app:layout_constraintVertical_bias="0.146" />

<TextView
android:id="@+id/textView7"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:layout_marginEnd="32dp"
android:text="Onchange content"
android:textSize="35sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.529"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/buttoncall"
app:layout_constraintVertical_bias="0.385" />
</androidx.constraintlayout.widget.ConstraintLayout>

Adapter.java

在Adapter里面直接对RecyclerView控件做点击事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package com.example.myclass;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {

private View itemview;
private List<String> list;
private Context context;

public Adapter(Context context) {
this.context = context;
}


@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
itemview = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_list1, parent, false);

return new ViewHolder(itemview);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.textView1.setText("" + position);
holder.textView2.setText(list.get(position));
holder.textView2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent(context,itemActivity.class);
context.startActivity(intent);
}
});
}

@Override
public int getItemCount() {
return list.size();
}

public void list(List<String> list) {
this.list = list;
}

public static class ViewHolder extends RecyclerView.ViewHolder {
private TextView textView1, textView2;
private ImageView imageView_item1;
private LinearLayout linearLayout_item1;

public ViewHolder(@NonNull View itemView) {
super(itemView);
textView1 = itemView.findViewById(R.id.textView_item1);
textView2 = itemView.findViewById(R.id.textView_item2);
imageView_item1 = itemView.findViewById(R.id.imageView_item1);
linearLayout_item1 = itemView.findViewById(R.id.linearLayout_item1);
}
}


}

CallbackAcitvity.java

实现最新的activityforresult功能用于创建回传值传到itemActivity,Calendar函数获取当前时间,finish()用于关闭页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.example.myclass;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.icu.util.Calendar;
import android.os.Bundle;

public class CallbackActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_callback);
Intent intent =getIntent();
intent.putExtra("data","Call back for time.\n"+
Calendar.getInstance().getTime());
setResult(200,intent);
finish();
}
}

4.源码仓库地址

https://github.com/Dear-Doll/My-Work-ep1/tree/master