Android 面试相关-Activity

  • Android 知识
  1. 四大组件相关

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(横屏切竖屏,竖屏切横屏一样)

  1. 其他一些系统配置变更也可能会导致Activity 销毁重建
  2. back键activity生命周期 onPause->onStop->onDestroy
  3. 调用onSaveInstance 之后不一定会调用onRestoreInstance,如果没有销毁自然不用恢复
  4. 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>
  1. 正常情况下 根布局

 

  1. 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 单实例模式  类似浏览器,不同的程序访问浏览器时

  如果浏览器没有打开则打开浏览器,否则会在当前打开的浏览器中访问

  使用场景:这种模式适用于需要和程序分离的界面

  1. 关于StatusBar(一般APP会要求可以改变statusbar 的颜色以便和整个app相适应)android5.0 之后api添加了setstatusbarColor  android 6.0之后加入了夜间模式(darkmode)
  2. 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的启动流程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值