前言📢: 本篇文章实现的是1.实现对Activity生命周期的理解,使用log展示生命周期的状态变化;2.点击recycleview的的某一项点击后跳转到新的 activity1;3.实现最新的activityforresult功能,在activity1可收到activity2的回传值。
1. activity生命周期(主要还是理解,单独放出来)
我们来看一看activity生命周期,activity的生命周期有创建(oncreate)、启动(onstart)、暂停(onpause)、终止(stop)等。我们如何在as里面看到activity的生命周期呢? 重写activity的函数,在有关函数内添加Log.d()语句,在Logcat中使用筛选器,只查看Log.d的内容。 对应的代码如下(itemactivity和resultactivity实现的部分等下展示,先讲activity的生命周期):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item);
Log.d("gcd","这是ItemActivity的oncreate");
}
@Override
protected void onPause() {
super.onPause();
Log.d("gcd","这是ItemActivity的onpause");
}
@Override
protected void onResume() {
super.onResume();
Log.d("gcd","这是ItemActivity的onresume");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("gcd","这是ItemActivity的onDestory");
}
@Override
protected void onStop() {
super.onStop();
Log.d("gcd","这是Itemactivity的stop");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("gcd","这是Itemactivity的restart");
}
@Override
protected void onStart() {
super.onStart();
Log.d("gcd","这是Itemactivity的start");
}
  在运行成功后,使用activity的转跳,点击返回键,就可以观察到,activity的生命周期。这里我们可以发现,跳转过程中,itemactivity跳转到resultactivity时,itemactivity不会destory,而resultactivity跳转到itemactivity时,resultactivity会destory。这是为什么呢?——因为itemactivity是主页,resultactivity不是主页。 接下来,我们来分析核心代码。
2.实现步骤
2.1创建itemactivity.java并实现点击recycleview转跳
先实现点击recycleview的某一项点击后跳转到itemactivity。参考了:https://www.jianshu.com/p/c4cfe38a91ed的内容(进阶篇中的 “点击”) 这里用了第一个方法,在 Adapter 里面直接对控件做点击事件
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(context,ItemActivity.class);
intent.putExtra("age",18);
context.startActivity(intent);
}
});
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(context,ItemActivity.class);
intent.putExtra("name","gcd");
context.startActivity(intent);
}
});
这里使用startactivity可以实现直接转跳到ItemActivity不需要回传数据,点击微信朋友列表,进入朋友的界面。同时,在这个文件Adapter 下是无法直接使用startactivity来转跳的,需要使用context。
2.2编写itemactivity.java、新建编写resultactivity.java
下面是核心功能实现最新的activityforresult功能,在activity1(也就是itemactivity)上添加按钮可收到activity2(也就是resultactivity)的回传值。如:新闻详情页面中点击收藏按钮可显示当前的收藏数量为N。 activity_item.xml中添加一个button,两个textview,实现下图的UI布局。 
在itemactivity.java中添加如下代码,这里解释一下参数,第一个,有一个类叫ActivityResultContract,这是一个抽象类,抽象类不能直接new对象,ActivityResultContracts才是实类;第二个参数,如果getResultCode返回一个925,则获取回传数据,将textview中的内容修改为result.getData().getStringExtra(“result”);
public ActivityResultLauncher test = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>(){
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == 925){
Log.d("gcd","onActivityResultLauncher...");
textView.setText(result.getData().getStringExtra("result"));
}
}
});
我们是写一个方法函数,因为as之前的startActivityForResult现在不用了, 现在要使用接口,这里可以按住CTRL键,击中想要看的函数。 这里我们查看registerForActivityResult,
@Override
public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
@NonNull ActivityResultContract<I, O> contract,
@NonNull ActivityResultCallback<O> callback) {
return registerForActivityResult(contract, mActivityResultRegistry, callback);
}
按照提词器的提示将代码补全就行。 在编写button点击事件,这里解释一下
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(ItemActivity.this,resultActivity.class);
test.launch(intent);
}
});
intent是干嘛的呢?消息传递,在这里就是完成activity之间的消息传递。test.launch()启动intent(ItemActivity与resultActivity之间的消息传递)。 在resultActivity.java中添加如下代码,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
Log.d("gcd","这是activity_result的oncreate");
Intent intent=getIntent();
intent.putExtra("result","这里是郭成都。" + "查看了朋友的详细信息\n"
+ "时间是:" + Calendar.getInstance().getTime());
setResult(925,intent);
}
intent.putExtra()函数第一个参数为键名,第二个参数为键对应的值,值是真正要传递的数据。数据传递给itemActivity,itemActivity怎么获取这个数据(键值对)呢?用get×××Extra()方法,“×××”是数值类型。比如上例中的键值对(“result”,“这里是郭成都。” + “查看了朋友的详细信息\n”+ “时间是:” + Calendar.getInstance().getTime ()),数据类型是String,那么获取这组数据的方法就是getStringExtra();看itemactivity里面,textView.setText(result.getData().getStringExtra(“result”)); setResult(925,intent)对应if (result.getResultCode() == 925);值为925传回数据。
3.运行截图展示
点击微信;  点击列表中的任意一项  点击“朋友信息”  点击上面的返回(back)  查看生命周期的Log.d() 
4.源码仓库地址
到这里就写完啦,下面给出源码仓库地址。 链接: link
参考了:https://www.jianshu.com/p/c4cfe38a91ed的内容(进阶篇中的 “点击”)——大家可以去看这个文章(源码好像点不开但是文章写得很好),可以顺便给这个文章点个赞(老师说对作者有用)。
|