一、Activity
用户可操作的可视化界面,为用户提供一个完成操作指令的窗口
二、Service
运行在手机后台,适合执行不需要和用户交互且还需要长期运行的任务。
Service分为两种,一种是Service(这一种是运行在主线程中的,如果要执行耗时操作,可在service中创建一个异步来执行),一种是IntentService(这是一种异步服务,是继承于Service的子类),所以推荐当要执行耗时操作时使用IntentService,如果不耗时,我们可以使用Service。
Service的两种启动方式:
通过startService方法启动服务,通过stopService方法停止该服务。
特点:通过startService方法启动的service一旦服务开启就跟调用者没有任何关系了。调用者退出了,服务还在后台运行,调用者不能调用服务里面的方法。
通过bindService方法启动服务,通过unbindService方法停止该服务。
特点:使用bindService方法启动的服务,调用者退出,服务也停止了,调用者可以调用服务中的方法。
onCreate()
1.如果service没被创建过,调用startService()后会执行onCreate()回调;
2.如果service已处于运行中,调用startService()不会执行onCreate()方法。
也就是说,onCreate()只会在第一次创建service时候调用,多次执行startService()不会重复调用onCreate(),此方法适合完成一些初始化工作。
onStartCommand(Intent intent, int flags, int startId)
如果多次执行了Context的startService()方法,那么Service的onStartCommand()方法也会相应的多次调用。onStartCommand()方法很重要,我们在该方法中根据传入的Intent参数进行实际的操作,比如会在此处创建一个线程用于下载数据或播放音乐等。
onBind(Intent intent)
Service中的onBind()方法是抽象方法,Service类本身就是抽象类,所以onBind()方法是必须重写的,即使我们用不到。
1.bindService启动的服务和调用者之间是典型的client-server模式。调用者是client,service则是server端。service只有一个,但绑定到service上面的client可以有一个或很多个。这里所提到的client指的是组件,比如某个Activity。
2.client可以通过IBinder接口获取Service实例,从而实现在client端直接调用Service中的方法以实现灵活交互,这在通过startService方法启动中是无法实现的。
3.bindService启动服务的生命周期与其绑定的client息息相关。当client销毁时,client会自动与Service解除绑定。当然,client也可以明确调用Context的unbindService()方法与Service解除绑定。当没有任何client与Service绑定时,Service会自行销毁。
当执行到onServiceConnected回调时,可通过IBinder实例得到Service实例对象,这样可实现client与Service的连接。
三、BroadcastReceiver
运行在应用程序间传输信息,可以使用广播接收器来让应用对一个外部事件做出响应。
广播分为两种,一种是普通广播,或者称为无序广播,另一种是有序广播。
无序广播是完全异步的,同一时刻在逻辑上是能够被所有的接收者接收到的,传递的效率高,缺点是接收者不能处理结果传给下个接收者,并且无法终止广播的传播(有序广播就是和这个相反的,有顺序的传播,两个广播的定义就是完全相反的)。
Context.sendBroadcast()
发送的是普通广播,所有接收者都有机会获得并进行处理。
有序广播是根据你在清单中为每个reciver设置priority的大小(越大优先级越高)将消息依次的传递(由高到低),拦截可以使用abortBroadCast来拦截,使用sendOrderBroadCast发送广播。
广播的生命周期就是在处理完onReceive时,系统将认定他不是一个活动的对象了,就是杀掉他,由于广播的生命周期很短,所以不建议在onReceive中执行一些耗时操作。
静态注册:在清单文件中注册
动态注册:在代码中registerReceiver。
静态注册是常驻型,也就是说当应用程序关闭后,如果有广播来,程序也会被系统调用运行起来。
动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。
四、ContentProvider
内容提供器,它主要的作用是进程间进行数据交互和共享,即跨进程通信。
被访问的数据主要以数据库的形式存在,而且还可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。ContentProvider是android中一种跨程序共享数据的重要组件。ContentProvider通过uri来标识其它应用要访问的数据,通过ContentResolver的增、删、改、查方法实现对共享数据的操作。
它和Activity一样也需要我们再xml文件中声明。
统一资源标识符(URI):唯一标识 ContentProvider 和其中的数据,外界进程通过 URI 找到对应的ContentProvider & 其中的数据,再进行数据操作。
ContentResolver类:统一管理不同 ContentProvider间的操作。