Android-四大组件生命周期及扩展
Activity 活动
Service 服务
Content Provider 内容提供者
BroadcastReceiver 广播接受器
Activity 活动(负责用户界面的显示和交互)
1.生命周期:
onCreate()-onStart()-onResume()-onPause()-onStop()-onRestart()-onDestory()
⚠️⚠️⚠️:
a.其中 onstart(不可见-可见) onstop(可见-不可见)
onresume(获得焦点,可交互) onpause(失去焦点、不可交互)
oncreate方法中有一个bundle参数用于恢复activity意外销毁时保存的数据,bundle不为空,取数据。
意外销毁时(不是自己调用finish())在onSavedInstanceState方法中保存当前的状态。调用大多在onpause之前
onpause中保存持久化数据、在onSavedInstanceState中保存的是瞬时数据。
onRestoreInstanceState()在在onStart()之后调用
b.点back键:onpause onstop ondestory返回的活动 oncreate onstart
点home键:onpause onstop返回前台onrestart onstartonresume
一个对话框来到前台:onpause对话框消失onresume
c.A页面-B页面跳转 若B覆盖A: onpause(A)-oncreate-onstart-onresume-onstop(A)
A页面-B页面跳转 若B透明,没有覆盖A:
onpause(A)-oncreate-onstart-onresume
d.横竖屏切换:不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
2.Activity的退出:
结束一个活动:Activity---finish –>onpause onstop ondestory
结束进程:
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(int code)
这两个方法,会使activity非正常退出,不会去执行onpause onstop ondestory
3.fragment生命周期
onAttach()---fragment初次依附到activity上调用
onCreate()---初始化fragment
onCreateView()---初始化fragment视图
onActivityCreated()---fagment所依附的activity创建
onStart()---由不可见-可见
onResume()---获取焦点
onPause()---失去焦点
onStop()---可见-不可见
onDestoryView()--fragment视图被销毁
onDestory()--fragment被销毁
onDetach()--fragment不再依附activity
Service 服务(在后台完成用户指令,没有图形界面)
1.生命周期:
startService() 方式启动Service
onCreate() onStartCommand() 调用stopService() onDestory()
⚠️⚠️⚠️:一个service只会创建一次,只有第一次执行的时候会执行oncreate()
之后再执行只会调用onstartcommand()
bindService()方式启动Service
onCreate() onBind() onUnbind() onDestory
采用bind方式 和activity绑定,一但销毁activity,与之绑定的service也就相应结束。“不求同时生,必须同时死”
Content Provider 内容提供者(给其他应用程序提供指定数据集,共享数据)
Content Provider 内容提供者,用于对外提供数据
Content Resolver 内容解析者,用户获取提供者提供的数据(外部应用通过resolver来访问provider)
Content Observer 内容监听器,可以监听数据的改变状态
使用Content Provider对外共享数据的步骤:
定义一个类继承Content Provider,然后重写query、insert、delete、update方法等
BroadcastReceiver 广播接受器(主要用于接受系统或app发送的广播事件--通信)
使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应(通过启动activity或service来响应收到的信息,或者用NotificationManager来通知用户)。
1.注册方式:
动态注册 在activity或service中注册,它们若被销毁,广播也就接受不到了。
静态注册 AndroidManifast.xml中,只要app在运行就一直能接收到广播。
2.生命周期:onReceive()
生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报ANR 程序无响应的错误信息。
如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由Service 来完成。
不要在广播接受者中创建子线程,因为它的生命周期非常短,子线程可能还没有结束BroadcastReceiver 就先结束了,子线程相应也就结束了。
3.广播类型:
普通广播:
sendBroadcast(Intent intent)发送广播
优点:效率高
缺点:一个接受者不能将处理结果传递给下一个接受者,并且无法终止广播的传播
有序广播:
sendOrderedBroadcast(intent, receiverPermission)
缺点:效率低
优点:按优先级别由高到低依次传播,高级别的或同级别先接收到广播的可以通过abortBroadcast()方法截断广播使其他的接收者无法收到该广播。也可以通过setResultExtras(bundle)方法将处理结果存入bundle中,下一个接受可以通过getResultExtra(true) 方法获取上一个接受者传来的bundle数据。