安卓学习笔记(二)基本构件

1、Activity

  一个Activity,通常是用户在某一个时刻,在设备上看到的单独的界面。一个应用程序通常含有多个Activity,用户可在期间进行切换。对用户而言,这就是程序的外观部分。

  Activity的生命周期:启动一个Activity可能会消耗大量资源。他可能会涉及到新建一个Linux进程、为UI对象申请内存空间、从UML布局填充所有对象,以及创建整个界面。为了避免这种浪费,Android通过ActivityManager来管理活动的生命周期。

  ActivityManager负责创建、销毁、管理Activity。

  在Android编程与在其他环境中编程有些区别。在Android中你会发现更多的是对应用程序的状态改变做出响应,而很少主动改变它的状态。Android是一个被外部控制和管理起来的环境,与在Javaapplet和servleet中编程有些相似。因此谈及Activity的生命周期我们很少会说他的当前状态,更多的是说状态转换过程。

  (1)启动状态:onCreate()、onStart()、onResume()

  当一个活动(Activity)还不存在与内存中时,我们称其为启动(Starting)状态。当它启动时,活动会调用一整系列由开发人员有机会指定的回调函数。最后活动(Activity)hi进入运行状态(running)。

  注意,从启动状态到运行状态的转换时最耗时的操作之一。耗时就是耗电,对电池的续航能力也有直接的影响。因此不再显示的活动不会被轻易的销毁,而是使它驻留在内存中,这样用户下次访问的时候可以节省资源。

  (2)运行状态

  处于运行状态的活动,是指当前显示在屏幕上与用户交互的活动。我们也称该活动获得了焦点(in foucs),意味着所有用户交互——例如打字,触摸屏幕,单击按钮——都由这个活动处理。由此可知同一时刻只能有一个活动处于运行状态。

  正在运行的活动可以优先获取它所需内存或资源,以便尽量以最快的速度运行。

  (3)暂停状态

  当活动没有获得焦点(例如没有与用户交互),但仍显示在屏幕上时,它就处于暂停状态(paused)。

  活动会在停止前进入暂停状态。暂停状态的活动依然拥有获取内存或者其他资源的优先权。因为他们依然显示在屏幕上,应该尽量避免使用户感到不自然。

  (4)停止状态

  当一个活动不再显示却依然驻留在内存中的时候,我们称其为停止状态(stopped)。停止状态的活动可以再次显示,成为一个运行状态,也有可能被销毁并从内存中移除。

  系统会将处于停滞状态的活动保留一段时间,因为用户很可能稍后希望在返回到这些活动,并且重新启动一个停止的活动远比初始化一个新的活动代价要小。

  停止状态的活动可能随时被从内存中移除。

  (5)销毁状态

  销毁(destroyed)状态不在驻留在内存中。当活动管理器认为不在需要某个活动的时候机会移除它。在活动被销毁之前,他可以做一些特定的操作,比如保存信息。但是Android并不保证你的活动在销毁前会先被停止,暂停的活动也一样可能内销毁。因此,最好在切换回暂停状态时执行重要的工作。

  实际上,运行中的状态并不意味着他正在进行频繁的运算,他可能只是在那里等待用户的输入。相似的处于停止状态的活动也不一定什么都不做。状态名称主要是指活动对于用户输入的响应程度,换句话说即一个活动是否课件,获得焦点,或者根本不可见。

2、Intent

  Intent是指在主要构件之间传递的消息。它能够触发并启动一个消息,告诉一个服务启动还是停止,或者只是简单地广播。Intent是异步的,这意味着发动它们的代码不必等待它们完成并返回。

  Intent分为显式的(expicit)和隐式的(implicit)两种。在显式的Intent中,发送者需要明确的指定接收Intent的组件。在隐式的Intent中,发送者只需指定接收者的类型。

3、服务(Service)

  服务运行于后台,没有任何用户界面。它们可以喝活动一样执行相同的操作,但是没有任何用户界面。服务用于不管界面上有什么,我们都希望可以执行一段时间的操作。例如:你可能希望在其它应用程序之间切换时,音乐播放器依然可以播放歌曲。

  服务的生命周期比活动要简单地多。你可以启动或停止一个服务,同样的服务的生命周期或多或少的由开发人员控制,受系统控制相对较少。

  虽然服务运行于后台,但这并不是说它在另一个独立的线程上运行。而如果一个服务正在执行一段耗时的操作,你通常需要将它放在单独的线程上处理,否则将影响你的用户界面的响应速度。简单地说,服务和活动运行在同一个主应用程序线程中,这个线程也被称为UI线程。

  注意:不要将Android的服务(这些都是Android英语程序的一部分)和Linux的原生服务、服务器进程或者守护进程相混淆(它们都是操作系统更底层的组件)。

4、内容提供器(ContentProvider)

  内容提供器是应用程序之间共享数据的接口。Android默认每个应用程序都运行在自己的沙盒中,这样该应用程序的所有数据与系统中其它程序的数据就完全隔离了。虽然少量的数据可以通过Intent在不同的应用程序之间传递,内容提供器则用于大数据集之间的共享持久数据。为此内容提供器提供了一一套很好的复合DRUD(Creat、Read、Update、Delete)原则。

  内容提供器的接口相对比较简单,就是标准的insert()、update()、delete()、qurey()方法。这些方法看上去很像标准的数据库方法,因此为数据库实现一个内容提供器作为代理业相对简单。我们应该尽可能的使用内容提供器而不是自己去实现。

5、广播接收器(BroadcastReceiver)

  广播接收器是Android在系统级别对“发布——订阅”机制,或者说观察者模式(Observer)的实现。接收器一般只是等待,直到其订阅的事件发生时,才被激活。

  系统自身时时都在进行着广播。例如收到一条短信,接一个电话等的呢。所有这些事件都被广播,而且它们可以出发任意数量的接收器。

  可以向应用程序的不同部分发送广播,或者其他完全不同的应用程序发送广播。

  广播本身没有任何可视化的展现,也不会在内存中主动进行。但是一旦被触发,它们可能执行某些代码,例如启动一个活动,服务或其他。

6、应用程序上下文(ApplicationContext)

  应用程序上下文是应用程序环境及其所有组件运行所在的进程。它允许应用程序在不同的构件中共享数据和资源。

  不管应用程序中首先启动的是活动、服务还是其它构件,都会先创建应用陈新股上下文。只要你的应用程序没有消亡,应用程序上下文也会一直存活。正因为如此,应用程序上下文与生命周期无关。你可以通过Context.getApplicationContext()或Activity.GetApplication()来获得对上下文的引用。

  注意,Activity和service都是上下文的子类,因此他们也就继承了上下文的所有方法。

安卓学习笔记(二)基本构件

时间: 2024-10-06 00:40:30

安卓学习笔记(二)基本构件的相关文章

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource

Swift学习笔记(二)参数类型

关于参数类型,在以前的编程过程中,很多时间都忽视了形参与实参的区别.通过这两天的学习,算是捡回了漏掉的知识. 在swift中,参数有形参和实参之分,形参即只能在函数内部调用的参数,默认是不能修改的,如果想要修改就需要在参数前添加var声明. 但这样的声明过后,仍旧不会改变实参的值,这样就要用到inout了,传递给inout的参数类型必须是var类型的,不能是let类型或者字面类型,(字面类型是在swift中常提的一个术语,个人认为就是赋值语句,也不能修改)而且在传递过程中,要用传值符号"&