专栏名称: 复利大王
分享和推送Java/Android方向的技术和文章,让你成为这方面的大牛,让你每天都成长一点。同时,我们也会邀请BAT的大牛分享原创!
目录
相关文章推荐
复利大王  ·  湘ya一骨科的瓜? ·  昨天  
复利大王  ·  不讲武德!中x银行? ·  昨天  
鸿洋  ·  务必立即拿下软考证(政策红利) ·  昨天  
复利大王  ·  手握25w华子股票,躺平了 ·  2 天前  
复利大王  ·  520怀孕事件? ·  2 天前  
51好读  ›  专栏  ›  复利大王

【干货】最新阿里Android面试题总结(附答案)

复利大王  · 公众号  · android  · 2017-03-17 07:26

正文

请到「今天看啥」查看全文


  • 1.Activity中最终到startActivityForResult()(mMainThread.getApplicationThread()传入了一个ApplicationThread检查APT)
    ->Instrumentation#execStartActivity()和checkStartActivityResult()(这是在启动了Activity之后判断Activity是否启动成功,例如没有在AM中注册那么就会报错)
    ->ActivityManagerNative.getDefault().startActivity()(类似AIDL,实现了IAM,实际是由远端的AMS实现startActivity())
    ->ActivityStackSupervisor#startActivityMayWait()
    ->ActivityStack#resumeTopActivityInnerLocked
    ->ActivityStackSupervisor#realStartActivityLocked()(在这里调用APT的scheduleLaunchActivity,也是AIDL,不过是在远端调起了本进程Application线程)
    ->ApplicationThread#scheduleLaunchActivity()(这是本进程的一个线程,用于作为Service端来接受AMS client端的调起)
    ->ActivityThread#handleLaunchActivity()(接收内部类H的消息,ApplicationThread线程发送LAUNCH_ACTIVITY消息给H)
    ->最终在ActivityThread#performLaunchActivity()中实现Activity的启动完成了以下几件事:

  • 2.从传入的ActivityClientRecord中获取待启动的Activity的组件信息

  • 3.创建类加载器,使用Instrumentation#newActivity()加载Activity对象

  • 4.调用LoadedApk.makeApplication方法尝试创建Application,由于单例所以不会重复创建。

  • 5.创建Context的实现类ContextImpl对象,并通过Activity#attach()完成数据初始化和Context建立联系,因为Activity是Context的桥接类,
    最后就是创建和关联window,让Window接收的事件传给Activity,在Window的创建过程中会调用ViewRootImpl的performTraversals()初始化View。

  • 6.Instrumentation#callActivityOnCreate()->Activity#performCreate()->Activity#onCreate().onCreate()中会通过Activity#setContentView()调用PhoneWindow的setContentView()
    更新界面。

4.Activity的启动模式:

  • 1.standard:默认标准模式,每启动一个都会创建一个实例,

  • 2.singleTop:栈顶复用,如果在栈顶就调用onNewIntent复用,从onResume()开始

  • 3.singleTask:栈内复用,本栈内只要用该类型Activity就会调到栈顶复用,从onResume()开始

  • 4.singleInstance:单例模式,除了3中特性,系统会单独给该Activity创建一个栈,

5.Activity缓存方法:

  • 1.配置改变导致Activity被杀死,横屏变竖屏:在onStop之前会调用onSaveInstanceState()保存数据在重建Activity之后,会在onStart()之后调用onRestoreInstanceState(),并把保存下来的Bundle传给onCreate()和它会默认重建Activity当前的视图,我们可以在onCreate()中,回复自己的数据。

  • 2.内存不足杀掉Activity,优先级分别是:前台可见,可见非前台,后台。

6.Service的生命周期,两种启动方法,有什么区别:

  • 1.context.startService() ->onCreate()- >onStart()->Service running-->(如果调用context.stopService() )->onDestroy() ->Service shut down

    • 1.如果Service还没有运行,则调用onCreate()然后调用onStart();

    • 2.如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。

    • 3.调用stopService的时候直接onDestroy,

    • 4.如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。

  • 2.context.bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy() ->Service stop

    • 1.onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。

    • 2.这个时候会把调用者和Service绑定在一起,Context退出了,Service就会调用onUnbind->onDestroy相应退出。

    • 3.所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。

7.怎么保证service不被杀死

  • 1.提升service优先级

  • 2.提升service进程优先级

  • 3.onDestroy方法里重启service

8.广播的两种注册方法,有什么区别。

  • 1.静态注册:如果有广播信息来,你写的广播接收器同样的能接受到,比如系统的一些广播。

  • 2.动态注册:当应用程序结束了,广播自然就没有了,一些自己定义的广播

9.Intent可以传递哪些数据类型







请到「今天看啥」查看全文