- Android 知识
- 四大组件相关
1.)Activity 的生命周期
正常: onCreate(创建)->onStart(可见)->onResume(运行可交互)->onPause(暂停,不可 交互)->onStop(不可见)->onDestroy(销毁)
异常:
1.用户按下Home键(魅族测试): onPause->onSaveInstance->onStop通过任务管理器重进onRestart->onstart->onResume
2.从程序切换到任务管理器:onPause->onSaveInstance->onStop() 任务管理器切回 onRestart->onStart->onResume ,任务管理器直接杀死进程不会调用onDestroy
3.横竖屏切换:onPause->onSaveInstance->onStop->onDestroy->onCreate->onStart->
onRestoreInstance->onResume(横屏切竖屏,竖屏切横屏一样)
- 其他一些系统配置变更也可能会导致Activity 销毁重建
- back键activity生命周期 onPause->onStop->onDestroy
- 调用onSaveInstance 之后不一定会调用onRestoreInstance,如果没有销毁自然不用恢复
- Activity被异常销毁之后重新进入会调用onRestoreInstance
Frament 的生命周期:
onAttach->onCreate->onCreateView->onViewCreated->onActivityCreated->onstart->onResume->onPause->onstop->onDestroyView->onDestroy
Fragment 切换生命周期:replace onPause->onstop->ondestroyView->ondestroy
onDettach onAttach->onCreate->onCreateView->onActivityCreated->onstart->onresume
Fragment hide show 不会调用生命周期的任何方法 会调用onHiddenChange
setUserVisiableHint 方法用来设置fragment的可见和不可见,发生在fragment的
任何生命周期之前(FragmentPagerAdapter适用 一般的Activity Fragment 不适用 )
2.)Activity 构成:setContentView 方法会先去生成decorview(继承ViewGroup),然后根据Activity的主题去加载根布局(inflate)并添加到decorview里面,所以window.requestFeature 必须在setContentView之前才会生效。setContentView 会把contentView 添加到id = ANDROID_CONTENT_ID(FrameLayout) 也就是下图的contentView 里面默认加载的根布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<ViewStub android:id="@+id/action_mode_bar_stub"
android:inflatedId="@+id/action_mode_bar"
android:layout="@layout/action_mode_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="?attr/actionBarTheme" />
<FrameLayout
android:id="@android:id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:foregroundInsidePadding="false"
android:foregroundGravity="fill_horizontal|top"
android:foreground="?android:attr/windowContentOverlay" />
</LinearLayout>
- 正常情况下 根布局
- Activity 的启动模式:
Activity 的任务栈:可以在manifest里面的activity标签里面为activity指定任务栈 android:taskAffinity="" 默认为程序的包名
注意:singleTop或者singleinstance ActivityA 通过startActivityForResult() 启动B 系统直接返回 Activity_Result_CANCELD
1.)Standard 标准模式 每次通过startActivity 启动都会创建新的实例
放在任务栈(TASK)的栈顶
2.)SingleTop 栈顶模式 要打开的Activity如果在栈顶,不会创建新的Activity实例,但仍然会调用onNewIntent(应用场景:推送新闻,如果当前已经在新闻详情界面,这个时候收到新闻推送,点击通知之后再次进入到新闻详情)
3.)SingleTask 单任务栈模式 同一个APP在启动activity之前会监测任务栈中是否存在要启动的Activity如果存在不会创建新的实例,会将任务栈中要启动的Activity上面的所有Activity 出栈(销毁)->onNewIntent
不同的app 如果不存在会创建一个新的任务栈,如果已经存在于后台任务栈会将后台任务栈切换到前台
应用场景:典型应用场景应用的主页,标准模式:主页->A->主页->C
SingleTask 模式 主页->A ==>主页->C
4.)SingleInStance 单实例模式 类似浏览器,不同的程序访问浏览器时
如果浏览器没有打开则打开浏览器,否则会在当前打开的浏览器中访问
使用场景:这种模式适用于需要和程序分离的界面
- 关于StatusBar(一般APP会要求可以改变statusbar 的颜色以便和整个app相适应)android5.0 之后api添加了setstatusbarColor android 6.0之后加入了夜间模式(darkmode)
- App的启动流程
androrid 程序在启动的时候会初始化SystemServer,在SystemServer 进程里面初始化很多系统服务,并将它注册到SM里面。其中PM会扫描指定位置的app menifest文件生成package.xml。
android 桌面程序也是一个App,桌面是一个Activity,每个图标代表一个app里面包含了app 的(包名路径,启动activity名称)等信息,点击的时候会调用startActivity(要启动的app信息),通过SMP获取AMP调用AMP 的相关方法,告诉ActivityManager 要启动哪个Activity,AM收到消息后会发消息给
LaucherActivity(桌面Activity)告诉他可以pause了,桌面收到这条消息就会执行onpause,同时再通知AM 可以启动新的Activity了,AM会检查要启动的
Activity的进程是否存在不存在就会fork一个新的进程,调用ActivityThread
的main() 方法,然后启动Activity
Activity 的启动流程
ActivityA->ActivityB
A->startActivity->SMP->AMP->AM->A onPause->AM->startActivityB->B
总结:Activity 知识点:
1.生命周期/fragment 生命周期/异常保存和恢复
2.启动模式
3.启动流程/app的启动流程