我要做 Android 之 Activity
1 说下 Activity 的生命周期
为了巩固所学知识点,为自己找工作做准备,一是为了能分享给更多的人,所以从已经拿了6家 offer 的小姐姐 https://www.jianshu.com/u/203b606b956c 博客里抓来了这些面试题目赶紧复(预)习一下。
首先说下 Activity 生命周期的回掉方法
·//创建Activity public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //Activity快要变成可见的 @Override protected void onStart() { super.onStart(); } //Activity变成可见的,处于运行状态 @Override protected void onResume() { super.onResume(); } //其他Activity获得用户焦点,(Activity快要暂停了) @Override protected void onPause() { super.onPause(); } //Activity不再可见,处于停止状态 @Override protected void onStop() { super.onStop(); } //Activity快要被销毁了 @Override protected void onDestroy() { super.onDestroy(); }
相信很多小伙伴对这些方法都比较熟悉,只是如果问的再详细一点呢?更详细一点呢?你还会比较熟悉吗?我的答案是不熟悉,相信很多小伙伴都有感觉,忘记的时候直接去查不就好了,但是面试官可不管啊童鞋们。面试大佬们一看这都不会,回去等通知吧。。。
这里我们可以看到 Activity 生命周期中的三个嵌套循环:(什么,三个,我怎么只看到一个,,,)
一:Activity 的 全部生命周期 发生在调用 onCreate() 和 调用 onDestory() 之间。在 onCreate() 方法中执行全局状态的建立(例如定义布局),在 onDestroy() 方法中释放所有保存的资源。
二:Activity 的 可见生命周期 发生在调用 onStart() 和 onStop() 之间。在这个期间,用户能在屏幕上看见 Activity,和它进行交互。系统在 Activity 的完整寿命中可能多次调用 onStart() 和 onStop(), 正如 Activity 交替地对用户可见或隐藏。
三:Activity 的 前台生命期 发生在调用 onResume() 和 onPause() 之间。在这期间,Activity 在屏幕上所有其他 Activity 的前面,有用户输入焦点。一个 Activity 能频繁的在前台进入和出去之间转变。
看下图(其实估计很多同学都看过,看烂了,没办法,图片虐我千百遍,我待图片如初恋)
我们书写两个 Activity,只有简单的显示功能
public class MainActivity extends AppCompatActivity { private Button btn_Second; private static final String TAG = "ActivityTest"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "MainActivity onCreate"); btn_Second = findViewById(R.id.btn_second); btn_Second.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } @Override protected void onStart() { Log.d(TAG, "MainActivity onStart"); super.onStart(); } @Override protected void onResume() { Log.d(TAG, "MainActivity onResume"); super.onResume(); } @Override protected void onPause() { Log.d(TAG, "MainActivity onPause"); super.onPause(); } @Override protected void onStop() { Log.d(TAG, "MainActivity onStop"); super.onStop(); } @Override protected void onDestroy() { Log.d(TAG, "MainActivity onDestroy"); super.onDestroy(); } }
SecondActivity
public class SecondActivity extends AppCompatActivity { private static final String TAG = "SecondActivity"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Log.d(TAG, "SecondActivity onCreate"); } @Override protected void onStart() { Log.d(TAG, "MainActivity onStart"); super.onStart(); } @Override protected void onResume() { Log.d(TAG, "MainActivity onResume"); super.onResume(); } @Override protected void onPause() { Log.d(TAG, "MainActivity onPause"); super.onPause(); } @Override protected void onStop() { Log.d(TAG, "MainActivity onStop"); super.onStop(); } @Override protected void onDestroy() { Log.d(TAG, "MainActivity onDestroy"); super.onDestroy(); } }
1 运行后的打印结果
点击按钮之后的截图
大家可以看到,生命周期的执行顺序,首先调用 MainActivity 的 pause 方法,之后是 SecondActivity 的正常创建显示,和上一个图顺序相同。等 SecondActivity 完全显示之后,会调用 MainActivity 的 stop 方法,表示该 Activity 停止活动。 ps:这是正常的活动跳转调用。
那如果不正常呢?
2 比如点击弹出的不是一个 Activity,二是一个 dialog。把 theme 改成这样:
运行结果是这样:
可以发现此时 MainActivity 完全可见,所以此时的执行周期是怎样的呢?
点击跳转之后只是执行了 MainActivity 方法,而没有执行 onStop 方法。记住,划重点啊朋友们。
3 若将SecondActivity改为不是Dialog,把上图中的 theme 这一行删掉即可。再点击跳转按钮: 依次调用了它的回调方法: onPause()->onStop()
4 当 Activity 处于运行状态的时候点击返回按钮,
点击返回按钮,Activity由运行状态变为死亡状态,依次调用它的回调方法:onPause() -> onStop() -> onDestroy()
5 当 Activity 处于运行状态的时候,点击 home 键直接返回桌面
Activity由运行状态变为停止状态,依次调用它的回调方法:onPause()->onStop()
6:Activity处于运行状态,旋转屏幕:
可以看出,旋转屏幕是一个销毁Activity然后重新创建Activity的过程。运行->暂停->停止->死亡->运行依次调用回调方法: onPause() -> onStop -> onDestroy() -> onCreate() -> onStart() -> onResume()
- Activity处于运行状态,手机此时锁屏。
手机锁屏,此时由于Activity不可见,会进入停止状态。依次调用回调方法:onPause()->onStop()
8.当应用正在运行时,手机锁屏,然后解锁回到应用界面。应用从停止状态恢复到运行状态。依次调用回调方法:onRestart() -> onStart() -> onResume();注意此时是 onRestart 方法
看看我们这篇文章解决了几个问题?
Q:说下Activity的生命周期?
Q:onStart()和onResume()/onPause()和onStop()的区别?
Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?
Activity1启动的时候
Activity1(onCreate)--->Activity1(onStart)--->Activity1(onResume)
Activity1跳转到Activity2的时候(2完全覆盖了1)
Activity1 (onPause)---> Activity1(onStop)
Activity2(onCreate)--->Activity2(onStart)--->Activity2(onResume)
特殊:
如果2是透明的窗体或者对话框样式的主题,那么1就不会调用onStop方法;
如果1已经存在该Activity的栈中,则不会调用onCreate方法。
呐,我在最后列出了问题,也给出了总结和补充,欢迎小伙伴们留言。
愿我们成为真实的自己。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
iOS 开发之十天学会 C 语言
十天学会 C 语言(上)十天学会 C 语言(下)
- 下一篇
Android之路 - 实现高斯模糊的菜单
前言 本章主要用原生的方式实现一个菜单页面,主要用到的知识点为位移动画,我们可以先看看效果。 高斯模糊的菜单效果图.gif 分析 高斯模糊背景 我们的菜单背景是一个高斯模糊的背景,虽然看上去高大上,但是不要被吓到了,实现原理非常的简单:截取当前屏幕转换为bitmap,将bitmap进行高斯模糊,然后设置为菜单的背景。 当然,还有另外一种实现方式就是让UI设计师切一张高斯模糊模糊的透明背景图,看看UI设计师会不会打死你。 哒哒 菜单跳动 这个效果看上去虽然是复杂,但是不要被吓到了。其实也就是先用一个RelativeLayout作为根布局,将里面的每个menu逐个的布局,排列好。 打开菜单的时候,使用translationY动画逐个逐个的将menu从屏幕外移动到原来的位置,而从第0个menu开始,后面的每个menu根据下标延迟启动动画。 第1个比第0个延迟开始动画160毫秒* 第2个比第1个延迟开始动画260毫秒* 第3个比第2个延迟开始动画360毫秒* 关闭菜单,从第0个进行translationY动画将menu逐个移出到屏幕外。从下标递增,不断的延迟动画的开始。 第0个延迟开始动画43...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G