2-2. 活动(Activity)
1.Activity间的数据交换
1-1.向下一个活动传递数据
思路:intent提供putExtra()方法,可以把我们想要传递的数据暂存在Intent中,启动另一个活动后,将数据从intent中取出
- 发送数据(MainActivity2组件发送数据)
intent.putExtra("标识名",数据);
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); //创建活动
setContentView(R.layout.activity_main2); //设置活动视图
Button button=(Button) findViewById(R.id.Btn1); //通过id获取按钮
button.setOnClickListener(new View.OnClickListener() { //设置按钮点击事件
@Override
public void onClick(View v) {
String data="TestTest"; //创建发送的数据
Intent intent=new Intent(MainActivity2.this,MainActivity3.class); //创建intent
intent.putExtra("extra_data",data); //给跳转活动传递数据
startActivity(intent); //启动活动
}
});
}
- 接收数据(MainActivity3接收数据)
getIntent()
获取启动的intent;getStringExtra("extra_data");
接收传递的参数;(整型:getStringExtra();布尔型:getBooleanExtra()依次类推)
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
Intent intent=getIntent(); //获取启动的intent
String data=https://www.cnblogs.com/lanhaicode/p/10320097.htmlintent.getStringExtra("extra_data"); //接收传递的参数
Log.d("ok:",data); //打印查看数据
}
1-2.返回数据给上一个活动
startActivityForResult() 在活动销毁之前返回一个结果给上一个活动;
A启动另一个Activity B,B返回数据给A
- 在A中:startActivityForResult(intent,1)传递请求码
...
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,MainActivity2.class);
startActivityForResult(intent,1); //跳转时携带请求码
}
...
- 在B中:setResult()方法接收两个参数
//按钮跳转
...
@Override
public void onClick(View v) {
//2.发送数据
Intent intent = new Intent();
intent.putExtra("data_return","hello world");
setResult(RESULT_OK,intent); //在销毁之前关闭活动
finish();
}
...
//使用back返回跳转时
//按返回按钮的函数
@Override
public void onBackPressed( ) {
Intent intent=new Intent();
intent.putExtra("data_return","hello world");
setResult(RESULT_OK,intent); //在销毁之前关闭活动
finish();
}
- 在A中 重写onActivityResult方法返回数据
//requestCode 传入的请求码;resultCode 返回数据的处理结果;data 携带返回的数据intent
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (resultCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("MainActivity", returnedData);
}
break;
default:
}
}
}
2.活动的启动模式
根据特定需求为活动指定恰当的启动模式。启动模式:standard、singleTop、singleTask和singleInstance。
在AndroidManifest.xml中给标签指定android:launchMode属性选择启动模式。
2-1.standard
standard模式下每当启动一个新的活动,他就会在返回栈中入栈,处于栈顶位置,不会复用栈。跳转到自身活动时不会复用栈。
Button button=(Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(MainActivity.this,MainActivity.class); //跳转到自身活动
startActivity(intent);
}
按back键还是回到自身活动,直到栈顶
2-2.singleTop
判断当前栈顶是否有Activity,如果没有新建一个正常入栈,如果有直接复用栈顶的Activity,不新建Activity
- D跳到D此时复用栈顶的D
2-3.singleTask
每次启动该活动时系统首先会返回栈中检查是否存在该活动的实例,如果发现已经存在则使用该实例,并把这个活动之上的所有活动都出栈(清空);如果没有则正常入栈,点击返回直接退出程序。
- 未点击前
- 点击后
2-4.singleInstance
如果发现任务栈有该Activity,直接复用,不新建;如果没有则新开辟一个栈,新建该Acrivity入栈,专门盛放该Activity独享一个任务栈。再次出现新Activity时会存放在第一个任务栈中。
- 开辟栈后
2-5.启动模式的配置
- 在AndroidManifest.xml中使用launchMode属性配置启动方式
- 查看任务栈的方法
在控制台窗口输入
adb shell dumpsys activity | findstr '包名'
3.活动的最佳实践
3-1.知晓当前是哪一个活动
- 创建baseActivity类,继承AppCompatActivity
包->New->JavaClass->弹框输入BaseActivity
- 在onCreate()方法中获取当前实例的类名,通过log打印
代码
package com.example.oneapp;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
//1.创建BaseActivity类
public class BaseActivity extends AppCompatActivity {
//2.在onCreate()方法中获取当前实例的类名,通过log打印
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("baseActivity",getClass().getSimpleName());
}
}
3-2.随时退出程序
思路:通过专门的集合类(List)进行暂存活动,然后提供addActivity()向List添加活动,提供removeActivity向list移除活动,最后提供一个finishAll()方法用于将List中存储的活动全部销毁。
3-2-1.新建一个类ActivityCollector作为活动管理器
public class ActivityCollector {
public static ArrayList<Activity> activities=new ArrayList<>();
public static void addActivity(Activity activity)
{
activities.add(activity);
}
public static void removeActivity(Activity activity)
{
activities.remove(activity);
}
public static void finishAll()
{
for(Activity activity:activities)
{
if(!activity.isFinishing())
{
activity.finish();
}
}
}
}
3-2-2. 在BaseActivity中加入方法
onCreate方法中加入
ActivityCollector.addActivity(this);
onDestroy中加入
ActivityCollector.removeActivity(this);
...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this); //添加
}
// 移除活动
@Override
protected void onDestroy( ) {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
...
3-2-3.随时调用 退出程序
ActivityCollector.finishAll();
android.os.Process.killProcess(android.os.Process.myPid()); //杀死自己进程
3-3.启动活动的最佳写法
思路:在活动中封装actionStart()方法,此方法完成了intent的构建,在活动使用时直接调用
3-3-1.定义方法
//Context context:当前活动名;String data1:数据1;String data2:数据2
public static void actionStart(Context context,String data1,String data2)
{
Intent intent=new Intent(context,Secondactivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}
3-3-2.调用方法
Secondactivity.actionStart(FIrstActivity.this,"data1","data2");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程