当前位置:   article > 正文

如何得知当前 Activity 是被压入后台,还是跳转到新的 Activity?

判断activity是否后台

code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群

作者:邱穆
链接:https://www.jianshu.com/p/47900765a33b
声明:本文已获邱穆授权发表,转发等请联系原作者授权

一、问题来源

最近学习安卓开发activity的生命周期,对单个活动的生命周期较为熟悉。此时师兄抛出问题,当一个activity进入onStop()时,如何得知时由于用户点击了主页键,还是由于进入了另一个本程序的activity?

二、方法探究

查阅网络资源后,得知可以通过安卓本身的多种方法来判断。不过某些方法的使用需要获取用户授权,或者需要较高版本的安卓系统。不过本文主要介绍通过activity本身的生命周期回调函数来判断。

三、基本原理和思路

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

两个activity的生命周期顺序.png

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

四、代码实现

4.1 BaseActivity类

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

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

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

  1. public class MainActivity extends BaseActivity implements View.OnClickListener {
  2.     @Override
  3.     protected void onCreate(Bundle savedInstanceState) {
  4.         super.onCreate(savedInstanceState);
  5.         setContentView(R.layout.activity_main);
  6.         Button button = findViewById(R.id.button);
  7.         button.setOnClickListener(this);
  8.     }
  9.     @Override
  10.     protected void onStop() {
  11.         super.onStop();
  12.         Toast toast;
  13.         if (count == 0){
  14.             toast = Toast.makeText(getApplicationContext(), "程序进入后台", Toast.LENGTH_SHORT);
  15.         }else {
  16.             toast = Toast.makeText(getApplicationContext(), "程序进入第二个活动", Toast.LENGTH_SHORT);
  17.         }
  18.         toast.show();
  19.     }
  20.     
  21.     @Override
  22.     public void onClick(View v) {
  23.         Intent intent = new Intent(MainActivity.this, SecondActivity.class);
  24.         startActivity(intent);
  25.     }
  26. }
4.3 SecondActivity类

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

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

五、总结

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

相关阅读

鸿蒙开发初体验
鸿蒙和安卓,到底有什么区别?
从代码上看鸿蒙 APP 与安卓 APP 的关系
华为高管再放狠话:鸿蒙不是安卓、iOS 的拷贝!
关于 Android MVVM 一些理解与实践

  1. 如果你有写博客的好习惯
  2. 欢迎投稿
  3. 赞+在看,小生感恩❤️
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/144780
推荐阅读
相关标签
  

闽ICP备14008679号