Android基础
android系统(四层架构)~
- linux内核:提供了底层驱动
- 系统运行库层:提供了特性支持和允许编写android应用的核心库
- 应用框架层:各种API
- 应用层
SDK:开发工具包(一堆API)。
四大组件:Activity,Service,Broadcast Receiver,Content Provider。
AndroidManifest.xml:配置文件;四大组件在这注册;添加权限声明等。
Log.v():用于打印琐碎的,意义小的日志信息,级别verbose(最低)~灰色
Log.d():用于打印调试信息,级别debug(比verbose高点)~绿色
Log.i():用于打印重要数据,帮助分析用户行为,级别info(比debug高点)~蓝色
Log.w():用于打印警告信息,级别warn(比info高点)~紫色
Log.e():用于打印错误信息,级别error(比warn高点)~红色
assert:~黑色
android第一行代码 Activity
Activity生命周期活动在其生命周期中最多可能会有4种状态:
- 运行状态
- 暂停状态
- 停止状态
- 销毁状态
七种回调方法:
- onCreate():第一次被创建的时候调用,应在这中完成初始化操作,比如加载布局、绑定事件等
- onStart():在不可见->可见时调用
- onResume():在活动准备好和用户进行交互的时候调用。
- onPause():在系统准备去启动或恢复另一个活动时调用,应在这将消耗cpu的资源释放掉和保存关键数据,但这个方法一定要快,不然会影响新栈顶活动的使用
- onStop():在活动完全不可见时调用,和onPause()主要区别在于如果新活动是对话框式的活动,则onPause()会执行而onStop()不会执行
- onDestroy():在销毁前调用,之后活动将变为销毁状态
- onRestart():在停止->运行状态之前调用
除onRestart()之外都是两两相对的,因此又分为三种生存期
- 完整生存期:onCreate()—onDestroy()
- 可见生存期:onStart()—onStop()
- 前台生存期:onResume()—onPause()
异常情况的生命周期
情况一:资源相关的系统配置发生改变导致Activity被杀死并重新创建
情况二:资源内存不足导致低优先级的Activity被杀死
- 除非程序在onCreate()方法里面就调用了finish()方法,系统通常是在执行了onPause()与onStop() 之后再调用onDestroy() 。
- onSaveInstanceState缓存数据和onRestoreInstanceState恢复数据。
- 把Activity销毁时onSavedInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,onRestoreInstanceState是在onStart之后调用。
- Activity被意外终止时,会调用onSavedInstanceState去保存数据,然后Activity会委托Window去保存数据,接着Window再委托它上面的顶级容器去保存数据,顶层容器是一个ViewGroup或者DecorView.最后顶层容器再去一一通知它的子元素来保存数据,这样整个数据保存过程就完成了,可以发现,这是一种典型的委托思想,上层委托下层,父容器委托子容器去处理一些事情。
- 当从Activity a跳转到Activity b时,a的onPause方法执行过后,b的onResume方法才会执行。
活动的启动模式:
可以在AndroidManifext.xml注册Activity时设置启动模式
android:launchMode="singleTask"
- standard:(默认)
每启动一次就会创建该活动的一个新的实例入栈,而不在乎是否栈中已存在 - singleTop
在启动活动时返回栈的栈顶已经是该活动,则直接使用,不会再创建新的实例;要是该活动未处于栈顶位置,则创建新实例 - singleTask
每次启动活动时系统会在栈中检查是否存在该活动的实例,若已经存在,这直接使用该实例,在此之上的活动统统出栈 - singleInstance
有另一个返回栈一起管理,便于不同的应用程序访问,
FristActivity -> SecondActivity(进入另一个返回栈里) -> ThirdActivity
退出时ThirdActivity ->FristActivity -> SecondActivity,先查看当前活动栈栈顶退出后还有没有活动实例,若有接着出栈,之后再访问另一个栈。
android Framework既能在同一个任务中对Activity进行调度,也能以Task为单位进行整体调度。在启动模式为standard或singleTop时,一般是在同一个任务中对Activity进行调度,而在启动模式为singleTask或singleInstance是,一般会对Task进行整体调度。
对Task进行整体调度包括以下操作:
- 按Home键,将之前的任务切换到后台
- 长按Home键,会显示出最近执行过的任务列表
- 在Launcher或HomeScreen点击app图标,开启一个新任务,或者是将已有的任务调度到前台
- 启动singleTask模式的Activity时。
- 启动singleInstance的Activity时,会在系统中搜寻是否已经存在一个这个Activity的实例,如果存在,会将这个实例所在的任务调度到前台,重用这个Activity的实例(该任务中只有这一个Activity),如果不存在,会开启一个新任务,并在这个新任务中启动这个singleInstance模式的Activity的一个实例。
应用场景:
1.singleTop适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。聊天的对话窗口,
2.singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。
singleTask:a界面购物,b界面确认订单,c界面付款,如果付款成功会跳到a,如果不付款则返回b,这时候重启a就会用到singleTask.
3.singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
4.standard 标准的启动模式,也是默认的启动模式。
Activity的构成
Activity -> PhoneWindow (window实现类) -> DecorView(顶级视图) 从系统布局中加载,并在运行时将开发人员给Activity的布局添加到系统布局的mContentParent -> Default Layout(默认布局) -> ViewGroup:mContentParent -> xml布局
android第一行代码 Fragment
- 运行状态
- 暂停状态
- 停止状态
当活动进入停止状态时,与它相关联的碎片就会进入停止状态。或者调用FragmentTransaction的remove(),replace()移除碎片,但有事务提交之前调用addToBackStack()方法,这时碎片也会进入停止状态。 - 销毁状态
当活动销毁时,碎片也会销毁,或者调用FragmentTransaction的remove(),replace()移除碎片,但有事务提交之前没有调用addToBackStack()方法,这时碎片也会进入销毁状态。
活动的回调方法,碎片几乎都有,不过碎片还提供了一些附加的回调方法。