Browsed by
Author: YI

Android开发指导随译(2) — 应用程序基本原理(5)

Android开发指导随译(2) — 应用程序基本原理(5)

Activities与Tasks(任务)

一个Activity可以启动另一个Activity, 即使该Activity定义在另一个应用程序中. 用户无法区分出这两个Activity有可能是定义并运行在不同的应用程序进程中.

Android在同一个Task中维持这两个Activity, 以保持用户的体验. 简单而言, 对用户体验来说, 一个Task就是一个”应用程序”. 它是一组相关的activity,并组织在同一个堆栈中. 堆栈中根activity(root activity)就是启动当前task的activity. 堆栈最顶部的activity就是当前正在运行的activity. 当一个activity启动另一个activiey, 新的activity就推入堆栈, 称为当前运行的activity. 以前的activity保留在栈中. 当用户按下BACK键, 当前activity就从堆栈中弹出, 以前的activity恢复为当前运行的activity.

堆栈中可以包含多个对象. 如果一个task包含同一个activity的多个实例, 堆栈对每个实例都有一个独立的入口(entry). 栈中的activity永远不会重新进行调整, 只有推进(Push)和弹出(Pop).

task就是activities的栈. 没有办法对task中所有的activities独立设置值(笔注: 是指变量值吗?). task的值只能设置在根activity中.

task中的所有activities作为一个单元共同进行移动. 整个task可以设置到前台运行, 也可以送到后台运行.

亲和(Affinities)与新task

缺省情况下, 应用程序中的所有Activities共有一个affinity. 每个activity也可以设置独立的affinity. 定义在不同应用程序中的activities可以共享同一个affinity. 在同一个应用程序中的activities可以分配不同的affinities.

FLAG_ACTIVITY_NEW_TASK标识
如果传递给startActivity()的Intent包含FLAG_ACTIVITY_NEW_TASK标识, 系统会查找不同的task来承载当前的activity. 通常, 这会是个新task. 如果已经有一个task具有与当前activity相同的affinity, 则当前的activity会登录进该task.

allowTaskReparenting属性
如果allowTaskReparenting属性设置为true, activity可以从启动它的task移到另一个具有相同affinity的task中.

启动模式
standard (缺省模式)
singleTop
singleTask
singleInstance

Android开发指导随译(2) — 应用程序基本原理(4)

Android开发指导随译(2) — 应用程序基本原理(4)

激活组件: Intents(意图)

CP收到CR的请求时就可以激活. 其他三个组件: 行为, 服务以及BR都是通过异步消息激活, 这种消息就是”intent(意图)”.

关闭组件

CP只在相应CR请求时存活, BR只在响应广播消息时存活, 因此对它们而言没有必要显式地关闭这些组件.

另一方面, Activities提供了用户界面. 它们与用户可能会有一个长期的会话过程, 会话期间即使是空闲也仍然保持激活. 类似的, 服务也可能保持运行很长一段时间. 因此Android提供方法有持续地关闭Activity和服务.

1. 可以调用Activity的finish()方法关闭Activity. 一个activity可以关闭另外一个activity.
2. 服务可以通过调用stopSelf()的方式来关闭自己, 或者调用Context.stopService()来关闭.

如果不再使用组件了, 系统也可以关闭它们, 或者当Android必须回收内存时也会关闭这些组件.

manifest文件 (?运货单文件)
Android启动一个程序组件之前, 需要知道这个组件的存在. 因此应用程序需要在一个manifest文件中声明它们的组件. manifest文件打包在.apk文件中, 该文件(.apk)还包含程序代码, 文件以及资源等.

manifest文件是一个结构化的xml文件, 并且总是命名为”AndroidManifest.xml”. 它最主要的任务就是将当前应用程序的组件情况告诉Android系统.

Intent过滤
Intent对象可以显式地命名为一个目标组件(Target Component), 此时Android可以通过manifest文件对它进行操作. 但是如果目标没有显式命名, Android就必须要查找最合适的组件来响应Intent, 方法就是将Intent对象与潜在目标的Intent filters(Intnet过滤)进行比较.

感谢iNove

感谢iNove

非常不错的中文模板.

其实WordExpress 3.0的缺省模板也挺好, 不过字体, 段间距, 行间距实在太大, 我也不想在这方面花太多时间去调整. 而iNove做得确实不错, 我尤其喜欢它的menu设计.

如果说iNove的缺点话, 我只是觉得抬头的黑色部分太沉重了, 换成WordExpress的缺省抬头部分可能效果会不错.

1+1>2?

1+1>2?

强强联手是否会营造更好的结果? 在IT领域, 这方面成功的例子可能不太多.
Intel和HP当年打造的安腾, 现在就没什么消息了. 两个巨无霸联手, 大家都心怀鬼胎, 要齐心协力去干一件事, 还真不容易. Wintel联盟之所以成功, 是因为他们从小就混在一起. 现在大家翅膀都硬了, 这不又开始各打小算盘了么.
看看MeeGo, 不禁又开始担心了. 这次又是两个巨无霸的合作啊.

微软也准备推网络广告联盟了

微软也准备推网络广告联盟了

http://advertising.microsoft.com/

以前申请过Google Adsense,后来莫名其妙地被封掉了。据说很难和GG沟通,因此就干脆放弃了。

如果微软也准备推这个东西,倒是可以做一下尝试。

Android开发指导随译(2) — 应用程序基本原理(3)

Android开发指导随译(2) — 应用程序基本原理(3)

Service(服务)

