视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Android面试题之四大组件篇
2020-11-02 18:44:48 责编:小采
文档


Android面试题(四大组件篇)

window、进程、线程篇

Android面试题(数据存储、view篇)

Activity


Q:说下Activity的生命周期?


Q:onStart()和onResume()/onPause()和onStop()的区别?

是否位于前台,对用户是否可见的区别


Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个Dialog呢?

A会回调onPause()>>onStop(),透明则不会调用onStop(),对话框则不会调用onPause()和onStop()


Q:谈谈onSaveInstanceState()方法?何时会调用?

当Activity意外销毁时再重新创建时会调用此方法,比如横竖屏切换,会导致重新创建Activity,onSaveInstanceState()方法的调用在onStop()之前,用于保存当前Activity的状态,当Activity被重新创建后,会调用onRestoreInstanceState()来恢复Activity的状态,onRestoreInstanceState()的调用在onStart()之前。


Q:onSaveInstanceState()与onPause()的区别?

两者执行没有固定的先后顺序。

onsavedinstance(Bundle savedinstancestate)方法的触发时机,其典型的情景是按home键或者切换activity,这样的activity可能被销毁的场合,但是按back键退出程序,则不会调用此方法,适合保存一些非持久性的数据(即程序运行期间需要储存的数据)。

而onpause(),不管是可能销毁还是退出程序,都必须调用,适合保存持久性的数据,但是android本身没有为此方法提供bundle参数,因此我们可以选用做一个静态变量或者是提供一个sharedpreference作为数据载体。

Q:如何避免配置改变时Activity重建?

在清单文件下每个activity注册时写上

android:configChanges=“XXX”

比如横竖屏切换:android:configChanges=“orientation”

Q:优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?

1.当app处于后台被系统回收时,app的进程被杀死了,Activity 也被回收了,而app的task和activity栈以及相应的intent和数据会被系统保存起来。当app被切回前台时,系统会恢复task和activity栈以及相应的intent和数据。
2.不要在Application类和全局单例类中存放数据,会导致app无法正确恢复状态。运行时的临时数据应存放在SharedPreference、临时文件或数据库中
3 Activity之间传数据应该用系统提供的intent机制。

Q:说下Activity的四种启动模式?(有时会出个实际问题来分析返回栈中Activity的情况)

https://blog.csdn.net/mountain_hua/article/details/81481242


Q:谈谈singleTop和singleTask的区别以及应用场景

栈顶复用:解决重复打开Activity的问题。

栈内复用:当一个任务栈要调用另一个程序的Activity的时候,如下:


Q:onNewIntent()调用时机?

当进行singleTop和singleTask模式的时候,存在对应的Activity,即会调用该Activity的onNewIntent()。


Q:了解哪些Activity启动模式的标记位?

Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//指定singleTask模式,与在AndroidManifest.xml中指定android:launchMode"singleTask"效果相同

Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
//指定singleTop模式,与在AndroidManifest.xml中指定android:launchMode"singleTop"效果相同

Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//具有这个标志的Activity启动时,在同一个任务栈中所以位于它上面的Activity都要出栈,一般会和singleTask模式一起出现

Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
//具有这个标志的Activity不会出现在历史的Activity列表中,它等同于在AndroidManifest.xml中指定android:excludeFromRecents="true"
标记位优先级比在AndroidManifest中指定优先级高


Q:如何启动其他应用的Activity?

SingleTask和taskAfiinity配合使用


Q:Activity的启动过程?

https://www.jianshu.com/p/9ecea420eb52

Fragment


Q:谈一谈Fragment的生命周期?

下图很好的描述了 Fragment 与 Activity 生命周期的关系

Q:Activity和Fragment的异同?

1、从最基础的开始说--->生命周期

Activity有7个生命周期:onCreate(); onStart(); onResume(); onPause(); onStop(); onDestroy(); onRestart();

Fragment有11个生命周期:onAttach(); onCreate(); onCreateView(); onActivityCreate(); onStart(); onResume(); onPause(); onStop(); onDestroyView(); onDestroy(); onDetach();

所以Fragment比较与Activity来说会更加灵活,因为生命周期多了,你可以控制的地方也就多了。

2、从灵活性上来说

Activity是四大组件之一,是每个页面的承载,一个就是一个,Fragment的显示要依赖于Activity,从Fragment的生命周期中就可以了解到。

Fragment是一个一个的小碎片

1)相比较与Activity来说更加灵活,可以在XML文件中直接进行写入,也可以在Activity中动态添加;

