Android部分-1:Activity答案

1.Activity是什么?

加载View同时负责处理用户的交互

2.典型情况下的Activity生命周期?(校招&实习)

onCreate onStart onResume onPause onStop onDestory (onRestart 从不可见状态到可见状态调用)

3.异常情况下的Activity的生命周期 & 数据如何保存和恢复?

异常情况下的生命周期主要有两种情况:

  • 横竖屏切换即关于configChange属性的分析
  • 系统资源内存不足导致优先级低的Activity被回收(优先级:前台Activity、可见非前台、后台Activity)

生命周期:异常情况出现 ->onPause-> onSaveInstanceState -> onStop -> onDestory -> onCreate -> onStart ->onRestoreInstanceState -> onResume。

4.从Activity A跳转到Activity B之后,然后再点击back建之后,它们的生命周期调用流程是什么?

执行完 Activity A的onPause方法之后,即执行ActivityB的onCreate、onStart、onResume,然后执行 Activity A的 onStop 方法。所以onPause方法不推荐执行耗时操作,会影响下一个Activity的启动。原因请见Activity 启动流程源码分析。

5.如何统计Activity的工作时间?

onResume onPause 方法。

6.给我说说Activity的启动模式 & 使用场景。

  • standard(标准模式)
  • singleTop(栈顶复用)
  • singleTask(栈内复用)知识点包括 clearTop、onNewIntent。通过TaskAffinity 属性指定Activity所属任务栈以及 allowTaskReparenting 属性(是否添加到所属应用的任务栈)
  • singleInstance(单任务栈单实例)

7.如何在任意位置关掉应用所有Activity & 如何在任意位置关掉指定的Activity?

集合 List<Activity>

8.Activity的启动流程(从源码角度解析)?

启动APP的流程会由 Instrumentation 来处理,然后它通过Binder 向 AMS(ActivitManagerService) 发送请求,AMS内部维护着一个 ActivityStack 并负责栈内的 Activity 的状态同步,AMS 通过 ActivityThread 去同步 Activity 的状态从而完成生命周期方法的调用。

9.启动一个其它应用的Activity的生命周期分析

即启动不同任务栈的Activity

10.Activity任务栈是什么?在项目中有用到它吗?说给我听听

TaskAffinity 属性

11.什么情况下Activity不走onDestory?

在Activity A中打开Activity B ,这时候走后台杀掉进程,不会调用 Activity B 的onDestory 方法。

12.什么情况下Activity会单独执行onPause?

Activity 位于可见但不位于前台(栈顶)(例如打开一个透明主题的Activity)

13.a->b->c界面,其中b是SingleInstance的,那么c界面点back返回a界面,为什么?

与SingleTask指定其他任务栈模式一样,ac在同一任务栈,b在单独任务栈

14.如果一个Activity弹出一个Dialog,那么这个Acitvity会回调哪些生命周期函数呢?

Dialog(非Dialog样式的Activity) 不会影响Activity的生命周期

15.Activity之间如何通信 & Activity和Fragment之间通信 & Activity和Service之间通信?

  • Activity之间如何通信: Intent Bundle
  • Activity和Fragment之间通信:setArgument、 回调
  • Activity和Service之间通信:IPC(Messagener、 aidl)

16.说说Activity横竖屏切换的生命周期。

1
2
3
4
5
6
7
D/MainActivity: onPause
D/MainActivity: onSaveInstanceState
D/MainActivity: onStop
D/MainActivity: onDestroy
D/MainActivity: onStart
D/MainActivity: onRestoreInstanceState
D/MainActivity: onResume

17.前台切换到后台,然后在回到前台时Activity的生命周期。

Home 键按下的生命周期分析 onPause() -> onStop -> onReStart -> onStart -> onResume

18.下拉状态栏时Activity的生命周期?

不影响生命周期

19.Activity与Fragment的生命周期比较?

Fragment 生命周期 onAttach -> onCreate -> onCreateView -> onActivityCreate -> onStart -> onResume -> onPause -> onStop -> onDestoryView -> onDestory -> onDetach

20.了解哪些Activity常用的标记位Flags?

FLAG_SINGLE_TOP、FLAG_NEW_TASK、FLAG_CLEAR_TOP

21.谈谈隐式启动和显示启动Activity的方式?

IntentFilter、action、category、data(scheme协议)

22.Activity用Intent传递数据和Bundle传递数据的区别?为什么不用HashMap呢?

