文章地址:https://developer.android.com/guide/components/fundamentals.html
一旦安装到设备上,每一个app就存活在自己的安全沙箱中。
1、android操作系统是一个多用户的Linux系统,每一个应用是不同的用户
2、默认,系统会给每一个应用分配一个唯一的Linux用户id(这个id只能被系统使用,对于应用是不可知的)。一个应用中的所用文件系统都会设置权限。有分配对应用户id的应用才能访问他们。
3、每个进程有自己的虚拟机,所以应用代码是运行在于其他应用隔离的空间中。
4、默认,每个应用运行在自己的Linux进程中。只要这个应用中的任何组件被执行Android就会启动这个进程,如果他们不再需要或是为了其他应用要恢复内存这时会关闭进程。
然而,还有需要方法让一个应用与其他应用分享数据和访问系统服务。
1、可以安排两个应用共享同一Linux用户id,使得他们能访问互相的文件。为了保持系统资源,有同样用户id的应用也被安排运行在同样的Linux进程中并分享同样的虚拟机(这些应用必须用同样的签名注册)。
2、一个应用可以请求权限访问设备数据如联系人、短信等。所有的应用权限必须在用户安装的时候设定。
有4中不用类型的应用组件。每种类型提供了不同的目的、有不同的生命周期定义的组件如何创建和销毁。
1、Activities
2、Services
3、Content providers ,一个content provider 管理一组被分享的应用数据。你可以把这些数据存储在系统文件中、数据库中、web上、或是其他你的应用可以访问的持久存储的地方。通过content provider,其他应用可以查询甚至修改数据。
4、Boradcast receivers
有单独的方法激活每种类型的组件
1、通过传递Intent调用startActivity()或是startActivityForResult()方法
2、通过传递Intent调用startService()或是bindService()方法
3、可以定义一个broadcast通过Intent传递调用sendBroadcast()、sendOrderedBroadcast()或是sendStickyBroadcast()。
4、你可以执行一个查询给content provider通过调用ContentResolver的query()。
在android系统启动一个应用组件之前,必须通过读取应用的manifest文件知道他们的存在。你必须要这个文件申明所有的组件。通过在manifest文件中定义一下元素(<activity>,<service>,<receiver>,<provider>)。
Activities、services和content providers必须在manifest中申明,否则系统将不可见,无法运行。然而,broadcast receivers除了在manifest中申明也可以在代码中动态创建,通过调用registerReceiver()方法。
申明的功能如果设备不支持的话,应用将无法安装,你也可以申明这个功能但不请求他,但必须设置required为false,这样可以确保运行环境中有这个功能,但是不会使用它们。
<uses-feature android:name="android.hardware.camera.any"
android:required="false" />