2-2. 活动(Activity)

1.Activity间的数据交换

1-1.向下一个活动传递数据

思路:intent提供putExtra()方法,可以把我们想要传递的数据暂存在Intent中,启动另一个活动后,将数据从intent中取出

  1. 发送数据(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);  //启动活动
            }
        });
    }
  1. 接收数据(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

  1. 在A中:startActivityForResult(intent,1)传递请求码
复制代码
...
       @Override
            public void onClick(View v) {
                Intent intent =new Intent(MainActivity.this,MainActivity2.class);
                startActivityForResult(intent,1);   //跳转时携带请求码
            }
...
  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();
    }

  1. 在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.启动模式的配置

  1. 在AndroidManifest.xml中使用launchMode属性配置启动方式
  2. 查看任务栈的方法

在控制台窗口输入
adb shell dumpsys activity | findstr '包名'

3.活动的最佳实践

3-1.知晓当前是哪一个活动

  1. 创建baseActivity类,继承AppCompatActivity

包->New->JavaClass->弹框输入BaseActivity

  1. 在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");
posted @   禾耳  阅读(271)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示