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来降低被杀概率或被杀后重新启动。
BroadcastReceiverAPP —> 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分区则没关系)。
ContentPRoviderApp 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线程调用)
新闻热点
疑难解答