前言
上周腾讯打了电话来,因为我开了静音,没想到后来没打来了。因此以为错过了一次面试的机会。昨晚忽然间看到一个深圳的电话,就接听了。一听是女声,后来面试就开始了。面试完就看了一下手机,原来她打了我不少于十次。(一周内),幸亏她还没放弃我。(大家记得保持手机的流畅)
有关面试的
由于有点猝不及防,感觉自己答得不好。总结这次面试题如下:
1.项目负责哪一部分,性能上有什么优化?
2.图片的缓存,ANR ,内存泄漏
3.自定义View
4.四大组件的生命周期(中间我答得好肤浅,是要好好地归纳一下)
5. 数据的持久化保存方式
总结
1.大概知道一个点,没有去深究源码,总的来说就是没深度
2.回答的思路有点乱,应该理清思路再回答。
3.基础还不够扎实。
所以,我在官网上看了Activity的使用文档,所以有下文(请尽量吐槽我的翻译能力)
Activity的生命周期
其实吧,说来说去,都离不开下面的方法(摘自官网)
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
至于上面这个图,我想大家已经见过千次万遍了。虽然如此,还是贴出来再加深下大家记忆。
然后呢?这些家伙上面都是有对象的(两两成对,除了onRestart是单身狗之外)
按照这些情侣的配对呢,又可以分以下三种:
entire lifetime(完整生存期)onCreate()和onPause()
一个完整的生命周期就是从onCreate(创建视图)到onDestroy(活动销毁),一般的初始化操作都放在onCreate方法中,当系统要回收释放该Activity时onDestroy就被触发执行。
The visible lifetime(可见生存期) onStart()和onStop()
用户可以看到屏幕上的活动,虽然它可能不在前台和用户交互。在这两种方法之间,您可以维护向用户显示活动所需的资源。例如,你可以在onstart()注册一个BroadcastReceiver来影响你的用户界面的变化监测,并注销其onstop()当用户不再看到你的显示。onstart()和onstop()方法可以多次调用,为活动变得可见和隐藏的用户。
The foreground lifetime(前台生存期) onResume()和onPause()
该活动是在所有其他活动的前面,并与用户交互。一个活动经常可以在恢复和暂停状态之间进行–例如当设备进入休眠状态,当一个活动结果被传递,当一个新的意图被传递时,所以这些方法中的代码应该是相当轻量级的。
至于onRestart():是当活动从停止状态回到可运行状态(如果Activity还没被系统回收回到前台)
其实,看完这个,在加上一直以来我对onWindowFocusChanged()这个方法也有点疑问,为什么帧动画要在onWindowFocusChanged()这个方法启动,到底谁才是真正视图可见的时机呢?
于是,在文档可以看到:
下划线这句话真的很神奇,所以你知道哪个才是真正的视图可见的最佳时机了吗?
因此,焦点的变化通常会有一些关系生命周期变化(一种活动停止一般不会得到窗口焦点),你应该不依赖于任何特定的顺序之间的回调在这里和那些在其他生命周期方法如onresume()。作为一般规则,然而,一个恢复活动将得到窗口焦点…除非有其他对话框弹出窗口显示或接受输入焦点,在这种情况下,活动本身不会有焦点时,其他窗口拥有它。同样,系统会显示系统顶层窗口(如状态栏通知面板或警报系统)将暂时不停顿的前台活动带窗口的输入焦点。
在Activity的生命周期中,onCreate()–onStart()–onResume()都不是窗体Visible的时间点,真正的窗体完成初始化可见获取焦点可交互是在onWindowFocusChanged()方法被执行时,而这之前,对用户的操作需要做一点限制。
最后说回到为什么帧动画要在onWindowFocusChanged()这个方法启动?
我想大家,已经心中有答案了吧(在oncreate中启动有可能view控件未显示加载出来从而动画效果没有作用,一般来说在onwindowfocuschanged方法中启动动画即可)
—
完美的散花,谢谢大家的观赏。