Android 28 版本中 Intent.putExtra 中最后是调用 Bundle 传递。A 通过 B 传递给 C ,直接传Bundle即可,而不需要一个个取出再传递。为什么不用HashMap呢?Bundle 底层实现是通过ArrayMap,ArrayMap在数据量相对小的时候性能优于HashMap。

23.在隐式启动中Intent可以设置多个action,多个category吗 & 顺便讲讲它们的匹配规则?

可以。满足action中的一个选项和category的一个选项即可

24.Activity可以设置为对话框的形式吗?

可以。指定对话框主题即可

25.如何给Activity设置进入和退出的动画?

overridePendingTransition 或 设置主题。查看详情

26.Activity使用Intent传递数据是否有限制 & 如果传递一个复杂的对象,例如一个复杂的控件对象应该怎么做?

有限制。Intent 传递数据是通过 Binder 实现,Binder 的缓冲区大小只有1M。(Activity 之间传递数据需要考虑到跨进程的问题)。传输数据序列化和 Bundle 没有关系,只与 Binder 的跨进程通信有关。 例如 Fragment 的 setArgument(Bundle) 方法传递对象无需序列化(Fragment 本身是不涉及跨进程的)。查看详情 RemoteViews

27.在Activity中可以多次调用setContentView方法吗?说说不同时机第二次调用setContentView会发生什么?

可以。移除第一次设置的布局,保留第二次设置布局

28.说说分别在Activity里每一个生命周期函数里调用finish方法后,接下来Activity的生命周期如何回调?

onCreate 方法中调用 onCreate -> onDestory

onStart 方法中调用 onCreate -> onStart -> onStop -> onDestory

onResume 方法中调用 onCreate -> onStart -> onResume -> onPause -> onStop -> onDestory

29.有什么方法可以启动一个没有在AndroidManifest.xml中注册过的Activity?查看详情

链接文章仅供参考,Android 28 已移除 ActivityManagerNative类。

30.在Activity进行配置时,category和action的区别是什么?

action 声明接受Intent的操作 category 声明接受Intent的类别 (data中mime 声明的是接受的数据类型)

31.activity中分别在onCreate,onStart,onResume中调用finish后的生命周期如何回调?

见问题28.

32.锁定屏与解锁屏幕,Activity 生命周期?

锁定屏幕:onPause -> onSaveInstance -> onStop

解锁屏幕:onRestart -> onStart -> onResume

33.如何设置Activity进入和退出的动画?

见问题25.

34.谈谈你对Activity中onNewIntent()方法的认识?

singleTop 位于栈顶 ,singleTask,singleInstance。

36.Activity之间传递数据的方式Intent是否有大小限制,如果传递的数据量偏大,有哪些方案?

有见问题26。SQLite 或者文件存储。

37.了解scheme跳转协议吗?谈一谈

scheme host pathPrefix pathPattern。如何创建链接跳转,查看详情

38.谈谈你对Activity的Context的认识?

Activity 是继承关系 ContextThemeWrapper -> ContextWrapper 的,ContextWrapper 是继承Context,所以Context 对象可以使用子类中的所有方法。Context 中提供了关于应用环境全局的接口,允许获取以应用为特征的资源和类型。查看详情

39.如何在Application中获取当前Activity实例?查看详情

  • 在BaseActivity 中当Activity 创建时保存当前Activity实例,需要的时候取出使用即可。
  • 在Application 中 使用registerActivityLifecycleCallbacks( ActivityLifecycleCallbacks) 回调方法中保存当前Activity实例。
  • 通过反射的方法取ActivityThread中非 paused 状态的Activity即为当前Activity(不可靠,源码有可能会修改)

40.Activity进程优先级?

前台、可见非前台、后台

41.Activity出现ANR的条件有哪些 & 解决方案?查看详情

ANR(Application Not Responding)。Android中,在主线程(UI 线程)没有按规定时间没有处理完相应工作就会出现 ANR 异常。出现 ANR 的条件:

  • Activity 中触摸和点击事件5秒内没有相应
  • BroadCastReceiver 的时间(前台广播 10s,后台广播 60s)
  • service 前台20s后台200s未完成启动
  • ContentProvider 的publish在10s内未完成

解决方案:

  1. 避免在四大组件生命周期内执行耗时操作。例如数据库操作,或者本地存储文件读取等。
  2. 避免主线程某些操作被锁定,引发死锁操作触发ANR异常。
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×