[android]android5大基础组件深入分析

简介:
5 Basic Components
1.         Activity
2.         Service
3.         Broadcast Receiver
4.         Content Provider
5.         Intent


Activity —— 应用表示层(基类Activity)  
       应用程序中的每个屏幕都是通过继承和扩展基类Activity来实现的。 
       同一应用中的每个Activity是相互独立的。程序启动后显示的第一幅画面是应用程序的第一个Activity(默认窗口),而后可以根据需要从这个Activity启动另一个新的Activity。 
       Activity利用View来实现应用中的GUI(用户直接通过GUI和应用程序做交互)。Activity窗口内的可见内容通过基类View提供。使用Activity.setContentView()方法设置当前Activity中的View对象。 
l         每个View对象控制着窗口内的一个矩形空间; 
l         View是一种层次化结构,Parent View中的布局属性会被子View继承; 
l         位于View层次关系最底层的子View对象所代表的矩形空间就是跟用户进行交互的地方
Activity状态回调:
l         onCreate
l         onStart
l         onRestart
l         onResume
l         onPause
l         onStop
l         onDestroy

Service —— 没有可见的用户界面,但能够长时间运行于后台(基类Service) 
       运行于应用程序进程的主线程中,因此Service不会阻塞其他组件和用户界面。 
       Service是不能自己启动的,必须通过Context对象(如一个Activity)调用startService或bindService方法来启动(用这两种方法启动的Service的生命周期不同)。 
1.         调用startService方法 
a)         若Service没有启动,则首先会调用该Service的onCreate方法,然后再调用onStart方法。 
b)        若Service已经启动,则会直接调用onStart方法 
c)        该方法启动的Service,可以通过Context对象调用stopService来关闭,也可以通过Service自身调用stopSelf()或stopSelfResult()来关闭,关闭之前调用onDestory方法。 
2.         调用bindService方法,使当前Context对象通过一个ServiceConnection的对象绑定到所指定的Service 
a)         若Service没有启动,则首先会调用该Service的onCreate方法初始化启动,然后调用Service的onBind方法初始化绑定。 
b)        如果绑定Service的Context对象被销毁时,被绑定的Service也会调用onUnbind 和 onDestroy方法停止运行
c)        注意: BroadcastReceiver是不能绑定服务的。 
d)        一个绑定Service的Context对象还可以通过unbindService()来取消对服务的绑定。 
e)         取消时,Service会调用unbind方法,若Service是通过bindService来启动的,还会调用onDestroy方法来停止服务。 
       Service状态回调:
l         onCreate
l         onStart
l         onBind
l         onRebind
l         onUnbind
l         onDestroy


Broadcast Receiver —— 用户接收广播通知的组件(基类BroadcastReceiver)  
       Android中的广播要么来自于系统,要么来自普通应用程序。 
很多事件都可能导致系统广播,如手机所在时区发生变化,电池电量低,用户改变系统语言设置等。 
来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。 
       为了响应不同的事件通知,应用程序可以注册不同的Broadcast Receiver。所有的Broadcast Receiver都继承自基类BroadcastReceiver。 
       BroadcastReceiver自身并不实现图形用户界面,但是当它收到某个通知后,BroadcastReceiver可以启动Activity作为响应,或者通过NotificationMananger提醒用户。 
       BroadcastReceiver是对发送出来的Broadcast进行过滤接收并响应的一类组件。 

       发送Broadcast信息 
1.         把要发送的信息和用于过滤得信息(如Action、Category)装入一个Intent对象 
2.         调用Context.sendBroadcast()、sendOrderBroadcast()、sendStickyBroadcast()方法,广播该Intent对象 
3.         使用sendBroadcast() 或sendStickyBroadcast()方法发出去的Intent,所有满足条件的BroadcastReceiver都会随机地执行其onReceive()方法; 
4.         而sendOrderBroadcast()发出去的Intent,会根据BroadcastReceiver注册时IntentFilter设置的优先级的顺序来执行,相同优先级的BroadcastReceiver则是随机执行 
5.         sendStickyBroadcast()方法主要的不同是,Intent在发送后一直存在,并且在以后调用registerReceiver()注册相匹配的Intent时会把这个Intent直接返回。 
6.         若在使用sendBroadcast()方法时指定了接收的权限,这只有在AndroidManifest.xml中用<uses-permission>标签声明了拥有此权限的BroadcastReceiver才会有可能接收到发送来Broadcast。 
7.         若在注册BroadcastReciever时,指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才有可能被这个BroadcastReceiver所接收。 
接收Broadcast消息 
1.         继承BroadcastReceiver 类,并实现onReceive方法 
2.         注册Broadcast Receiver(有2种方法:一种方法是,静态地在AndroidManifest.xml中用<receiver>标签声明,并在标签内用<intent-filter>标签设置过滤器; 另一种方法,动态地在代码中先定义并设置好一个IntentFilter对象,然后再需要注册的地方调用Context.registerReceiver()方法) (取消注册时,调用Context.unregisterReceiver()方法) 

