Android四大组件

Android四大组件之一——Activity服务

intent是activity、broadcast和service的三者间信使

五种状态

状态说明
1. 启动Active(点击)可见,未获得焦点,瞬间动作,立马进入Running
2. 运行Running(当前手机的屏幕时运行的APP)可见,焦点停留在本状态的Activity,位于屏幕的最前端
3. 暂停Paused(当前APP中出现其他句柄的控件,并且一定需要点击才可以返回)可见,失去焦点(不响应)
4. 停止Stopped(HOME键切换为其他应用)不可见,失去焦点,内存仍被保存在本Activity中未清理
5. 销毁Dead(清理应用的时候)把Activity中的内存清空,并且把Activity清除返回栈

七个方法

方法说明
1.onCreate()当Activity可见未获得用户焦点不能交互时系统会调用
2.onStart()当Activity已经停止然后重新被启动时系统会调用
3.onResume()在Activity获取得到焦点开始可以与用户进行交互的时候调用
onSaveInstanceState()用来保存Activity被杀之前的状态,当此Activity再次被实例化时会通过onCreate(Bundle savedInstanceState)将已经保存的临时状态数据传入
当出现按下HOME键、按下电源按键、关闭屏幕、横竖屏切换等情况时,仅重写onSaveInstanceState()来记录activity的临时状态,而使用onPause()来存储持久数据。
4.onPause()当Activity被新的Activity完全覆盖不可见时被系统调用
5.onStop()当Activity(用户调用finish()或系统由于内存不足)被系统销毁杀掉时系统调用,(整个生命周期只调用1次)用来释放onCreate()方法中创建的资源,如结束线程等
6.onDestroy()在Activity要销毁时调用
7.onRestart()在Activity从Stopped再次获取得到焦点启动时调用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Android四大组件之二——BroadcastReceiver广播接收器

三种广播

广播形式说明
1. 普通广播通过Context.sendBroadcast(Intent myIntent)发送
2. 有序广播通过Context.sendOrderedBroadcast(intent, receiverPermission)发送
3. 异步广播通过Context.sendStickyBroadcast(Intent myIntent)发送
或者sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras),该方法具有有序广播的特性也有异步广播的特性;
发送异步广播要: <uses-permission android:name=*"android.permission.BROADCAST_STICKY"* />权限,接收并处理完Intent后,广播依然存在,直到你调用removeStickyBroadcast(intent)主动把它去掉

监听广播Intent步骤

  1. 写一个继承BroadcastReceiver的类,重写onReceive()方法,广播接收器仅在它执行这个方法时处于活跃状态,当onReceive()返回后,它即为失活状态。
  2. 注册该广播接收者,注册有两种方法:AndroidManifest.xml文件中进行静态注册(可理解为系统中注册)和程序动态注册,如下:
  • 静态注册,注册的广播,下面的priority表示接收广播的级别"2147483647"为最高优先级
    <receiver android:name=".SMSBroadcastReceiver" >
    	<intent-filter android:priority = "2147483647" >
    		<action android:name="android.provider.Telephony.SMS_RECEIVED" />
    	</intent-filter>
    </receiver>
    
  • 动态注册,一般在Activity可交互时onResume()内注册BroadcastReceiver
    IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
    registerReceiver(mBatteryInfoReceiver, intentFilter);// 反注册unregisterReceiver(receiver);
    
  1. 生命周期:

    只有十秒左右,从回调onReceive()方法开始到该方法返回结果后结束,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息。

    如果需要完成一项比较耗时的工作 , 应该通过发送 IntentService,由Service 来完成。

    而不能用子线程来解决,因为BroadcastReceiver 一旦结束,此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死,因为它属于空进程 ( 没有任何活动组件的进程 )。如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死 。所以采用子线程来解决是不可靠的。

  2. 动态注册广播,当用来注册的Activity关掉后,广播也就失效了;而静态注册广播只要设备是开启状态,广播接收器也是打开的,在触发时也会对它起作用。

Android四大组件之三——Service服务

一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序,建议将一些(耗时)的后台操作做成Service的形式。

Service使用步骤如下:

  1. 继承Service类

  2. AndroidManifast.xml配置清单文件中<application>节点里对服务进行配置<service name=".SMSService"/>

启动服务
(整个生命周期只调用1次这个方法,通常用于初始化设置)
Context.startService()Context.bindService()
说明服务首次启动系统先调用服务的onCreate()–>onStart(),如果服务已经启动再次调用只会触发onStart()方法与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()–>onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()–>onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()–>onDestory()
停止Service被系统调用
(整个生命周期只调用1次,用来释放onCreate()方法中创建的资源)
stopService()unbindService()

img

Android四大组件之四——Content Provider内容提供者

android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序,这些数据可以存储在文件系统、SQLite数据库、或以任何其他合理的方式。

只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。

好处:统一数据访问方式

总结

1. 四大基本组件的注册

四大基本组件都需要注册才能使用:

每个Activity活动service服务Content Provider内容提供者都需要在AndroidManifest文件中进行配置,AndroidManifest文件中未进行声明的activity、service以及Content Provider将不为系统所见,从而也就不可用;

BroadcastReceiver的注册分静态注册(在AndroidManifest文件中进行配置)和通过代码动态创建并以调用,Context.registerReceiver()的方式注册至系统。需要注意的是在AndroidManifest文件中进行配置的广播接收者会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发(即使程序未运行)。

AndroidManifest文件中进行注册格式如下:

  • <activity>元素的name 属性指定了实现了这个activity 的Activity 的子类。icon 和label 属性指向了包含展示给用户的此activity 的图标和标签的资源文件。
  • <service> 元素用于声明服务
  • <receiver> 元素用于声明广播接收器
  • <provider> 元素用于声明内容提供者

2. 四大组件的激活

  • Content Provider内容提供者:

    当接收到ContentResolver 发出的请求后,内容提供者被激活。

  • Activity活动:

    传递一个Intent 对象Context.startActivity()Activity.startActivityForResult()(如果期待启动的activity返回一个结果)以载入(或指定新工作给)一个activity

    相应的activity 可以通过调用getIntent() 方法来查看激活它的intent

  • Service服务:

    传递一个Intent 对象Context.startService()Context.bindService(),前者Android 调用服务的onStart()方法并将Intent 对象传递给它,后者Android 调用服务的onBind()方法将这个Intent 对象传递给它。

  • BroadcastReceiver广播接收器:

    传递一个Intent 对象至给Context.sendBroadcast()Context.sendOrderedBroadcast()Context.sendStickyBroadcast(),Android 会调用所有对此广播有兴趣的广播接收器的onReceive()方法,将intent 传递给它们。

3. 四大组件的关闭

  • Content Provider内容提供者:

    仅在响应ContentResolver 提出请求的时候激活,没必要显式地关闭

  • BroadcastReceiver广播接收器:

    仅在响应广播信息的时候激活,没必要显式地关闭

  • Activity服务:

    调用finish()

  • Service服务:

    对于通过Context.startService()方法启动的服务要调用Context.stopService()方法关闭服务,使用Context.bindService()方法启动的服务要调用Context.unbindService()方法关闭服务

4. Dalvak虚拟机的内存回收规则

  • 先回收与其他ActivityService/Intent Receiver 无关的进程(即优先回收独立的Activity)。因此建议将一些(耗时)的后台操作做成Service形式。

  • 不可见(处于Stopped状态的)Activity

  • Service进程(除非真的没有内存可用时会被销毁)

  • 非活动的可见的(Paused状态的)Activity

  • 当前正在运行(Active/Running状态的)Activity

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kopppoooooo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值