前言
本系列实验为移动开发技术课程实验,如有问题欢迎指正!
一、问题陈述
根据移动开发课程内容设计类微信界面:
任务一:掌握Activity的注册;
任务二:掌握Activity的生命周期;
任务三:依托作业一,将recyclerView的每个item增加点击功能,点击后跳转到一个新的view展示信息。
二、开发工具
三、设计流程
1.任务一——掌握Activity的注册
2.任务二——掌握Activity的生命周期
Activity生命周期指Activity从创建到销毁的过程。 Activity表现为四种状态:
活动状态Active:Activity在用户界面中处于最上层,完全能被用户看到,能够与用户进行交互。
暂停状态Pause:Activity在界面上被部分遮挡,不再处于用户界面的最上层,且不能够与用户进行交互。(如弹出消息框)
停止状态Stop:Activity被其他Activity全部遮挡,界面完全不能被用户看到。(如玩游戏时来电了)
非活动状态Dead:Activity没有启动或者被finish()。
创建一个新的Android应用项目,或者使用现有的项目。
在项目中创建两个不同的Activity,例如ActivityA和ActivityB。
在ActivityA中添加代码以在生命周期的各个阶段打印日志信息,例如onCreate、onStart、onResume、onPause、onStop、onDestroy。这可以通过重写这些方法并在其中调用Log.d()来完成。
在ActivityB中重复步骤3,添加相同的生命周期方法的日志信息。
创建一个按钮或其他UI元素,使用户能够从ActivityA跳转到ActivityB。
在按钮的点击事件处理程序中,使用Intent将ActivityA跳转到ActivityB。在跳转之前和之后,可以在ActivityA的生命周期方法中添加Log.d()来记录状态变化。
运行应用程序,并观察Logcat中的输出。将能够看到ActivityA的生命周期状态变化,以及在跳转到ActivityB后的状态变化。
3.任务三——通过Intent,实现Activity之间的跳转
在Activity之间跳转时,通常使用Intent来实现。在验证Activity之间的跳转时,通常需要进行一些条件判断。以下是一个示例代码,演示了如何通过Intent实现Activity之间的跳转验证:
// 启动第二个
Activity Intent intent = new Intent(this, SecondActivity.class); startActivity(intent);
// 在第二个Activity中验证跳转
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 获取传递过来的Intent
Intent intent = getIntent();
// 获取传递的数据,这里假设传递了一个字符串类型的参数
String data = intent.getStringExtra(“data”);
// 进行验证,比如验证传递的数据是否符合要求
if (data != null && data.equals(“valid”)) {
// 如果验证通过,可以执行跳转操作
Intent intentToThirdActivity = new Intent(this, ThirdActivity.class);
startActivity(intentToThirdActivity); }
else {
// 如果验证不通过,可以显示错误提示或者返回到上一个
Activity finish(); } }
在上述代码中,我们首先启动了一个名为SecondActivity的Activity。在该Activity的onCreate方法中,我们获取了传递过来的Intent,并从中获取了传递的数据(这里假设是一个字符串类型的参数)。然后,我们对传递的数据进行验证,如果验证通过,就启动下一个Activity(这里假设是ThirdActivity),否则就结束当前Activity。
Activity间跳转的两种方法,startActivity与startActivityForResult,注意区分使用!
四、代码解析
1.项目文件目录
本次在作业一的基础上,新增了activity_tab5.java及tab5.xml文件,修改了Fragment1.java、MyAdapter.java及item.xml文件
2.layout部分
tab5.xml
放入两个插件textView_Chat和button_return,textView_Chat用来显示点击后界面显示的内容,button_return用来进行返回点击。
<?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=".activity_tab5">
<TextView
android:id="@+id/textView_Chat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Activity_2"
android:textColor="@color/black"
android:textSize="35sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/button_return"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Return"
android:textSize="35sp"
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.315" />
</androidx.constraintlayout.widget.ConstraintLayout>
item.xml
放入两个插件textView1和button_chat,textView1与button_chat构成list列表中的一行,存放显示内容。
<?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="wrap_content">
<TextView
android:id="@+id/textView1"
android:layout_width="270dp"
android:layout_height="75dp"
android:layout_gravity="center"
android:text="TextView"
android:textColor="@color/black"
android:textSize="50sp" />
<Button
android:id="@+id/button_chat"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="进入聊天"
android:textColor="@color/white"
android:textSize="20sp" />
</LinearLayout>
3.Java代码部分
Fragment1.java
import android.content.Context;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;
public class Fragment1 extends Fragment {
View view;
RecyclerView recyclerview;
List<String> list;
MyAdapter adapter;
Context context;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.tab1, container, false);
recyclerview = view.findViewById(R.id.recyclerview);
list = new ArrayList<>();
for (int i = 0; i < 9; i++) {
list.add("shenshen 宝贝" + i );
}
context=view.getContext();
adapter=new MyAdapter(context,list);
recyclerview.setAdapter(adapter);
LinearLayoutManager manager = new LinearLayoutManager(view.getContext());
manager.setOrientation(RecyclerView.VERTICAL);
recyclerview.setLayoutManager(manager);
return view;
}
}
activity_tab5.java
public class activity_tab5 extends AppCompatActivity {
TextView textView;
Button button;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab5);
Log.d("lwy", "chat:onCreate...");//创建日志
textView = findViewById(R.id.textView_Chat);
button = findViewById(R.id.button_return);
//2怎么收消息
Intent intent = getIntent();//不能在new否则是新的
String str2 = "我和" + intent.getExtras().getString("name") + "的聊天界面";
textView.setText(str2);//把消息塞进textview
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}
MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.Myholder> {
Context context1;
List<String> list1;//没有给定节点类型
public MyAdapter(Context context,List list) {
context1=context;
list1=list;
}
//泛型传入=类嵌套 类名<传入类名>
@NonNull
@Override
public Myholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//Inflater,java的真的zip压缩器,不是我们要的
View view=LayoutInflater.from(context1).inflate(R.layout.item,parent,false); //官方压缩器
//inflater返回值是一个view(压缩后的)
Myholder myholder=new Myholder(view);
return myholder;//把每行数据inflater压缩
}
@Override
public void onBindViewHolder(@NonNull Myholder holder, @SuppressLint("RecyclerView") int position) {
holder.textView.setText(list1.get(position));//get也不确定返回类型,list要给定,自动返回string
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//intent:从main跳到chat,mainactivity挂在后台会stop停止
Intent intent=new Intent(context1,activity_tab5.class); //消息封装在intent里面,intent可以理解为一种通讯方法
intent.putExtra("name",list1.get(position));
context1.startActivity(intent);
}
});
}//bind绑定,连接list数据和viewholder(指向行的指针,java没有指针,自定义viewholder的子类因为每行数据类型不确定)
@Override
public int getItemCount() {
return list1.size();
}//数据绑定,list有多少行
public class Myholder extends RecyclerView.ViewHolder{
TextView textView;
Button button;
public Myholder(@NonNull View itemView) {
super(itemView);
textView=itemView.findViewById(R.id.textView1);
button=itemView.findViewById(R.id.button_chat);
}
}//泛型传入viewholder类
}
列表可以进行上下滑动,点击进入聊天后会跳转到下面界面:
点击return后回到第一个联系人列表界面。
六、实验总结
通过本次实验,我学习到以下知识点:
(1)intent的使用
Android提供轻量级的进程间通信机制Intent,使跨进程组件通信和发送系统广播成为可能,组件Activity、Service和BroadcastReceiver都是通过消息机制被启动(激活)的,其使用的消息就封装在对象Intent里。
Context是一个抽象类且为Activity的超类,提供了startActivity()方法,并以Intent对象作为参数,用于实现窗体之间的跳转。
(2)Activity的生命周期
Activity生命周期指Activity从创建到销毁的过程。
Activity表现为四种状态:
活动状态Active:Activity在用户界面中处于最上层,完全能被用户看到,能够与用户进行交互。
暂停状态Pause:Activity在界面上被部分遮挡,不再处于用户界面的最上层,且不能够与用户进行交互。(如弹出消息框)
停止状态Stop:Activity被其他Activity全部遮挡,界面完全不能被用户看到。(如玩游戏时来电了)
非活动状态Dead:Activity没有启动或者被finish()。
(3)验证Activity的生命周期及跳转时查看
在按钮的点击事件处理程序中,使用Intent将ActivityA跳转到ActivityB。在跳转之前和之后,可以在ActivityA的生命周期方法中添加Log.d()来记录状态变化。
(4)Activity间跳转的两种方法,startActivity与startActivityForResult:
在Android中,Activity之间的跳转通常使用两个重要的方法:startActivity和startActivityForResult。它们用于在不同的Activity之间建立通信和传递数据。
startActivity方法用于启动一个新的Activity,并且通常不期望返回结果。这种情况下,调用它的Activity(称为"调用方")会继续执行,而被启动的Activity(称为"目标Activity")将会被放置在调用方的上层。
startActivityForResult方法也用于启动一个新的Activity,但期望在目标Activity完成后返回结果给调用方。这个方法通常用于实现一些需要返回结果的交互,比如选择一个图片或者编辑一些信息。
总结来说,startActivity用于简单的Activity跳转,而startActivityForResult用于在目标Activity执行完特定任务后,将结果返回给调用方。这两种方法在Android开发中经常会用到,根据具体情况选择合适的方法来进行Activity之间的交互。
源码仓库地址:https://gitee.com/zhangy_zxx/android-project.git
reference:https://www.jianshu.com/p/c4cfe38a91ed