Android 四大组件基础讲义

本文详细解析了Android四大组件:Activity、Service、BroadcastReceiver和ContentProvider的工作原理及生命周期,包括Activity的onNewIntent触发条件、Service的运行线程及常驻后台策略、BroadcastReceiver的注册方式与广播类型以及ContentProvider的声明和权限设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四大组件

Activity

activity_lifecycle

  • 何时触发onNewIntent
    singleTask singleInstance 再次拉起Activity时,走入onNewIntent

  • 主题对生命周期的影响?
    透明主题Theme.TranslucentActivity,其背景并非必须为透明,可以有颜色。但其下层Activity不会走到onStop,同时,外部返回至透明Activity时,其下层Activity也会走入onStart

  • 监听配置改变
    系统配置改变,如:横竖屏改变、USB设备改变、输入设备改变、位置改变等,由系统发出消息。默认情况下,Activity将被销毁重建,如果不想被销毁,则需在AndroidManifest中声明android:configChanges=...将希望捕获的状态改变加入,此时状态改变后会走入onConfigurationChanged函数。
    一般多用于Launcher,因为Launcher原则上是不应该被销毁的。

Service

service_lifecycle

  • 在哪个线程运行?
    Service启动后依然是在主线程即UI线程运行的,在其中执行高耗时的阻塞的操作依然会引起ANR。
    Android SDK提供一个IntentService类,其中通过HandlerThread实现了异步回调框架,继承此类的Service,其onHandleIntent函数中可以执行高耗时操作。

  • startServicebindService
    startService启动服务后,无法直接与此Service机型函数调用,必须通过Intent传递(发广播、多次进入onStartCommand)等方法与之交互。bindServiceService端实现了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做判断执行相应操作。

  • 生命周期
    onCreateApplication onCreate回调更早。如果调用时此ContentProvider所在的应用未启动,则系统先启动该应用,回调ContentProvider onCreate —> Application onCreate

  • 运行线程
    运行与提供ContentProvider的应用的主线程中,是阻塞方法,因此如果App Call在主线程中调用,而App Provide在其中做高耗时操作,则App Call会出现ANR

  • 权限
    可以自定义访问权限,App Call需要声明同样的权限才可以访问

  • 用途
    可用于执行通用数据库的操作(如系统SettingsProvider记录系统状态供其他应用使用),用于操作网络资源(必须在非UI线程调用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值