如果我是Android面试官八

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Kongou/article/details/82852759

一、Application生命周期

Application属于单例模式,只能创建一个。

Application作用:1、定义全局属性和全局方法。2、在应用程序组件中传递对象。3、定义缓存

Application的生命周期是整个程序最长的,它的生命周期相当于程序的生命周期。

关于生命周期的方法有如下几个

1、onCreate 程序创建时执行

2、onTerminate 程序终止时执行

3、onLowMemory 低内存时执行

4、onTrimMemory 程序在内存清理时执行

5、onConfigurationChanged 配置改变时触发

二、getApplication和getApplicationContext的区别

二者使用结果相同,打印调用结果发现是同一个对象。区别在于getApplication是用来获取Application实例的,但是该方法只有Activity和Service中能调用,在其他地方就需要使用getApplicationContext了。

注意,使用context时,可以获取activity的也可以获取application的,activity的上下文随着activity的销毁而销毁。application的会伴随整个应用。涉及UI的上下文引用,应当使用activity的上下文。

三、Service相关

1、Service是什么

Service通常称为后台服务,通常情况下不依赖于UI。是android四大组件之一。

2、启动方式

Service启动方式分为StartedService和BoundService。无论哪种启动方式,都需要在Manifest文件中注册。

1)StartedService相对简单,通过context的startService方法启动,stopService方法停止。也可以在Service内部调用stopSelf停止其自身。

StartedService的生命周期为onCreate->onStartCommand->onDestroy。其中,onStartCommand可以调用多次,onCreate与onDestroy对应。

对于同一类型的Service,实例只能存在一个,不管调用方是否是同一个。

Client将数据传给Service可以通过Intent方式,但是Service传送给Client则需要通过广播形式。

2)BoundService的特性在于Service生命周期依赖于Client的生命周期。当Client不存在时,BoundService会调用自身onDestroy方法。同时,BoundService可以通过Binder对象,实现与Client之间的传递。

BoundService使用方式如下:

自定义Service继承Service,同时重写onBind方法,此方法需要返回具体的Binder对象。

Client实现ServiceConnection接口来实现自定义ServiceConnection,并且通过bindService将Service绑定到Client上。

自定义的ServiceConnection中实现onServiceConnection方法,来获取Binder实例。

通过Binder实例完成Service其他方法调用,实现Client-Service之间的通信。

在Client的恰当时机如onDestroy,应解绑Service,通过调用方法unbindService实现。

首次触发bind方法,会调用onCteate和onBind方法。再次点击则不会有任何响应。触发unbindService方法会调用onUnbind以及onDestroy方法。

在BoundService使用中,根据传入的binder定义方式不同,分为三种方式。

1)继承Binder

这是最普通的方式,缺点是Client和Service必须处于同一进程,不能实现进程间通信。

2)使用Messenger

通过Messenger方式返回的Binder对象可以实现跨进程通信。局限是不支持多线程并发。

3)AIDL

一般情况下Messenger方式可以满足需求,但是使用AIDL方式可以更加灵活。

3、LocalService 与RemoteService

LocalService指Client与Service处在同一进程。RemoteService指Service处在独立进程。

4、IntentService

IntentService是系统提供给我们的一个继承于Service的特殊类。其特殊性是相对于Service而言的。

IntentService具有以下特点。

1)默认实现onBind方法,直接返回Null。并定义了onHandleIntent方法。

2)onHandleIntent用于处理相应的长期任务,并且自动在新的线程中,不需要用户新定义线程。

3)长期任务执行完成后,IntentService自动结束,无需手动结束。

4)IntentService处于任务时也是按照队列方式处理,并非多线程并发。

5、前台Service

前台Setvice通过Service.startForeground方法设置。在UI显示上一直处于onGoing状态,前台Service拥有更高的优先级。

6、Service与组件间的通信

Service与组件间通信方式有两种。1)通过Binder。2)通过广播

四、activity的onNewIntent

onNewIntent方法主要针对Activity启动模式中的singleTask模式。这个模式下,Activity第一次启动时,生命周期调用顺序为onCreate、onStart、onResume。再次启动时,生命周期调用为onNewIntent、onRestart、onStart、onResume。

需要注意的是,如果需要处理intent中的方法,第一次启动时,会调用onCreate方法。之后再次启动,将不会调用onCreate方法。如果有需要处理的任务,可以封装在一个方法里,分别在onCreate和onNewIntent方法中调用。

五、Fragment的懒加载实现、参数传递与保存

在ViewPager嵌套Fragment时,由于ViewPager会提前预加载,所以涉及到Fragment页面有网络请求的操作时,往往会造成浪费。那么如何在展示时才加载网络请求呢。可以通过setUserVisibleHint和getUserVisibleHint来判断当前Fragment是否可见。getUserVisibleHint是确保了UI可见,如果不涉及UI的操作使用setUserVisibleHint也是可以的。

关于Fragment之间参数的传递,官方推荐Fragment.setArguments(Bundle)方法。此方法在屏幕颠倒,布局展示变化时,仍然能够获取到bundle中的值,保证不丢失。如在onDestroy等生命周期时间想要保存数据和恢复数据,仍然使用getArguments().putBundle方法来保存数据。

六、BroadcastReceiver使用

广播接收器用于接收广播信息,并通知相应的组件进行处理。

1、广播的类别

1)无序广播

每个接收者无需等待,都会立刻接收到广播。其它接收者也无法阻止广播的传递。通过Context.sendBroadcast方式发送。

2)有序广播

广播是按照优先级高低进行传递的。高优先级的接收者可以阻止广播的向下传递。通过sendOrderedBroadcast方式发送。

2、广播的使用流程

1)、继承BroadcastReceiver类,有两种创建形式,单独类文件与内部类形式。重写onReceive方法处理消息。

2)、注册广播分为动态注册和静态注册。

静态注册指在manifest文件中注册,这种广播具有应用程序级别的效果。需要注意的是,如果注册的广播是以内部类的形式创建的,需要摆脱内部类对外部类的持有,需要使用静态内部类。同时注册时内部类要使用$符号来表示。

动态注册是通过代码注册,这种注册具有组件级别的效果。组件销毁就不会再接收消息了。

3)、进程间广播的使用

在注册广播时,设置exported属性为true,就可以接收其他进程的广播了。

3、事务处理

广播接收器的生命周期很短,处理耗时业务会报错。所以耗时业务可以放到Service中处理,广播接收器只负责接收和通知。

七、Android消息机制

Android消息机制主要是指Handler机制,详情看Handler机制。

八、Binder机制、共享内存实现原理

Binder机制这部分内容比较多,涉及的知识也比较多,单独整理

猜你喜欢

转载自blog.csdn.net/Kongou/article/details/82852759