一、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机制这部分内容比较多,涉及的知识也比较多,单独整理