Android初窥
Posted 泼墨成空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android初窥相关的知识,希望对你有一定的参考价值。
一、App如何存在于系统?
android APP是用Java语言编写的由Android SDK工具编译并和其它资源文件一起打包到APK文件并安装到手机上的应用。一个APK文件包含了要安装的App所需要的一切内容。一旦APK安装到设备上,每一个Android APP就生存在它自己的安全沙箱。(1)Android操作系统是一个多用户Linux系统,每一个app就是一个不同的用户。
(2)系统默认为每个app分配独一无二的用户ID(uid),这个id仅仅是拱系统使用,而对于app本身是没啥用的。系统会对app的所有文件都设置权限,这样,只有被匹配相同的uid的app才可以去使用它,也就是说,只有uid相同的应用之间可以互相共享资源,否则, 他们的资源将会互相隔绝。
(3)每一个进程都有他自己的虚拟机,所以,一个应用的运行是独立于其他应用的。
(4)默认的,每一个应用都运行在它自己的Linux进程,当任何其他应用组件需要被执行的时候Android就会启动一个进程,而当这个组件不在需要或者当系统需要回收内存时就会关闭进程。
在这种方式下,Android系统的实现是最小优先原则,也就是说,每一个应用,它只能接近它需要去使用的组件而不能随意去使用别的app的组件,这就为app创建了一个很安全的环境,这样一来app就不能在没有权限的情况下去使用系统或其它的功能。
但是,也有一些方式可以实现不同应用之间共享数据,我们可以为多个app分配同一个uid(通过sharedUserid实现),这样他们就可以互相访问彼此的资源了。有时候为了节省系统资源,app升值可以被安排在一个相同的Linux进程中运行并且共享一个VM实例,但是这个前提是要使用同一个签名证书。
二、Everything is Component
每个Android应用都可以视为是组件的集合,对于Android应用层开发者来说,就像是用Google提供好的一堆积木去构建自己的玩具一样,而我将这个构建过程的方式称之为“组合模式”。这种组件式的设计思想极大的解放了程序的耦合度,例如,它的特性之一就是这些组件可以单独的被调用和单独的运行,比如,一个独立的Activity用于展示在屏幕上用于和用户交互,而Activity可以启动一个Service独立的在后台运行。甚至一个组件可以用Intent启动另个app的其他组件,比如,在启动地图应用中一个Activity用于显示地址。由此可见,组件之间的耦合度是极其低下的,他们之间仅仅需要一个Intent就可以彼此被调用,不会强制的依赖于彼此。也正因为如此,Intent可以被视为组件之间的“信使”。Android中总共有四种不同类型的组件,每一个都代表了不同的服务意图并且有不同的生命周期,这个周期就定义了组件何时被创建和销毁。
1、Activity组件
一个Activity代表了一个单屏幕界面用于用户交互,比如,一个邮件app可能有一个Activity显示新邮件列表,另一个Activity用于编辑邮件,还有一个Activity用于阅读邮件(邮件详情界面)。尽管这些Activity共同构建了一个有着友好用户体验的邮件app,但是每一个Activity都是独立于其他的Activity的。与此类似,另一个不同的app也可以调用邮件app的任何一个Activity(如果邮件app允许的话),比如,在邮件app中可以启动一个相机app的Activity。2、Service组件
一个Service组件代表了一个运行在后台的长时间操作或执行远程进程任务。一个Service不会提供用户界面,比如,在一个Service在后台播放音乐的情况下,用户还可以去玩其他的应用。此外,Service还可以用于从网络获取数据而不阻塞用户界面(之后会详细介绍,Service并不是开启了新的进程或线程。其他的组件比如Activity可以启动一个Service。3、ContentProvider组件
一个ContentPrvider组件管理了一系列共享的数据,你可以将数据存储在文件、SQLite数据库、web端服务器、或者任何你app可以接近的永久性存储的地方。通过ContentProvider,其他应用可以查询或修改数据(如果ContextProvider允许的话)。比如,Android系统提供了一个ContentProvider管理了用户的联系人信息,所以我们可以在应用中使用系统的联系人通讯录功能。与此类似,任何app在权限允许的情况下都可以差群ContentProvider的内容去读取和写入信息。ContentProvider也可以用于读取和写入app的私有数据,而不去共享给其他应用。4、BroadcastReceiver组件
一个BroadcastReceiver是一个用于响应系统范围内通知的组件,Android系统内置了很多系统级别的广播,比如手机屏幕锁屏或熄屏了、电量过低了或者图片被捕获了都会有相应的广播。我们自己的app也可以创建一个广播,比如通知其他app有数据被下载到设备上并且可以用了。尽管广播不用提供用户界面,但是他们可以在收到广播后创建一个状态栏通知去提醒用户。
Android系统的独特新设计在于任何app都可以启动其他app的组件。比如,如果你想用户通过相机去捕获一张图片,而拍照时另一个app做的事情,但是是在你的app中使用的,这样我们就可以避免自己重新创建相机去拍照了(当然自己也可以自定义相机),你只需要启动一个在相机app的Activity就可以拍照并捕获照片,当拍照完了之后,图片就会返回到你的app供你使用,对于用户来说,这个拍照过程仿佛是你的应用来完成似的。
由于每个app都运行在它单独的进程之中并且文件系统权限也限制了去接近其他app。所以,你的app不能直接激活其它应用的组件,但是,你可以让Android系统代劳,为了激活另一个app的组件,你必须传递一个消息给系统去指定你想要启动的那个组件,系统就可以为你激活组件了。
三、激活组件
四大组件中的三个组件--Activity、Service、BroadcastReceiver是可以通过调用Intent来激活的。Intent可以在运行时将彼此独立的组件绑定连接起来(你可以认为Intent是来自其他组件的作为一个请求执行某种动作的信使),无论这些独立的组件是自己的app还是其它的app。一个Intent对象定义了一个消息去激活另一个指定了的组件(Component)或指定的组件类型,这个intent可以是显示的或隐式的。当我们直接指定组件名称时就是显示的intent、当我们只指定组件的类型(即Action等)时就是隐式的。
对于Activity和Service来说,一个Intent定义了一个动作(View或send等)去执行并且也有可能是指定数据的URI。比如,一个Intent可能为一个Activity会传递一个请求去展示图片或打开网页等。在有的情况下,你可以启动一个Activity并且会收到结果,在这种情况下,Activity也是将结果放到Intent传递回来。
对于BroadcastReceiver来说,Intent仅仅定义了将要被广播出去的公告。
其他的组件类型,比如ContentProvider就不是通过Intent来激活的,相反,他是当目标通过从ContentProvider请求时被激活。如下就是集中激活组件的方式:
(1)激活Activity
startActivity()和startActivityForResult()
(2)激活Service
startService()和bindService()
(3)激活BroadCastReceiver
sendBroadcastReceiver()、sendOrderBroadcast()、sendStickyBroadcast()
(4)查询ContentProvider数据
ContentProvider的query()
当然,所有的组件都必须在Manifestfile中注册,否则在运行时就会报错。
以上是关于Android初窥的主要内容,如果未能解决你的问题,请参考以下文章
[转] 由Request Method:OPTIONS初窥CORS