四大组件
Activity
何时触发
onNewIntent
?
singleTask
singleInstance
再次拉起Activity
时,走入onNewIntent
主题对生命周期的影响?
透明主题Theme.Translucent
的Activity
,其背景并非必须为透明,可以有颜色。但其下层Activity
不会走到onStop
,同时,外部返回至透明Activity
时,其下层Activity
也会走入onStart
监听配置改变
系统配置改变,如:横竖屏改变、USB设备改变、输入设备改变、位置改变等,由系统发出消息。默认情况下,Activity
将被销毁重建,如果不想被销毁,则需在AndroidManifest
中声明android:configChanges=...
将希望捕获的状态改变加入,此时状态改变后会走入onConfigurationChanged
函数。
一般多用于Launcher
,因为Launcher
原则上是不应该被销毁的。
Service
在哪个线程运行?
Service
启动后依然是在主线程即UI线程运行的,在其中执行高耗时的阻塞的操作依然会引起ANR。
但Android SDK
提供一个IntentService
类,其中通过HandlerThread
实现了异步回调框架,继承此类的Service
,其onHandleIntent
函数中可以执行高耗时操作。startService
和bindService
startService
启动服务后,无法直接与此Service
机型函数调用,必须通过Intent
传递(发广播、多次进入onStartCommand
)等方法与之交互。bindService
的Service
端实现了AIDL
文件描述的接口,用户可用以上接口直接与Service
进行函数调用。能否常驻后台?
内存紧张时,系统会对后台Service
下手。如果此Service
没有前台应用与之Bind
则被杀死的几率更高。一般调高优先级、onStartCommand
返回START_STICKY
来降低被杀概率或被杀后重新启动。
BroadcastReceiver
APP —> onReceive —> return
触发为前台进程 与进程中其余组件一致
谁的
Context
该广播接收器应用的ApplicationContext
在哪个线程运行
运行在主线程即UI线程,因此执行高耗时操作会ANR。异步操作
不建议在onReceiver
中直接执行异步操作,onReceiver
返回后系统可能根据当时内存情况直接清理该进程导致异步操作异常中断。注册方式
动态注册:运行时收到,优先级高。静态注册:没运行会被先拉起再收到,优先级低。广播种类
普通广播sendBroadcast
:先注册的动态接收器—>后注册的动态接收器—>先扫描的静态接收器—>后扫面的静态接收器
有序广播sendOrderedBroadcast
:顺序发送,优先动态注册,同时根据AndroidManifest
中声明的优先级高低。可以被截断abortBroadcast
,用来拦截系统短信广播等。
粘滞广播sendStickyBroadcast
:与普通广播一致,保留最后一次广播消息,注册后立刻发送。用于状态变更通知如网络变更、TV有/无信号变更。API 21由于安全问题已不建议使用。广播
Intent
FLAG_RECEIVER_REGISTERED_ONLY
只有动态接收器能收到。FLAG_RECEIVER_NO_ABORT
不允许截断此有序广播。FLAG_EXCLUDE_STOPPED_PACKAGES
4.0之后版本应用安装后未运行过,则处于Stopped状态,而系统广播如开机广播发送时都加上了此FLAG,由此如果安装后应用未运行过则无法接收到此类广播(如果应用APK在System分区则没关系)。
ContentProvider
App Call —> ContentResolver
—> System Framework
—> App Provide —-> query/delete/insert/update/etc
声明
与前三种类似,在AndroidManifest
中声明,需要指明暴露出来的URI。一个URI指定一个ContentProvider
,之后可根据双方协议用/
分隔添加后续内容,用于ContentProvider
做判断执行相应操作。生命周期
onCreate
比Application onCreate
回调更早。如果调用时此ContentProvider
所在的应用未启动,则系统先启动该应用,回调ContentProvider onCreate
—>Application onCreate
运行线程
运行与提供ContentProvider
的应用的主线程中,是阻塞方法,因此如果App Call在主线程中调用,而App Provide在其中做高耗时操作,则App Call会出现ANR权限
可以自定义访问权限,App Call需要声明同样的权限才可以访问用途
可用于执行通用数据库的操作(如系统SettingsProvider记录系统状态供其他应用使用),用于操作网络资源(必须在非UI线程调用)