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机制
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-学习记录-四大组件总结(2)
- Android 四大组件学习之activity的四种加载模式介绍
- android学习日记19--四大组件之Services(服务)
- Android四大组件学习(一)---Activity
- Android成长日记-Android四大组件之Service组件的学习
- Android四大组件深入学习
- android 学习教程五---- 四大组件之一Activity 详解
- Android学习日志13__四大组件04__ContentProvider
- Android学习之四大组件
- Android学习之路——Android四大组件之activity(二)数据的传递
- Android四大组件之一Service介绍-android学习之旅(十二)
- Android 学习笔记 —— Android 四大组件 与 MVC 架构模式
- android 四大组件之service学习总结(一)
- Android学习记录 - 视图组件
- Android四大组件之Content Provider的学习
- Android四大组件学习
- Android开发学习之四大组件
- Android学习日志10__四大组件01__activity
- Android四大组件之一Service介绍-android学习之旅(十二)
- 黑马程序员------学习笔记(10)Android四大组件