Content Provider —— 为解决应用程序间数据通信、共享的问题(基类ContentProvider)  
       在Android中,每个应用程序都是用自己的用户ID并在自己的进程中运行。这样的好处是,可以有效地保护系统及应用程序,避免被其他不正常德应用程序所影响,每个进程都拥有独立的进程地址空间和虚拟空间。 
       Content Provider可以将应用程序特定的数据提供给另一个应用程序使用。其数据存储方式可以是Android文件系统、SQLite数据库或者其他合理的方式。 
       当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定义一个URI。之后,其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个ContentResolver, 然后传入响应的URI就可以了。 
       Content Provider 继承自基类ContentProvider,并且实现了一组标准接口。通过这组接口,其他应用程序能对数据进行读写和存储。然而,需要使用数据的应用程序并不是直接调用这组方法,而是通过调用ContentResolver对象的方法来完成。ContentResolver对象可以与任意ContentProvider通信。 
       要为当前应用程序的私有数据定义URI,就需要专门定义一个继承自ContentProvider的类,然后根据不同的操作调用的方法去实现这些方法的功能。 
       ContentResolver类为应用程序提供了接入Content机制的方法。要构造一个ContentResolver对象可以为构造方法ContentResolver(Context context)传入一个Context对象,也可以直接通过Context对象调用getContentResolver()方法获得 —— 有的ContentResolver对象后,就可以通过调用其query()、insert()、update()等方法来对数据进行操作了。 

一旦需要以上4种Android应用程序基本组件完成请求,Android会首先确认该组件所在进程是否运行,如果没有运行,Android将先启动进程,同时确认被请求组件的实例是否存在,否则将创建一个新的组件实例。 

Intent —— 连接组件的纽带  
       以上4种基本组件中,除了Content Provider是通过Content Resolver激活外,其他3种组件Activity、Service和Broadcast Receiver都是由Intent异步消息激活的。 
       Intent在不同的组件之间传递消息,将一个组件的请求意图传给另一个组件。因此,Intent是包含具体请求信息的对象。 
针对不同的组件,Intent所包含的消息内容有所不同,且不同组件的激活方式也不同, 且不同类型组件有传递Intent的不同方式。 
       Intent是一种运行时绑定(runtime binding)机制,它能够在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表到某种请求或者意愿,Android会根据意愿的内容选择适当的组件来处理请求。 
l         激活一个新的Activity,或者让一个现有的Activity执行一个新的操作,可以通过调用如下两种方法(这两汇总方法需要传入的Intent参数称为Activity Action Intent): 
1.         Context.startActivity() 
2.         Activity.startActivityForResult() 
l         启动一个新的服务,或者向一个已有的服务传递新的指令,可以调用如下两种方法: 
1.         Context.startService() 
2.         Context.bindService() 
l         发送广播Intent(所有已注册的拥有与之相匹配IntenFilter的BroadcastReceiv就会被激活),可以调用如下三种方法: 
1.         Context.sendBroadcast() 
2.         Context.sendOrderBroadcast() 
3.         Context.sendStickBroadcast() 
Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity、Service或BroadcastReceiver作响应。所以,不同类型的Intent消息不会出现重叠,BroadcastIntent消息只会发送给BroadcastReceiver,而绝不可能发送给Activity或Server。有startActivity()传递的消息也只可能发送给Activity,由startService()传递的Intent只可能发送给Service。 

       Intent对象抽象地描述了执行操作,Intent的主要组成部分; 
