快速了解安卓四大组件
安卓四大组件分别为
Activity 活动
Activity是用户操作的可视化界面,它为用户提供了一个完成操作指令的窗口。 需要在Activity创建时调用setContentView()来完成界面的显示,为用户提供交互的入口。
1、通常一个Activity就是一个屏幕
2、Activity之间通过Intent进行通信
3、安卓中每一个Activity都需要在AndroidMainFest.xml文件中声明
Service 服务
Service(服务)是一个可以在后台执行长时间运行操作而没有用户界面的应用组件,即使当前应用被切换到后台,又或者用户打开了另一个App,服务仍然可以保持正常运行。
1、启动服务的Activity被销毁也不会影响服务的运行,只有当进程被关闭时,Service也会被关闭
2、服务并不会自己开启线程,所有的代码都是默认运行在主线程中,也就是说我们需要在服务的内部手动开启子线程,并在此执行耗时任务,否则就有可能出现主线程被阻塞的情况。
Service的两种形式
1、started(启动状态)
当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务, 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。
2、bound(绑定状态)
当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
Service在AndroidMainFest.xml中的声明
<service android:enabled=["true" | "false"]android:exported=["true" | "false"]android:icon="drawable resource"android:isolatedProcess=["true" | "false"]android:label="string resource"android:name="string"android:permission="string"android:process="string" >. . .
</service>
android:exported:代表是否能被其他应用隐式调用,其默认值是由service中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。为false的情况下,即使有intent-filter匹配,也无法打开,即无法被其他应用隐式调用。
android:name:对应Service类名
android:permission:是权限声明
android:process:是否需要在单独的进程中运行,当设置为android:process=”:remote”时,代表Service在单独的进程中运行。注意“:”很重要,它的意思是指要在当前进程名称前面附加上当前的包名,所以“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。
android:isolatedProcess :设置 true 意味着,服务会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的唯一途径是通过服务的API(bind and start)。
android:enabled:是否可以被系统实例化,默认为 true,因为父标签也有enable属性,所以必须两个都为默认值 true 的情况下服务才会被激活,否则不会激活。
Content Provider 内容提供者
ContentProvider 主要用于在不同的应用程序之间实现数据共享的功能。
它提供了一套完整的机制,允许一个程序访问另外一个程序的数据,同时还能保证被访问数据的安全性。目前使用 Content Provider 是 Android 实现跨进称共享数据的标准方式。
Content Provider 不同于 文件存储 和 ShardPreferences存储 全局可读写操作模式,它可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。
Content Provider 的用法一般有两种:
一。使用现有的内容提供器来读取和操作相应程序中的数据;
二。创建自己的内容提供器给我们程序的数据提供外部访问接口
如果一个应用程序通过内容提供器对其数据提供了外部访问接口,那么任何其他的应用程序就都可以对这部分数据进行访问。 例如:系统中自带的电话簿、短信、媒体库等
程序都提供了类似的访问接口,这就使得第三方应用程序可以充分的利用这部分数据来实现更好的功能。
Broadcast Receiver 广播接收者
一、什么是BroadcastReceiver
BroadcastReceiver 是安卓系统中四大组件之一,在Android开发中,BroadcastReceiver的应用场景非常多,Android 广播分为两个角色:广播发送者、广播接收者。
1.1、作用
广播接收器用于响应来自其他应用程序或者系统的广播消息。
不同组件之间通信(包括应用内 / 不同应用之间)
与 Android 系统在特定情况下的通信(如当电话呼入时、网络可用时)
多线程通信
1.2、实现原理
Android中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。
模型中有3个角色:
消息订阅者(广播接收者)
消息发布者(广播发布者)
消息中心(AMS,即Activity Manager Service)
广播接收者通过 Binder机制在AMS注册
广播发送者通过 Binder 机制向AMS发送广播
AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者(寻找依据:IntentFilter / Permission)
AMS将广播发送到合适的广播接收者相应的消息循环队列中;
广播接收者通过消息循环拿到此广播,并回调 onReceive()
二、创建广播接收器
广播接收器需要实现为BroadcastReceiver类的子类,并重写onReceive()方法来接收以Intent对象为参数的消息。
public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("我是创建好的通知");}
}
三、注册广播接收器
广播接收器的注册分为两种:
静态注册
动态注册
3.1、静态注册
应用程序通过在AndroidManifest.xml中注册广播接收器来监听制定的广播意图。3.1.1 注册
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><receiver android:name=".MyReceiver"android:exported="true"><intent-filter><action android:name="com.tiger_test"tools:ignore="BatteryLife" /></intent-filter>
</receiver>
3.1.2、发送通知
在Activity 中新增一个发送通知的点击事件
public void onClickStatic(View view) {System.out.println("MainActivity2.onClickStatic");
// com.tiger_test 必须和清单文件中注册的保持一致Intent intent = new Intent();intent.setAction("com.tiger_test");intent.setPackage("com.traveleasy.activitydemo");sendBroadcast(intent);}
当点击通知发送按钮时,系统会自动实例化MyReceiver类,并注册到系统中。
静态注册是常驻广播,不受任何组件生命周期的影响
注意:由于自8.0以后隐式广播不能进行静态注册了,所以这里通过setPackage()指定应用程序响应广播。
3.2、动态注册
通过registerReceiver()注册广播监听
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);// 在onCreate 中注册广播MyReceiver myReceiver = new MyReceiver();IntentFilter filter = new IntentFilter();filter.addAction("com.tiger_test");registerReceiver(myReceiver, filter);}
触发通知
public void onClickStatic(View view) {// com.tiger_test 必须和注册的保持一致Intent intent = new Intent();intent.setAction("com.tiger_test");sendBroadcast(intent);
}
在页面关闭时记得通过unregisterReceiver()注销广播监听,否则会因广播持有Activity引用导致内存泄露。
@Override
protected void onDestroy() {super.onDestroy();unregisterReceiver(myReceiver);
}
运行结果
需要注意,在onReceive()不能执行耗时操作,onReceive()默认是在主线程中,进行耗时会阻塞主线程,如果非要执行耗时操作最好开启一个服务在服务中进行耗时操作,不建议开启线程来处理耗时操作,因为BroadCastReceiver的生命周期很短,可能在子线程结束前BroadCastReceiver已经退出,如果当BroadCastReceiver所在的进程结束,虽然该进程中可能有用户启动的新线程,但是由于该进程内没有活动的组件,系统会在内存紧张的时候,优先结束掉该进程,这就会导致BroadCastReceiver启动的子线程不能执行完。
四、系统广播
上面我们一起学习了自定义广播,下面我们一起来看一下Android 系统主要的系统广播类型。
事件常量 描述
android.intent.action.BATTERY_CHANGED 持久的广播,包含电池的充电状态,级别和其他信息。
android.intent.action.BATTERY_LOW 标识设备的低电量条件。
android.intent.action.BATTERY_OKAY 标识电池在电量低之后,现在已经好了。
android.intent.action.BOOT_COMPLETED 在系统完成启动后广播一次。
android.intent.action.BUG_REPORT 显示报告bug的活动。
android.intent.action.CALL 执行呼叫数据指定的某人。
android.intent.action.CALL_BUTTON 用户点击"呼叫"按钮打开拨号器或者其他拨号的合适界面。
android.intent.action.DATE_CHANGED 日期发生改变。
android.intent.action.REBOOT 设备重启。
总结
在BroadcastReceiver 中,广播的类型主要分为两大类
标注广播
有序广播
标准广播
标准广播是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎在同一时刻收到这个广播消息,它们之间没有先后顺序,这种广播的效率较高,并且不能被拦截。
有序广播
有序广播是一种完全同步的广播,在广播发出后只能有一个BroadcastReceiver能接收到这个广播消息,当这个BroadcastReceiver中的逻辑执行完毕后,广播才能继续向下传递。所以这个广播是有顺序的,所以这种广播也是可以被拦截的,如果被拦截了后面的BroadCastReceiver则不能收到广播消息了。
快速了解安卓四大组件相关推荐
- 安卓四大组件之Activity
1.Activity简介 它是安卓四大组件之一,用于界面的展示,是最贴切用户的一个组件,所以说它的操作 都与用户密切相关,可以通过setContentView来显示制定控件.通常情况下,在一个安卓应用 ...
- 【Android】安卓四大组件之内容提供者
[Android]安卓四大组件之内容提供者 1.关于内容提供者 1.1 什么是内容提供者 内容提供者就是contentProvider,作用有如下: 给多个应用提供数据 类似一个接口 可以和多个应用分 ...
- 【Android】安卓四大组件之Activity(一)
[Android]安卓四大组件之Activity(一) 前言 Activity是Android学习中的一个重要组件,想要对其进行系统的了解可以分为几块内容,这一大章节的内容是有关于activity之间 ...
- 安卓四大组件(小白篇)
安卓的四大组件分别是: 1,活动activity,用于表现服务: 2,服务service,后台运行服务,不提供界面呈现: 3,广播接受者(broadcast receive),用于接受广播: 4,内容 ...
- 安卓四大组件之Receiver
广播接收器: 安卓中的广播接收器类似于我们生活中的收音机 广播的特点是 一对多 单向传播 作用:设计了广播接收机制 ,可以实现系统发一些手机的状态信息给所有的应用 首先说广播的发送方式: 1.有序的广 ...
- Android 安卓 四大组件
Android开发的四大组件 Android四大组件分别为activity.service.content provider.broadcast receive 一.Activity Act ...
- 安卓四大组件之—— BroadcastReceiver
初识广播 什么是广播? Broadcast直译广播,我们举个形象的例子来帮我理解下BroadcastReceiver,记得以前读书 的时候,每个班级都会有一个挂在墙上的大喇叭,用来广播一些通知,比如, ...
- 安卓四大组件之Service
很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让他们在后台运行就行了,而且在他们运行期间我们仍然能运用其他的应用.为了处理这种后台进程,Android引进了service的概念. 服务的特 ...
- 安卓四大组件之广播组件(Broadcast)
1.广播是什么 之所以叫做广播,就是因为它只负责"说"而不管你"听不听",也就是不管你接收方如何处理. 广播可以一对多,一人发送广播,多人接收处理 Broadc ...
- 安卓四大组件之二广播
定义 BroadcastReceiver,"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.在Android系统中,广播体现在方方面面,例如当开机完成后系统会产 ...
最新文章
- 《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 五 NSDicionary + NSMutableDictionary...
- java高级特性2,Java高级特性 2
- 【跃迁之路】【448天】刻意练习系列207(2018.04.29)
- gRPC学习记录(五)--拦截器分析
- webpack里JavaScript文件编译的调试
- java工作台无法显示_【Eclipse】使用指南(18)搜索工作台
- End User 访问SharePoint URL获取数据流程
- 音创a55怎么安装系统_教您怎么用光驱重装系统,安装系统教程!
- Easyui Datagrid的Rownumber行号显示问题
- ASP.NET文件上传的三种基本方法
- 思科 mds 虚拟服务器,Cisco MDS系列交换机VSAN功能简介
- 微信小程序之使用云存储
- zblog php的foot模板在那里,zblog主题模板修改教程 zblog模板怎么修改?
- VisualSVN 5.1.7破译License Key
- 盘点20款让你脑洞大开的AR技术应用
- markman的下载与使用
- 【Apache】配置.htaccess将主域名301重定向到www域名
- [2010年终大礼]破壳而出的琉璃之鸟 汉化补丁 第二版(win8兼容版发布)
- python控制程序_Python 流程控制
- Visual Hull基于序列图像的三维重建