服务没有可视界面, 而是在后台运行不确定的时间. 例如, 一个服务可以播放背景音乐, 或者从网络中获取数据, 或者做一些计算,等等.

每个服务都是从Service基类扩展(笔注: extend? or 派生?).

典型的应用例子是媒体播放. 如果媒体播放行为退出后, 仍然希望能继续播放音乐, 媒体播放行为应启动一个服务在后台运行. 系统将保持音乐播放服务, 即使启动它的行为已经离开了当前屏幕.

可以连接已经运行的服务, 或者启动尚未运行的服务. 连接完成后, 可以通过服务提供的接口与服务进行通信. 对音乐服务而言, 它提供的接口可以允许用户暂停, 倒回, 体制或者重新播放音乐.

与行为和其他组件一样, 服务运行在应用程序进程的主线程, 所以它们不会阻塞其他组件或者用户界面. (笔注: 这里的意思应该是指服务是在一个独立的线程中运行, 不会干扰其他线程吧??)

Broadcast receivers(广播接收者,BR)

BR只接收和响应广播通知, 不做其他任何事情. 有些广播是由系统发起的, 例如时区改变, 电池电量不足, 用户改变了界面语言等. 应用程序也能发起广播, 例如通知其他应用程序某些数据已经下载到设备,并且可以使用了.

应用程序可以由任意数目的BR来响应它认为重要的任何通知. 所有的接收者都是扩展自BroadcastReceiver基类.

BR也不显示用户界面. 然而, 它们可以启动一个行为来响应它们接收到的信息, 或者使用NotificationManager通知用户.

Content providers (内容提供者, CP)

CP可以使一系列的应用程序数据能够被其他应用程序使用.

CP扩展自ContentProvider基类, 实现了一系列标准的方法供其他程序获取,存储它所控制的数据类型. 然而, 应用程序不是直接调用这些方法, 而是使用ContentResolver(CR)对象并调用它的方法. 一个CR可以与任何CP通话. CR和CP共同管理着跨进程通信.

附注, 我开始使用缩写语了, 玷污了中文环境, 我很惭愧……

Android开发指导随译(2) — 应用程序基本原理(2) Activity(行为)

Android开发指导随译(2) — 应用程序基本原理(2) Activity(行为)

一个Activity(行为)代表了一个可视的用户交互接口. 例如, 一个文本消息程序可能会有一个Activity(行为)用于显示联系人列表, 第二个行为用于给选定的联系人写文本信息, 另外一个行为用于显示以前的信息或者改变设置. 它们共同工作提供了一个聚合的用户界面.

每个行为与其他行为都是独立的, 它们都是从Activity基类派生而来.

每个应用程序可以由一个或者多个行为构成. 通常在应用程序启动时, 会将其中一个行为设置为首先呈现给用户的行为. 当前行为可以启动下一个行为来实现行为的跳转.

每个行为都有一个缺省的窗体. 一般而言, 窗体总是填满整个屏幕的, 但是也可以比当前屏幕小些并且浮在其他窗体之上. 行为也可以使用附加的窗体,例如对话框等.

窗体的可视内容由View(视图)来提供, 所有的view都是从view基类派生. 每个view控制窗体的一部分区域. 父View包含和组织子view的布局. 叶子view(处在派生关系的底部)绘制它们控制的区域, 并响应用户在这部分区域的动作.

Android预置了一些view, 例如按钮, 文本框, 滚动条等. (笔注: 在windows编程中, 这些反而是窗体吧)

行为的窗体可以通过Activity.setContentView()方法设置view的层级关系, Content View(内容View)是这种层级关系中的根节点. (?)

一个非常好的笔记软件:EverNote

一个非常好的笔记软件:EverNote

官方网站:http://www.evernote.com/ 而且是免费的!

基本上这是我一直想要的软件,将笔记同步到server上,随时随地都可以进行编辑,可以在各计算机之间共享等等。

当初,我就特别喜欢Google documents,曾经希望能把大部分文档,资料都迁移到Google documents上去,费了老半天劲,刚觉得开心起来,Google documents就被和谐了,后来虽然开放了一些,但也时不时会断掉,非常不爽。

基本上我对EverNote是垂涎三尺的,可是有了Google documents的前车之鉴,我现在还是老老实实地用wordpress记录吧。

写这个blog的意思是做个mark,也许未来神奇的国度里不再发生神奇的事情后,我还能尝试一下。

WordPress技巧

WordPress技巧

从网上遛狗遛出来的, 以后可能用得着:

禁用WordPress文章历史修订版本(Revisions)

在wp-config.php中的代码require_once(ABSPATH . 'wp-settings.php');前增加以下代码:define('WP_POST_REVISIONS',false);即 可;

清理数据库中以前的文章历史修订版本

另外你也可以通过phpmyadmin定期清理和删除数据库中的冗余文章修订版本,清理以前的文章修订版本也一样。数据库操作前最好先进行备份。在 phpmyadmin 中进行数据库管理,SQL语句命令行中写入以下运行代码执行(若你设置了数据库表名的前缀,需要将数据表名称中wp改成你的前缀):

delete from wp_posts where post_type=’revision’;

另外还可以再用SQL语句:

DELETE FROM wp_postmeta WHERE meta_key= ‘_edit_lock’;

DELETE FROM wp_postmeta WHERE meta_key =’_edit_last’;

删除数据库中文章特殊数据表wp_postmeta中meta_key字段为_edit_lock(代表上次修改post的修改时间)和 _edit_last(指最后一次编辑时间)的数据,然后全选所有表,下拉列表中选择使用phpmyadmin“优化表”功能。