1.         目标组件名称。[可选项] 
a)         组件名称是一个ComponentName对象,是目标组件类名和目标组件所在应用程序包的组合 
b)        组件中的包名不一定要和manifes文件中包名完全匹配 
c)        如果Intent消息中指明了目标组件的名称,这就是一个显示消息,Intent会传递给指明的组件。 
d)        如果目标组件名称并没有指定,Android则通过Intent内的其他信息和已注册的IntentFilter的比较来选择合适的目标组件 
2.         Action [隐式比较] 
a)         描述Intent所触发动作的名字字符串。 
b)        理论上Action可以为任何字符串,而与Android系统应用有关的Action字符串以静态字符串常量的形式定义在了Intent类中。 
3.         Data [隐式比较] 
a)         描述Intent要操作的的数据的URI和数据类型。 
b)        正确设置Intent的数据对于Android寻找系统中匹配Intent请求的组件很重要。 
4.         Category [隐式比较] 
a)         是对被请求组件的额外描述信息。 
b)        Android也在Intent类中定义了一组静态字符串常量表示Intent不同的类别。 
5.         Extra 
a)         当我们使用Intent连接不同组件时,有时需要在Intent中附加额外的信息,以便将数据传递给目标Activity。
b)        Extra用键值对结构保存在Intent对象当中,Intent对象通过调用方法putExtras() 和 getExtras()来存储和获取Extra 
c)        Extra是以Bundle对象的形式来保存的,Bundle对象提供了一系列put和get方法来设置、提取相应键值信息。 
d)        在Intent类中同样为Android系统应用的一些Extra的键值定义了静态字符串常量。 
6.         Flag 

决定Intent目标组件的因素: 
n         在显式Intent消息中,决定目标组件的唯一要素就是组件名称(不用再定义其他Intent内容) 
n         而隐式Intent消息中,由于没有目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。 
n         隐式Intent消息中目标组件具体选择方法是:android将Intent的请求内容和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。如果IntentFilter中某一个组件匹配隐式Intent请求内容,那么Android就选择该组件作为该隐式Intent的目标组件。 

IntenFilter 
       应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个IntentFilter。
       每个IntentFilter描述该组件所能响应Intent请求的能力 —— 组件希望接收什么类型的请求行为,什么类型的请求数据。 
       隐式Intent和IntentFilter进行比较时的三要素:Action、Data、Category。 
       一个隐式Intent请求要能够传递给目标组件,必需通过以上三个方面的检查。如果任何一方面不匹配,Android都不会将该隐式Intent传递给目标组件。 
       <intent-filter> 
              <action android:name=””/> 
              <category android:name=””/> 
              <data android:type=”” android:scheme=”” android:authority=”” android:path=””/> 
       </intent-filter> 
1.         动作测试 
a)         一条 <intent-filter> 中至少应该包含一个<action>, 否则任何Intent请求都不能和该<intent-filter> 匹配。 
b)        如果IntentFilter 中没有包含任何Actino类型,那么无论什么Intent请求都无法和这条IntentFilter匹配。 
c)        如果Intent请求中没有设定Action类型,那么只要IntentFilter中包含有Action类型,这个Intent请求将顺利通过IntentFilter的测试。 
2.         类别测试 
a)         只有当Intent请求中所有的Category与组件中的某一个IntentFilter的category完全匹配,才会让该Intent请求通过测试,IntentFilter中的多余category声明并不会导致匹配失败。 
b)        一个没有指定任何类别的IntentFilter仅仅只会匹配没有设置类别的Intent请求。 
3.         数据测试 
a)         <data>元素指定了希望接受的Intent请求的数据URI和数据类型:URI被分成三部分类进行匹配,scheme、authority和 path. 
b)        使用 setData设定的Intent请求的URI数据类型和scheme,必须与IntentFilter中指定的一致 
若IntentFilter中还指定了authority或path,他们也需要相匹配才会通过测试。 


转载至:http://blog.csdn.net/crazyjeff_liu/article/details/5545806
目录
相关文章
|
3月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
381 4
|
3月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
3月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
4月前
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
4月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
159 0
|
3月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
121 21
|
2月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
50 8
|
4月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
141 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
4月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作

热门文章

最新文章

  • 1
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 2
    Android历史版本与APK文件结构
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 4
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 1
    Android实战经验之Kotlin中快速实现MVI架构
    21
  • 2
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    24
  • 3
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    39
  • 4
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    121
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    40
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 7
    Android历史版本与APK文件结构
    148
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40
  • 10
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    67