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的一个拍照Activity,那么那么Activity就会运行在相机app进程当中,而不是你自己的app进程中,因此,不像其他系统的qpp,Android APP没有一个确定的入口,也没有main()方法。
      由于每个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中注册,否则在运行时就会报错。

















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章