Android4.3源码分析--Android世界

时间:2020-12-23 05:04:30

第一章 Android世界

1.3.1 Activity 的界面表现

Activitys是这五个组件中最常用的组件,程序中的Activity通常的表现形式是一个单独的界面(screen),每个Activity都是一个单独的类,它扩展实现了Activity基础类,整个类显示未一个由Views组成的用户界面,并响应事件,大多数程序都有多个Activity。

 

1.3.2 Intent和IntentFilters

Android通过一个专门的类的Intent类来进行界面的切换,Intent描述了程序想要做什么(Intent 意为意图,目的,意向) 。Intent类还有意个相关的类IntentFilter。Intent是意个请求,用来处理明确做什么事情,IntentFilter则描述了一个Activity(或下文的IntentRceiver)能处理什么意图,显示某人的联系信息的Activity使用了一个IntentFilter,就是说,它知道如何处理应用到此人数据的View操作。Activities在文件AndroidManifest.xml 中使用IntentFilters。

通过解析Intents可以实现Activity的切换,我们可以使用startActivity(myIntent)启用新的Activity,系统会考察所有安装程序的IntentFilters,然后找到与myIntent匹配最好的IntentFilter所对应的Activity,这个Activity能够接收Intent传来的消息,并因此被启用,解析Intents的过程发生在startActivity被实时调用时,这样做有两个好处

1,Activities仅发出一个Intent请求,便能重用其他组件的功能。

2,Activities可以随时被替换为有等价IntentFilter的新Activity

 

1.3.3 Servic服务

Service是一个没有用户界面的UI且长驻系统的代码,最常见的例子是多媒体播放器从播放列表中播放歌曲,在媒体播放程序中,可能有一个或者多个Activities让用户选择播放的歌曲,然而在后台播放歌曲无需Activity干涉,因为用户在播放应用的同时切换到其他界面,既然这样媒体播放器Activity需要通过Context.startService()启动一个Service,这个Service在后台运行保持继续播放音乐,在媒体播放器被关闭之前,系统会保持音乐后台播放器Service的正常运行,可以用Context.bindService方法上(如果Service未启动的话,连接后还会启动它)提供了暂停和重放等功能,

Android系统将会尝试保留那些启动了的或者绑定了的服务进程,具体说明如下,

1,如果该服务进程的onCreate,onStart,或者onDestroy这些方法中执行,那么主进程将会成为一个前台进程,以确保此代码不会被停止。

2,如果服务已经开始,那么它的主进程的重要性会低于所有可见进程,但是会高于不可见进程。由于只是少数几个进程是用户可见的,所以,只要不是内存特别低,该服务就不会停止。

3,如果有多个客户端绑定了服务,只要客户端中的一个对于用户是可见的,就可以认为该服务可见。

 

1.3.4 用BroadCast IntentReceiveiver广播

当要执行一些与外部事件相关的代码时,比如来电响铃时,或者到半夜时,就可能用到IntentReceiver,尽可能用IntentReceivers使用NotficationManager来通知用户一些好玩的事情的发生。

IntentReceiver可以在文件AndroidManifest.xml中声明,也可以用Context.registerReceiver来声明,当一个IntentReceiver被触发时,如果需要,系统自然会自动启动程序,程序也可以通过Context.broadcastIntent来发送自己的Intent广播给其他程序。

 

1.3.5 用Content Provider存储

Android系统中,应用程序数据放在一个SQLite数据格式文件中,或者存放在其他有效的设备里,如果想让其他程序能够使用我们程序的数据,此时ContextProvider就会有用了,ContextProvider是一个实现了一系列标准的方法的类,这个类使得其他程序能存储,读取某种ContextProvider可处理的数据

 

1.4进程与线程、

在Adnroid系统中,进程和线程用于完成某个Andorid任务,当第一次运行某个组件的时候,Android会启动一个进程,在默认情况下,所有的组件和程序运行在这个进程和线程中,也可以安排组件在其他的进程或线程中运行

 

1.4.1 什么是进程

组件运行的进程是由manifest文件控制的,组件的节点,一般都包含一个process属性,例如Activity,Service,receiver和provide节点

属性process可以设置组件运行的进程,可以配置组件方在一个单独进程中运行,或者多个组件在同一个进程中运行,甚至可以让多个程序在一个进程中运行,当然前提是这些程序共享一个UserId 并给定同样的权限,,application节点包含process属性,用来设置程序中所有组件的默认线程。

当决定那个进程需要被关闭的时候,Android会考虑进行对用户是否还有用,例如Android会倾向关闭一个长期不显示在界面的进程来支持一个经常显示在界面的进程,是否关闭一个进程,决定与组件在进程中的状态。

 

1.4.2 什么是线程

当用户界面需要快速对用户操作进行响应时,就需要将一些耗时的操作,如网络链接,下载或者非常占用服务器时间的操作等放到其他线程中,也就是说,即使为组件分配了不同的进程,有时候也需要分配线程。

线程通过Java的标准对象Thread来创建的,在Andorid中提供了如下管理线程的方法

(1)Looper可用来进行线程中运行一个消息循环

(2)Handler可用来传递一个消息

(3)HandlerThread可用来创建一个带有消息循环的线程

(4)Android让一个应用程序在单独的线程中,直到它创建自己的线程

(5)应用程序组件Activity,Service,BroadcastReceiver 全都在理想的主线程中实例化,

(6)当被系统调用时,任何组件都不应该执行时间或者是阻塞的操作(例如,网络调用或者是计算循环),否则应该中断所有在该进程中的其他组件

(7)可以创建一个新的线程来执行长期操作。