Android四大组件知识整理
###1. Activity
1.1 什么是Activity?
Activity是Context的子类,并可以处理与窗体用户的事件;
1.2 Activity的生命周期
不存在->`onCreate()`->`onStart()`->`onResume()`->`onPause()`->`onStop()`->`onDestory()`;
1.3 横竖屏切换生命周期;
当没有设置android:configChanged时,切屏会重新调用各个生命周期,默认首先会销毁当前Activity, 然后重新加载;
如果设置了android:configChanged时,切屏时就不会重新调用各个生命周期,只会调用`onConfigurationChangded()`方法;
1.4 Activity的启动模式
- standard模式,每次激活Activity时,都会重新创建Activity实例,并放入Activity栈中;
- singleTop模式,激活Activity时,会先判断任务栈顶是否存在该Activity的实例,如果存在,则重用该实例,否则就重新建立一个新实例;
- singleTask模式,激活Activity时,会判断任务栈里是否存在该Activity的实例,如果存在,则重用该实例,并将处于该实例的其他Activity出栈,将该Activity实例置于栈顶;
- singleInstance模式,在一个新栈中创建一个Activity实例,一旦该模式中的Activity存在于某个栈中,则任何再激活该Activity的应用,都会重用该栈中的实例。
1.5 后台Activity被系统回收,应怎样保存Activity的状态?
在onSaveInstance()方法中保存Activity状态,在重新创建该实例时,在onCreate()方法中,判断saveInstance是否为空,如果不空,则恢复Activity的状态;
1.6 Activity中数据的传递
基本类型的数据,如int,String等,通过Intent来传递数据;可以让对象实现序列化接口,然后也可以通过Intent传递数据;
2. Service
2.1 什么是Service?
Service是应用程序执行一些长时间运行在后台,不用与用户交互的任务的组件,或者是为其他的应用程序提供服务的;同样的,(如果没有指明Service的运行进程)Service默认是运行在UI主进程中的,因此不能在Service中执行一些耗时的操作,耗时操作可以重新启动一个新线程来执行。
2.2 Service生命周期
Service的完整周期方法为:
- 非绑定情况下:
onCreate()
->onStartCommand()
->onDestroy()
, - 绑定情况下:
onCreate()
->onBind()
->onUnbind()
->onDestroy()
;
2.3 Service启动方法:
2.3.1. 非绑定
当系统调用`Context.startService(Intent)`来启动Serice时,Service会执行生命周期方法`onCreate()`->`onStartCommand()`,这时系统中就会有该Service的实例,如果系统中存在该Serivce实例时,再调用`Context.startService()`,只会执行`onStartCommand()`方法,而不会执行`onCreate()`方法;Service启动后,就会一直运行于后台,直到调用`Context.stopService()`或`stopSelf()`方法,才会调用`onDestroy()`方法销毁Service实例;而且Service还可以根据`onStartCommand()`方法的返回值来决定这个Serivice的运行模式:
START_STICKY
,如果这个Service在执行完onStartCommand()
方法后,被系统杀掉,保留这个Service为开始状态,但不保留Intent对象,因此如果后面没有新的Intent对象传进来,则系统会用null的Intent对象来,调用onStartCommand()
方法重新创建该Service实例;START_NOT_STICKY
如果这个Serice在执行完onStartCommand()
方法后,被系统杀掉,那么这个Service实例不会立刻重新创建,直到有接收到新的Context.startService(Intent)
,会根据新的Intent来重新创建Service的实例(如果Intent为空,则不会创建);如在做网络相关的工作时;START_REDELIVER_INTENT
,如果这个Service在执行完onStartCommand()
方法后,被杀掉,则系统会用最后传给Service的Intent对象来执行onStartCommand()
方法创建这个Service实例,适用于立即恢复正在进行的工作,如下载;
2.3.2. 绑定,
当系统调用`Context.bindService()`来启动Service时,Service会执行生命周期方法`onCreate`->`onBind()`,执行完后,就将调用者与这个Service实例绑定在一起了,当调用者退出或者调用者主动调用`unbindService()`来主动停止Service后,Service实例也会自动调用`onUnbind()`->`onDestory()`退出;
需要注意的是,当用`Context.startService(Intent)`来启动Serivice后,如果再调用Context.bindService()后,这个Serivice实例在被销毁时,需要调用unbindService()后,这个实例都会被销毁;
2.4 IntentService
IntentService是Service用来处理异步请求的一个子类,在Service里的操作默认是运行在主线程中的,而IntentService会重新生成一个工作线程,来处理需要Service处理的操作,这个操作并不会影响UI主线程正常工作。需要的时候,通过startService(intent)来启动一个IntentService,当IntentService的工作线程里的所有Intent都被处理完后,这个IntentService会自动停止运行。
我们可以新写一个类继承自IntentService,然后复写onHandleIntent(Intent)方法,就可以在程序里使用这个IntentService来处理Intents。处理的时候,每次都从工作线程里取出一个Intent对象让IntentService对象处理,直到工作线程为空时,这个IntentService对象就会销毁;
2.5 如何保证Service杀不死?
- 充分利用onStartCommand()方法的返回值;
- 在Service的onDestory中重启该Service;
- 动态注册一个广播,在广播里重启该Service;
3 BroadcastReceiver
`BroadcastReceiver`是用来接收处理通过广播发送的`Intent`对象的组件。`BroadcastReceiver`也是没有界面的,但它可以启动一个Activity来响应他们接收到的信息,或者用`NotificationManager`来通知用户。如果你不用在应用间发送广播,则应该与`LocalBroadcastManager`结合使用,这样保证更高效和更安全。
3.1 BroadcastReceiver的使用:
我们可以通过`Context.registerReceiver()`方法来动态注册一个`BroadcastReceiver`,也可以在配置文件里,静态注册一个广播;
3.2 广播的种类:
广播又可以分为无序广播和有序广播:
- 无序广播,通过
Context.sendBroadcast()
方法发送的广播,所有这个广播的BrocastReceiver
都是在无序的情况下接收这个广播,几乎可以在同一时间收到这个广播,更有效率,但意味着``BrocastReceiver`在收到这个广播后,也不能中止这个广播的传递; - 有序广播,通过
Context.sendOrderedBroadcast ()
方法发送的广播,它一次只会传递给一个BrocastReceiver
,由于每个BrocastReceiver
是依次执行的,因此前面的BrocastReceiver
可以将结果传递给下一个BrocastReceiver
,或者中断广播的继续执行。我们可以通过设置android:priority
来设置BrocastReceiver
的优先级,如果没有设置优先级,默认是按照注册的顺序进行广播。
4 ContentProvider
ContentProvider是Android应用程序的重要组成部分,用来为应用程序提供内容,如果你需要在应用程序间共享一些数据,那么就应该使用ContentProvider,如果不用在应用程序间共享数据,则直接使用SQLiteDatabase来存储数据。我们需要了解的方法有:
方法名 | 方法描述 |
---|---|
onCreate() | 初始化一个provider,只能在应用主线程中调用 |
query(Uri, String[], String, String[], String) | 为调用者返回需要的内容,可以在任意一个线程中调用 |
update(Uri, ContentValues, String, String[]) | 更新已经存在provider中的内容 |
delete(Uri, String, String[]) | 从provider中删除数据 |
getType(Uri) | 得到在provider中的内容的MIME TYPE |
其中Uri是每个ContentProvider的标识;
Android四大组件知识整理的更多相关文章
- Android四大组件简介:Android 基础知识,开发教程
Android 四大组件: Activity.Service.Broadcast Receiver.Content Provider. http://developer.android.com/int ...
- Android 四大组件之" ContentProvider "
前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...
- Android四大组件之一“广播”
前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...
- Android四大组件及activity的四大启动模式
Android四大组件 1. 广播接收者的两种类型: (1)系统广播接收者,就是继承BroadcastReceiver这个类,然后还要在清单文件中注册,注册之后给他一个action.当系统发生了这个a ...
- Android 四大组件之“ BroadcastReceiver ”
前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ...
- android四大组件--ContentProvider具体解释
一.相关ContentProvider概念解析: 1.ContentProvider简单介绍 在Android官方指出的Android的数据存储方式总共同拥有五种,各自是:Shared Prefere ...
- 【转】android四大组件--ContentProvider详解
一.相关ContentProvider概念解析: 1.ContentProvider简介在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences. ...
- Android四大组件:Service
前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍对Service进行全面介绍(基础认识.生命周期.使用和应用场景) 目录 目录 1. 基础知识 定义:服务,属于Androi ...
- Android 四大组件 与 MVC 架构模式
作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是 ...
随机推荐
- 第12章 Java字符串
1.什么是Java中的字符串 字符串String并不是一种数据类型,而是一个类对象,在java.lang包中,只不过在默认情况下java都是自动导入的,所以可以直接使用创建一个String对象的方法有 ...
- 第3章 Linux常用命令(1)_文件处理命令
1. 文件处理命令 1.1 命令格式:命令 [-option] [arguments],如ls –la /etc (1)个别命令使用不遵循此格式 (2)当有多个选项时,可以写在一起,如以上的-la ( ...
- H5框架之Bootstrap(二)
H5框架之Bootstrap(二) 突然感觉不知道写啥子,脑子里面没水了,可能是因为今晚要出去浪,哈哈~~~提前提醒大家平安夜要回家哦,圣诞节生00000000000这么多蛋....继续 上一篇的已经 ...
- Macbook被格式化之后
macbook不小心被手贱格式化了,开机显示一个大问号. 于是查询得到恢复方式是使用command+R. 照做了,试了好几次,那个地球还是卡住不动的.都没有提示让我输入wifi密码. 于是又查了一下, ...
- Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]
目录 前言 现象 源码分析 实战例子 总结 参考资料 前言 今天研究了一下tomcat上web.xml配置文件中url-pattern的问题. 这个问题其实毕业前就困扰着我,当时忙于找工作. 找到工作 ...
- Linux 中 Nginx 重启关闭
如果服务器正在运行的 Nginx 要进行升级.添加或删除模块时. 我们需要停掉服务器并做相应修改,这样服务器就要在一段时间内停止服务. Nginx可以在不停机的情况下进行各种升级动作而不影响服务器运行 ...
- 覆盖问题:最大覆盖问题(Maximum Covering Location Problem,MCLP)和集覆盖问题(Location Set Covering Problem,LSCP)
集覆盖问题研究满足覆盖所有需求点顾客的前提下,服务站总的建站个数或建 设费用最小的问题.集覆盖问题最早是由 Roth和 Toregas等提出的,用于解决消防中心和救护车等的应急服务设施的选址问题,他们 ...
- C 语言学习 第五次作业总结
第五次作业,主要学习和复习的是几种循环结构的使用. 在前一次的课堂上,同学们已经学习了分支语句的使用.分支语句和循环语句配合使用,就可以写出更多的,逻辑功能丰富的代码了. 逻辑功能的丰富,也意味着学习 ...
- Android ORM 框架之 greenDAO 使用心得
前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM ...
- memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...