「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
四大组件
Android 的四大组件有 Activity、Service、Broadcase receiver、Content provider
Activity
Activity是用户和应用的交互窗口,显示控件、视图,并且可以监听用户的事件,做出响应
1) 生命周期:
onCreate() → onStart() → onResume() → Activity running → onPause() → onStop() → onDestory()
onCreate():Activity被创建的时候调用,一些初始化操作可以在这里完成
onStart():Activity由不可见变为可见的时候调用
onResume():Activity已经可见,并且可以和用户进行交互
onPause():系统准备去启动或者恢复另外Activity的时候调用
onStop():Activity 由可见变为完全不可见
onDestory():Activity 即将被销毁
2) 生命周期遇到的问题:
(1) 用户从A,跳转到B,假设B全部遮挡住了A:
A.onPause() → B.onCreate() → B.onStart() → B.onResume() → A.onStop()
(2) 此时如果点击Back键:
B.onPause() → A.onRestart() → A.onStart() → A.onResume() → B.onStop() → B.onDestory()
(3) 如果按下Back键,系统回到桌面:
A.onPause() → A.onStop() → A.onDestory()
(4) 如果按下Home键,系统返回桌面
A.onPause() → A.onStop()
3) Activity的启动模式
任务栈(Task):Android系统采用栈结构来管理应用程序运行过程中所启动的Activity,即任务栈
Activity的启动模式有四种:standard、singleTop、singleTask、singleInstance
(1) standard:系统默认启动模式,每次启动一个Activity,都会创建一个实例,无论这个实例是否已经被创建
(2) singleTop:如果新Activity位于栈顶,不会重新创建;如果新Activity已经存在但不位于栈顶,仍会创建新的Activity
(3) singleTask:只要Activity在一个栈中存在,多次启动这个Activity都不会重新创建实例,而是将这个Activity上面的Activity全部出栈,直到这个Activity位于栈顶。
(4) singleInstance:要求创建的Activity只能单独位于一个任务栈中,并且这个任务栈中只允许有一个实例存在
(5) Activity常见的Flags
FLAG_ACTIVITY_NEW_TASK:为Activity指定“singleTask”启动模式
FLAG_ACTIVITY_SINGLE_TOP:为Activity指定“singleTop”启动模式
FLAG_ACTIVITY_CLEAR_TOP:有此标志位的Activity,当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。若该Activity为standard启动模式,那么它自身也会出栈,系统会重新创建这个Activity的实例放入栈顶。根据前面的内容可知,singleTask启动模式默认具有此标记位的效果
Service
是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行
1) 生命周期
(1) startService:
onCreate() → onStartCommand() → Service running → onDestory()
(2) bindService
onCreate() → onBind() →. . . → onUnbind() → onDestory()
2) startService()与bindService()区别:
started service(启动服务)是由其他组件调用startService()方法启动的,这导致服务的onStartCommand()方法被调用。当服务是started状态时,其生命周期与启动它的组件无关,并且可以在后台无限期运行,即使启动服务的组件已经被销毁。因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其他组件调用stopService()方法停止
bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止
Broadcase receiver
广播是一种广泛运用的在应用程序之间传输信息的机制。而广播接收器是对发送出来的广播进行过滤接受并响应的一类组件
广播接收者的注册有两种方法,分别是程序动态注册(在运行时的代码中使用Context.registerReceive()进行注册)和AndroidManifest文件中进行静态注册
动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用
Content provider
使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据
ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见
ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理
例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式