icode icode
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

iqqcode

保持对技术的探索实践与热爱
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础内容

  • AndroidCore

    • Activity

      • Activity概况
      • Activity基础
      • Button点击事件的几种实现方式
      • Activity之间的跳转
      • 一个APP拉起另一个APP
      • Activity其他属性
      • Activity启动模式
      • Activity生命周期
      • Activity 是被压入后台,还是跳转到新的 Activity
        • Activity其他操作
      • BroadcastReceiver

      • ContentProvider

      • Android-Service

      • Intent

    • Android UI

    • Components

    • Fragment

    • 网络操作

    • 异步机制

    • 数据存储

    • 学习笔记

    • 自定义View

    • View事件体系

    • Android
    • AndroidCore
    • Activity
    iqqcode
    2021-06-17
    目录

    Activity 是被压入后台,还是跳转到新的 Activity

    当一个activity进入onStop()时,如何得知时由于用户点击了主页键,还是由于进入了另一个本程序的activity?

    # 基本原理和思路

    由于设计两个activity的跳转,所以我们应该去考虑多个activity的生命周期回调函数顺序。查阅并测试可知,当进行activity跳转时,先执行原来activity的onPause()和,然后执行第二个activity的onCreate()、onStart()、onResume(),再执行第一个activity的onStop。如图所示,红色是第一个activity的回调函数执行,蓝色是第二个。

    activity_lifecycle

    我们可以利用这个特点,通过一个static变量来记录当前run的activity数量,当这个数量为0的时候,即程序被压入后台,当这个数量不为0,则表明当前执行了一个跳转操作

    # 代码实现

    # 4.1 BaseActivity类

    首先新建一个BaseActivity类,声明一个static变量,让别的activity全部继承。并在onStart()和onStop()中修改count。

    public class BaseActivity extends AppCompatActivity {
        static int count = 0;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
        @Override
        protected void onStart() {
            count++;
            super.onStart();
        }
        @Override
        protected void onStop() {
            count--;
            super.onStop();
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    # 4.2 MainActivity类

    创建MainActivity类,继承自BaseActivity类,同时修改onStop(),检查count的值,判断此次导致onStop()的原因。我在这个activity中添加了一个button用于跳转到第二个activity。

    public class MainActivity extends BaseActivity implements View.OnClickListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button = findViewById(R.id.button);
            button.setOnClickListener(this);
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Toast toast;
            if (count == 0){
                toast = Toast.makeText(getApplicationContext(), "程序进入后台", Toast.LENGTH_SHORT);
            }else {
                toast = Toast.makeText(getApplicationContext(), "程序进入第二个活动", Toast.LENGTH_SHORT);
            }
            toast.show();
        }
        
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    }
    
    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

    # 4.3 SecondActivity类

    这个类很简单,没有什么功能,只是跳转过来后,执行基类的onCreate()方法。

    public class SecondActivity extends BaseActivity  {
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
        }
    }
    
    1
    2
    3
    4
    5
    6
    7

    # 五、总结

    至此,我们便实现了通过activity生命周期回调函数判断是否被压入后台。不过,后来学长针对我的这种方式提出了漏洞——当引用外部SDK,且外部SDK中可以弹出未继承我们自定义的base基类的activity,那么怎么处理这种情况呢?这里就要用到安卓SDK提供的全局生命周期类了——Application.registerActivityLifecycleCallbaks,这里我们之后再谈。

    编辑 (opens new window)
    上次更新: 2022/03/27, 22:58:50
    Activity生命周期
    Activity其他操作

    ← Activity生命周期 Activity其他操作→

    最近更新
    01
    匿名内部类
    10-08
    02
    函数式接口
    10-08
    03
    ARouter-Kotlin踩坑
    10-05
    更多文章>
    Theme by Vdoing | Copyright © 2021-2023 iqqcode | MIT License | 备案号-京ICP备2021028793号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×