2)可以使用show()/hide()或者replace()随时对Fragment进行切换,并且切换的时候不会出现明显的效果,用户体验会好;Activity虽然也可以进行切换,但是Activity之间切换会有明显的翻页或者其他的效果,在小部分内容的切换上给用户的感觉不是很好

Q:Activity和Fragment的关系?

Fragment的显示要依赖于Activity,从Fragment的生命周期中就可以了解到。


Q:何时会考虑使用Fragment?

类似微信下方菜单栏,以及手机和平板适配等

Service


Q:谈一谈Service的生命周期?

https://www.cnblogs.com/huihuizhang/p/7623760.html


Q:Service的两种启动方式?区别在哪?

start是直接启动,bound是与当前activity绑定。


Q:一个Activty先start一个Service后,再bind时会回调什么方法?此时如何做才能回调Service的destory()方法?

如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。


Q:Service如何和Activity进行通信?

  1. Activity调用bindService (Intent service, ServiceConnection conn, int flags)方法,得到Service对象的一个引用,这样Activity可以直接调用到Service中的方法,如果要主动通知Activity,我们可以利用回调方法
  2. Service向Activity发送消息,可以使用广播,当然Activity要注册相应的接收器。比如Service要向多个Activity发送同样的消息的话,用这种方法就更好

Q:用过哪些系统Service?

https://blog.csdn.net/geyunfei_/article/details/78851024


Q:是否能在Service进行耗时操作?如果非要可以怎么做?

Service是运行在主线程中的,一般不能在Service进行耗时操作,如果非要,可以使用远程Service开启新进程。


Q:AlarmManager能实现定时的原理?

AlarmManager提供对系统警报服务的访问。这些允许您在将来的某个时间点运行应用程序。当警报响起时,系统会广播已注册的意图,如果目标应用程序尚未运行,则自动启动它。当设备处于休眠状态时,会保留已注册的警报(如果设备在此期间发生故障,可以选择将其唤醒),但如果设备被关闭并重新启动,则会清除该警报。警报管理器持有一个CPU唤醒锁,只要警报接收器的onReceive()方法正在执行。这保证了在你处理完广播后,手机才会休眠。一旦onReceive()返回,警报管理器将释放此唤醒锁。这意味着,在某些情况下,只要onReceive()方法完成,手机就会休眠。如果您的警报接收器调用Context.startService(),那么在启动所请求的服务之前,手机可能会休眠。为了防止这种情况发生,您的BroadcastReceiver和Service将需要实现一个单独的唤醒锁定策略,以确保在服务可用之前继续运行电话。


Q:前台服务是什么?和普通服务的不同?如何去开启一个前台服务?

前台服务即对用户可见的服务,可以以通知的形式创建前台服务


Q:是否了解ActivityManagerService,谈谈它发挥什么作用?

ActivityManagerService(以后简称AMS)Android中最核心的服务 , 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似,因此它在Android中非常重要


Q:如何保证Service不被杀死?

onStartCommand方法中,返回START_STICKY

StartCommand()几个常量:

  • START_STICKY
    系统重新创建服务并且调用onStartCommand()方法,但并不会传递最后一次传递的intent,只是传递一个空的intent。除非存在将要传递来的intent,那么就会传递这些intent。这个适合播放器一类的服务,不需要执行命令,只需要独自运行,等待任务。
  • START_NOT_STICKY
    系统不重新创建服务,除非有将要传递来的intent。这是最安全的选项,可以避免在不必要的时候运行服务。
  • START_REDELIVER_INTENT
    系统重新创建服务并且调用onStartCommand()方法,传递最后一次传递的intent。其余存在的需要传递的intent会按顺序传递进来。这适合像下载一样的服务,立即恢复,积极执行。
  • 提升Service优先级

    前台服务是被认为用于已知的正在运行的服务,当系统需要释放内存时不会优先杀掉该进程。

    在onDestory()中发送广播开启自己

    service+broadcast方式,就是当service调用到ondestory()的时候,发送一个自定义的广播,当收到广播的时候,重新启动service。当然,从理论上来讲这个方案是可行的,实验一下结果也是可行的。但是有些情况下,发送的广播在消息队列中排的靠后,就有可能服务还没有接收到广播就销毁了(只是猜想)。所以为了能让这个机制完美运行,可以开启两个服务,相互监听,相互启动。服务A监听B的广播来启动B,服务B监听A的广播来启动A。经过实验,这个方案是可行的。

    Broadcast Receiver


    Q:广播的两种注册形式?区别在哪?

    广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。

    动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。

    ContentProvider


    Q:ContentProvider了解多少?

    (1)android平台提供了ContentProvider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。

    (2)只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。

    (3)ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。

    (4)开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。

    (5)ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。

    下载本文
    显示全文
    专题