您的位置:首页 > 移动开发 > Android开发

Android四大组件-学习记录

2017-05-06 20:29 246 查看
Activity的构成:

window –>DecorView—>我们的布局

我们的布局文件挂载在DecorView的mContentParent的节点下

Activity的4种启动模式:

standard

默认的启动模式,可以被实例化多次,如果这个activity非常耗费资源,这种模式下,程序就很耗费资源

singleTop

如果activity A已经在栈顶,那么再启动这个activity的时候,不会新建A的实例,而是重用这个实例,并回调onNewIntent方法。

如果A实例已经再栈中,但是不在栈顶,这个时候,表现行为和standard模式相同,也会新建A的实例。

singleTask

栈中只会有一个本Activity的实例,如果栈中没有,则在栈顶新建一个,如果栈中已经存在了,则将此实例之上的activity都销毁,将此activity漏出到栈顶,并回调onNewIntent。

singleInstance

如果系统中没有这个activity,那么会在一个新的任务栈中新建这样的一个activity,并且这个任务栈中只会有这一个activity,如果这个activity启动了其他activity,那么新启动的activity会运行到其他的任务栈中,整个系统中只会有一个实例存在

如果系统中已经有了这个activity实例,那么会重用这个实例,并回调onNewIntent。

和singleTask不同,singleTask是同一个栈中只能有一个实例,但是不同的栈中是可以同时存在的。但是singleInstance是系统中只能有一个实例,包括不同应用启动activity的情况。

Fragment

Fragment被嵌套在Activity中使用,是一个更大粒度的UI单元。

Service和aidl

service是运行在主线程的,所以如果做耗时操作,需要在service中起异步任务。

当程序所在的进程被杀掉,那么service也会死掉。

service生命周期

onStart—》 onStartCommand—》onDestroy

当调用startService的时候,会依次执行上述的生命周期函数,每次调用startService的时候onStartCommand都会被调用,但是不会新建service实例,只需调用一次stopService会stopSelf,service就会停止。

之前说过service运行在主线程中,不能做耗时操作。

IntentService

系统为我们提供了IntentService,用户的请求会执行在子线程中。

需要复写onHandleIntent函数,并将耗时任务写在此方法中。当任务执行完毕,intentService运行完毕会自己调用stopSelf结束。

前台Service

由于service运行在后台,所以优先级低,很容易被系统杀掉,想要不被系统杀掉,可以使用前台的service。前台service会在通知栏有条通知。

AIDL

进程间通信使用,利用bindService原理。service有两种启动方式,start和bind。start之前已经说过,而aidl用的就是bindservice。

BroadcastReceiver

运行完就会死掉,所以有可能程序会被系统杀掉,所以不要在BroadcastReceiver中起异步任务做耗时操作,而应在其中起service,在service中起异步任务。

android中的广播有以下几种:

1.普通广播:

无序的广播,不能终止广播的传递,也不能将结果传递给下一个接收者

可以动态注册 和 静态注册

动态: registerReceiver unRegisterReceiver

静态:通过manifest文件注册Broadcast Receiver。注意一定要有action。

2.有序广播

sendOrderedBoradcast(),通过在intent-filter中设置优先级来决定广播接受者的接受顺序,

同时,可以通过setResult将结果传递给下一个接收者,下一个接收者可以使用getResult方法获得结果,也可以使用abortBroadcast函数来终止广播的传递。

3.本地广播

本地广播指的是不是全局的广播,即只在应用的进程内广播

使用的类:LocalBroadcastManager.getInstance

通过获得LocalBroadcastManager对象,调用与普通广播一样的api。

4.sticky广播

滞留广播,广播发出去后,会一直存在,即便是先发送广播,后注册,也可以接受到。

需要注册权限:

API: sendStickyBroadcast removeStickyBroadcast

ContentProvider

数据共享的一种方式,实际上是对SQliteOpenHelper的一个封装,通过Uri映射来判断选择需要操作的数据库的表。之后使用ContentResolver来操作数据库。好处了,为各应用提供了一个统一的接口,内部的实现原理是通过UriMather,来把Uri映射到不同的表上,进而操作数据库中的不同的表。

Uri的格式:

schema authority path id

ContentProvider的shema已经被androd系统规定好了content://,authority用于标识那个contentprovider,path指的是表,id指的是查询条件

以联系人为例:

所有联系人的Uri: content://contacts/people

某个联系人的Uri: content://contacts/people/5

使用Uri.parse方法可以把字符串转化成Uri

实现ContentProvider就是实现它的实现类,实现相应的方法,之后,注册到manifest中,之后,其他应用就可以使用getContentResolver来获得ContentResolver实例,继而通过统一的增删改查接口来操作相应的数据了。

练习1:一个Activity中有两个fragment,例如横屏设备的新闻应用,Fragment A展示新闻的标题列表,Fragment b展示选中的新闻详细内容。

练习2:写个IntentService,start两次,看两个线程是否同时运行。

练习3:前台service, 学习TaskStackBuilder

练习4:process属性的使用,Binder机制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android笔记