四大组件:
活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)、内容提供器(Content Provider)
活动:是一种可以包含用户界面的组件,主要用于和用户进行交互。
活动状态:1、运行状态:一个活动位于返回栈的栈顶时,这时活动就处于运行状态。
2、暂停状态:当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。
3、停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
4、销毁状态:当一个活动从返回栈中移除后就变成了销毁状态。
活动的生命周期:
onCreate():活动第一次被创建的时候调用。在此方法中完成活动的初始化操作,如加载布局、绑定事件等。
onStart():在活动由不可见变成可见的时候调用。
onResume():在活动准备好和用户进行交互的时候调用。此时活动一定处于返回栈的栈顶,并且处于运行状态。
onPause():在系统准备去启动或者恢复另一个活动的时候调用。
onStop():在活动完全不可见的时候调用。如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行, 而onStop()方法不会执行。
onDestroy():在活动被销毁之前调用,之后活动的状态将变成销毁状态。
onRestart():在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
以上7个方法中,除了onRestart()方法,其他都是两两相对的,从而又可将活动分为3种生存期:
完整生存期:活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。
可见生存期:活动在onStart()方法和onStop()方法之间所经历的,就是可见生存期。
前台生存期:活动在onResume()方法和onPause()方法之间所经历的,就是前台生存期。
活动的启动模式:standard、singleTop、singleTask、singleInstance。可以在AndroidManifest.xml中通过给<activity>标签指定 android:launchMode属性来选择启动模式。
standard:在standard模式(即默认情况)下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对 于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的 一个新的实例。
singleTop:在启动活动时,如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
singleTask:每次启动该活动时,系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实 例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
singleInstance:会启动一个新的返回栈来管理这个活动。
安卓六大基本布局:线性布局LinearLayout、表格布局TableLayout、相对布局RelativeLayout、
帧布局FrameLayout、绝对布局AbsoluteLayout、网格布局GridLayout
Fragment:是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕空间。
Fragment状态:1、运行状态:当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。
2、暂停状态:当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关联的可 见碎片就会进入到暂停状态。
3、停止状态:当一个活动进入停止状态时,与它相关联的碎片就会进入到停止状态,或者通过调用 FragmentTransaction的remove()、replace()方法将碎片从活动中移除,但如果在事务提交之前 调用addToBackStack()方法,这时的碎片也会进入到停止状态。总的来说,进入停止状态的碎片 对用户来说是完全不可见的,有可能会被系统回收。
4、销毁状态:当活动被销毁时,与它相关联的碎片就会进入到销毁状态。或者通过调用 FragmentTransaction的remove()、replace()方法将碎片从活动中移除,但如果在事务提交之前并 没有调用addToBackStack()方法,这时的碎片也会进入到销毁状态。
碎片的回调方法:onAttach():当碎片和活动建立关联的时候调用。
onCreateView():为碎片创建视图(加载布局)时调用。
onActivityCreated():确保与碎片相关联的活动一定已经创建完毕的时候调用。
onDestroyView():当与碎片关联的视图被移除的时候调用。
onDetach():当碎片和活动解除关联的时候调用。
广播分为两种类型:1、标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收 到这条广播消息,因此它们之间没有任何先后顺序可言。效率高,无法被截断。
2、有序广播:是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广 播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。此时的广播接收器是 有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可 以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
安卓实现数据持久化的3种方式:文件存储、SharedPreferences存储、数据库存储。
文件存储:最基本的一种数据存储方式,不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保 存到文件当中,适合用于存储一些简单的文本数据或二进制数据。
SharedPreferences存储:使用键值对的方式来存储数据。
得到SharedPreferences对象的方法:
1、Context类中的getSharedPreferences()方法;
2、Activity类中的getPreferences()方法;
3、PreferenceManager类中的getDefaultSharedPreferences()方法。
内容提供器(Content Provider):主要用于在不同的应用程序之间实现数据共享的功能。允许一个程序访问另一个程序中的数 据,同时还能保证被访数据的安全性。使用内容提供器是Android实现跨程序共享数据的标准 方式。
不同于文件存储和SharedPreferences存储中的两种全局可读写操作模式,内容提供器可以 选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。
内容提供器的两种用法:1、使用现有的内容提供器来读取和操作相应程序中的数据;
2、创建自己的内容提供器给我们程序的数据提供外部访问接口。
服务(Service):是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的 任务。
Android的UI是线程不安全的。如果想要更新应用程序里的UI元素,则必须在主线程中进行,否则就会出现异常。
安卓中的异步消息处理主要由4个部分组成:Message、Handler、MessageQueue、Looper
Message:是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同的线程之间交换数据。
Handler:主要是用于发送和处理消息。发送消息一般是使用Handler的sendMessage()方法,而发出的消息经过 一系列地辗转处理后,最终会传递到Handler的handleMessage()方法中。
MessageQueue:消息队列。主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等 待被处理。每个线程中只会有一个MessageQueue对象。
Looper:是每个线程中的MessageQueue的管家,调用Looper的loop()方法后,就会进入到一个无限循环当中, 然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方 法中。每个线程中也只会有一个Looper对象。
异步消息处理流程:首先需要在主线程中创建一个Handler对象,并重写handleMessage()方法。然后当子线程中需要进行UI 操作时,就会创建一个Message对象,并通过Handler将这条消息发送出去。之后这条消息会被添加到 MessageQueue的队列中等待被处理,而Looper则会一直尝试从MessageQueue中取出待处理消息,最后分 发回Handler的handleMessage()方法中。
Service中唯一的一个抽象方法:onBind(),必须要在子类中实现。
Service最常用到的3个方法:onCreate()、onStartCommand()、onDestroy()。
onCreate():在服务创建时调用。
onStartCommand():在每次启动服务时调用。
onDestroy():在服务销毁的时候调用。
启动和停止服务,主要借助Intent来实现。
Service的生命周期:
startService() -> onCreate() -> onStartCommand() -> stopService()/stopSelf(),每调用一次startService()方法, onStartCommand()就会执行一次,但实际上每个服务都只会存在一个实例,所以不管调用多少次 startService()方法,只需调用一次stopService()或stopSelf()方法,服务就会停下来了。
bindService() -> onCreate() -> onBind()
当调用了startService()方法后,又去调用stopService()方法,这时服务中的onDestroy()方法就会执行,表示服务已 经销毁。类似的,当调用了bindService()方法后,又去调用unbindService()方法,onDestroy()方法也会执行。当一 个服务既调用了startService()方法,又调用了bindService()方法,这种情况下要同时调用stopService()和 unbindService()方法,onDestroy()方法才会执行。
Intent:是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之 间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景。
Intent大致可分为两种:显式Intent、隐式Intent
使用Intent来传递对象通常有两种实现方式:Serializable和Parcelable
Bundle:主要用于传递数据。它保存的数据,是以key-value(键值对)的形式存在的。
Bundle经常使用在Activity之间或者线程间传递数据,传递的数据可以是boolean、byte、int、long、float、double、string等基本类型或它们对应的数组,也可以是对象或对象数组。
当Bundle传递的是对象或对象数组时,必须实现Serializable或Parcelable接口。
Bundle提供了各种常用类型的putXxx()/getXxx()方法,用于读写基本类型的数据。
Adapter:是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。
常用的几个adapter:BaseAdapter,ArrayAdapter,SimpleAdapter,SimpleCursorAdapter
BaseAdapter:是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
ArrayAdapter:支持泛型操作,最为简单,只能展示一行字;
SimpleAdapter:有最好的扩充性,可以自定义出各种效果。
SimpleCursorAdapter:可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。