之前以为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的意义在于独立于应用程序之上的消息传递。