标签:android style blog http color java 使用 os
本章节所有内容皆为原创,如需转载,请注明出处。
http://blog.csdn.net/manoel/article/details/38462631
很久没写博客了,一是因为自身水平有限,怕误人子弟;二是因为感觉没什么可写的;三是因为时间有限,要寻找工作、学习和生活之间的平衡。
最近一直在研究和梳理Android多线程编程的东西,希望能够把这些分享给大家。
想必做过Android应用开发的同学应该都会知道,多线程是一个特别“诡异”的地方。之所以称为“诡异”,是因为多线程产生的bug是非常难以复现的,而且是毫无规律的。
又有什么比“毫无规律”让程序员感到可怕的呢。
如果对Android开发还不是特别了解的同学,可以参考我之前翻译的Android开发教程。
http://blog.csdn.net/column/details/development4android.html
近期,我会不定时地更新一些关于Android多线程的原理和技巧,都是我自己对一些实践的总结,希望能做到深入浅出。
好了,进入正题。想要了解Android多线程的机制,还是先从整个Android的架构说起吧。
一个程序的基础是Application对象以及Android的组件:Activity,Service,BroadcastReceiver和ContentProvicer。
一个程序在Java中的表达方式就是android.app.Application对象。当程序开启的时候,这个对象被创建,程序停止时被销毁。也就是说,Application对象经历一个Linux进程的完整生命周期。当Linux进程重新开启的时候,一个新的Application对象也被创建了。
Android的组件包括Activity,BroadcastReceiver,Service和ContentProvider。
这些实体有不同的责任和生命周期,但它们都代表了程序的入口,也就是程序启动的地方。
一个组件唤醒另一个组件是通过Intent才能实现的,这个过程可以发生在同一个程序中或多个程序之间。Intent分为显式的和隐式的:
组件的生命周期是Android系统特定的技术,它们不与潜在的Java对象匹配。一个Java对象可以比它的组件存活的时间要久,并且,Dalvik虚拟机可以保存与一个组件的对应的多个对象。小心,这会导致内存泄漏。我会在后面对多线程造成的内存泄漏进行分析。
通常,实现一个组件的方式是子类化它。并且,一个程序中所有的组件都要在AndroidManifest.xml中进行注册。
一个Activity就是一个屏幕,通常占据了设备的全部屏幕尺寸。它用来展示信息,处理用户的输入等。包括所有的UI组件,例如按钮,文本框,图片等。
Activity持有一个对所有视图树的对象引用,所以它占据的内存会变的很大。
当用户在不同的屏幕之间导航的时候,Activity实例从一个栈里面被初始化。当导航到一个新的屏幕时,一个新的Activity被压入到栈里,当返回到之前的屏幕时,Activity被从栈中弹出。
在下面的图中,首先开启了一个Activity A,接着切换到B,同时A销毁;然后切换到C和D。A,B,C是全屏显示的,但是D是窗口模式的,仅仅占据了屏幕的一部分空间。A完全被销毁了,B是不可见的,C是部分可见的,D是全部可见的,并且D在栈顶。因此,D获得了焦点并且可以接收用户的输入。Activity在栈里面的位置,决定了Activity的状态:
一个程序中最顶端的Activity,对这个程序在系统中的优先级是有一定影响的。这里所谓的优先级就是进程的优先级,这将影响一个程序被终止的几率和分配给这个程序中线程的执行时间。
按返回键或者调用finish()方法都会终止一个Activity的生命周期。
Service是在后台执行的,它是不可见的,和用户之间也没有任何交互的。可以用来从其他组件卸载一些操作,这些操作比那些组件活的要长。一个Service可以用过两种方式去执行,start或bind:
一个程序想要共享大量的数据,不管是在这个程序中,还是多个程序之间,都可以使用ContentProvider。
它提供了获取数据的入口,通常适合SQLite数据库一起使用。SQLite数据库是对程序私有的,但是通过ContentProvider就可以实现进程之间的数据共享了。
它监听从一个程序之中,程序之间,或系统发出的Intent。总而言之,就是它监听手机中所有的Intent,然后过滤这些收到的Intent,确定哪一个需要被处理。
一个BroadcastReceiver应该动态注册,也就是说注册在需要使用它的地方,这样可以对它进行控制。
如果静态注册在了AndroidManifest.xml中,那么当这个程序在安装的时候,它就一直在监听Intent,不管这些Intent对它是不是有用。
如此一来,如果某一个Intent匹配了某一个IntentFilter,那么这个BroadcastReceiver就会开启与之关联的程序。
这里详细说一下,假设有一个程序A,在AndroidManisest.xml中注册了一个监听网络变化的BroadcastReceiver。
此时,A没有被打开,也就是说此时系统中并没有A的进程。
当系统的网络发生变化时,因为这个BroadcastReceiver的存在,A的进程被创建了,A对应的Application对象也会被创建!
因为BroadcastReceiver被认定是进入一个程序的入口,这种入口还包括Activity,Service和ContentProvider。
Android 并发编程:(一)基础知识 —— 架构和组件,布布扣,bubuko.com
标签:android style blog http color java 使用 os
原文地址:http://blog.csdn.net/manoel/article/details/38462631