关于activity/service/broadcast

本文探讨了Android应用程序中Activity、Service和BroadcastReceiver的运行机制。虽然它们都在应用程序主线程(GUI线程)中工作,但各自承担不同职责。Activity专注于用户交互,Service处理后台任务,BroadcastReceiver则用于接收和处理广播消息。文中通过实验验证了这一结论,并以音乐播放器为例解释了如何在主线程中进行任务调度。

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

   之前以为activity在应用程序进程的 GUI主线程中,service专门负责后台任务,broadcast负责接收随时可能出现的广播。而三者不在同一个进程或者线程中。
   今天思考项目中的一个问题时,特地考虑到这个问题,网上也是众说纷纭。后来自己做了一个实验,才最终得出结果。

   通过在activity,service,broadcast中调用

       Log.i ("MainActivity_OnCreate:" ,Thread .currentThread().getId ()+ ""+Thread .currentThread().getName ());
          

   得到的结果居然是一样的。这个时候我回过头来想,之前大家说的那句话:activity,service,braodcast,是工作在应用程序主线程即GUI线程中。

   那么,既然三者在同一进程的同一线程中,为何还要如此周折,弄出三个东西呢?
   我的理解是这样的。当android系统加载一个应用程序时,基于java技术的Dalvik虚拟机的一个实例被创建,由此创建一个运行在android上的进程。而应用程序主线程随后被创建(具体什么时候现在还没有研究。。。)。
   一个activity运行在主线程,提供与用户的复杂交互。它的生命周期是随用户选择而变化的。
   一个service运行在主线程,主要负责后台处理,在此需要强调的是,这里所谓的后台是指,用户看不见的,活动的应用程序主线程。在这个主线程中是需要长时间执行的任务。需要区分的是,不同于一个activity中的后台任务。
   一个broadcast运行在主线程,负责接收消息,这就要求,broadcast接收消息,处理消息过程必须短暂,不能妨碍主线程的工作。   

   举一个例子:音乐播放器,当音乐播放器应用程序打开的时候,activity被创建,用于用户的交互,用户点击了音乐播放,随后退出了activity(退出activity,不是把它放在后台),但音乐还在进行。那么音乐播放操作一定是放在service中的,因为activity退出了,不代表应用程序主线程退出了。进一步,既然service运行在GUI线程,为什么在activity中播放音乐的同时还可以执行下载等操作呢?这是因为,下载,播放音乐等耗时任务,被service,或者 activity这些运行在主线程中的组件放到了新开辟的线程中了。

图示如下:

综上所述,activity在主线程的意义偏向于交互,service偏向于用户看不见得后台维护。broadcast的意义在于独立于应用程序之上的消息传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值