NO END FOR LEARNING

Writing blog if you feel tired | 学海无涯 苦写博客

Cordova探索之旅系列(一)

| Comments

最早接触PhoneGap平台是在1年多之前,能够使用HTML、CSS和JavaScript跨平台来编写Android或者IOS设备程序,并且应用的核心代码不需要多少修改就可以移植,确实让我感觉的到它应该是未来移动设备开发的趋势。Web程序员,特别是前端程序员,能够轻松的通过Web技术来编写移动设备软件。

但是当时给我带来的感觉是应用的响应速度太慢,提供的API不全,能够实现的功能不多。PhoneGap经过1年多的沉淀,如今过头再来看PhoneGap,它又是什么样的呢?有哪些进步呢?

Cordova是什么?

Apache Cordova是PhoneGap贡献给Apache后的开源项目,是从PhoneGap中抽出的核心代码,是驱动PhoneGap的核心引擎。

Cordova是一个设备API的集合,它允许手机开发者通过JavaScript去访问设备原生功能,例如相机,重力感应等。结合UI框架,例如jQuery Mobile,Dojo Mobile或者Sencha Touch,可以让开发者通过HTML,CSS和JavaScript开发手机应用。

当使用Cordova的API时,应用可以在没有任何原生代码(Java,Object-C等)的情况下构建。并且,虽然使用着Web开发技术,但是该应用却是在本机运行,而不是远程的Web应用)。

并且因为提供的JavaScript的API在多个设备平台都保持一致性并且基于web标准,所以,应用可以在几乎没有任何修改的情况下应用到各个不同的设备平台。

使用Cordova开发的应用仍然是使用平台的SDK打包,可以放置到每个设备平台的应用商店中。

Cordova提供了一套统一的JavaScript库,其背后使用平台对应的代码来驱动设备。Cordova支持的平台有:IOS,Android,Blackberry,Windows Phone,Palm WebOS,Bada和Symbian。

如何开始Cordova编程?

1.下载并安装node.js(如果你已经安装过,就不用了)

http://nodejs.org/

2.安装Cordova

1
sudo npm install -g cordova

3.创建应用程序

1
cordova create hello com.example.hello HelloWorld

4.添加应用平台

这里添加的是Android应用程序

你可能会得到如下信息:

Error: ERROR : executing command ‘ant’, make sure you have ant installed and added to your path.

说明你需要安装ant,方法如下:

1
2
brew update
brew install ant

然后添加应用平台

1
cd hello

首先进入到hello目录下

1
cordova platform add android

这里也可以删除一个应用平台

1
cordova platform rm android

通过ls命令

1
cordova platforms ls

可以查看你安装关于平台的信息,例如,我的是:

Installed platforms: android 3.3.0

Available platforms: blackberry10, firefoxos, ios

5.构建应用程序

在进行构建之前,先确保你的Android SDK配置好了。

需要下载Android的SDK,并设置Path到系统路径下。

安装Android SDK(Mac平台,下载解压缩就行)

配置SDK的Path到系统路径

1
touch ~/.bash_profile; open ~/.bash_profile

在profile文件中加一句话:

export PATH=${PATH}:/Users/twer/Downloads/adt-bundle-mac-x86_64-20131030/sdk/platform-tools:/Users/twer/Downloads/adt-bundle-mac-x86_64-20131030/sdk/tools

记得要指定你自己的路径。

最后还要执行profile将它更新到你的系统path下。

1
source ~/.bash_profile

然后你就可以开始构建了:

1
cordova build

当然你也可以正对某一个平台构建:

1
cordova build android

6.在模拟器上运行

1
cordova emulate android

此时,模拟器会启动,并自动安装应用,效果应该如下:

Jasmine

7.实体机上运行

将你的设备插到电脑上,然后运行命令:

1
cordova run android

会将应用安装到你的手机上。

About Android Activity LifeCycle(译)

| Comments

Jasmine

Activity是应用的一个组件,它提供用户可以交互的屏幕,例如拨打电话,照相,发邮件,看地图。每一个Activity都会被赋予一个窗户用来绘画用户界面。这个窗口通常会占据整个屏幕,但是也可以比屏幕小和悬浮在其他窗口之上。

一个应用程序通常由多个Activity组成,它们之间以一种较为松弛的关系联系在一起。例如,一个Activity作为主要的Activity,它会作为程序启动时第一个展现给用户的Activity。每一个Activity能够启动另外一个Activity,以便去执行其他的动作。每一次一个新的Activity启动,前一个Activity就会停止,但是系统会将它保存在一个栈中(“back stack”)。当一个新的Activity启动时,当前的Activity会被压入栈中,并拿走焦点。这个栈遵守“后进先出”原则,所以,当用户在当前Activity完成对应操作,按下返回按钮的时候,它会从栈顶弹出,并销毁,然后前一个Activity恢复。

当一个Activity因为另一个新的Activity启动而停止时,系统会通过Activity生命周期中的回调函数通知它这个状态的变化。由于状态的改变,Activity会接受到多个回调函数,无论系统是在create,stop,resume还是destroy,并且每一次回调都提供你一个机会去执行适合这个状态变化的操作。例如,当stop时,你的Activity应该释放任何比较大的对象,例如网络和数据库连接。当Activity恢复时,你应该从新获取必要的资源和恢复之前被打断的操作。状态的转换是Activity生命周期的一部分。

通过回调函数去管理Activity的生命周期是实现健壮和灵活应用的关键。Activity的生命周期直接受到其他Activity,Task以及back stack的影响。

一个Activity可以存在于三个状态中:

Resumed

该状态下,Activity置于屏幕前景,并拥有聚焦,可以把这个状态理解为正在运行。

Paused

该状态下,另一个Activity正置于屏幕前景并拥有聚焦,但是当前Activity仍然可见。一个暂停的Activity是处于完全存活状态的(Activity对象仍然保有内存,它维持状态和成员信息,并保持与Window Manger的关系),但是如果内存不足时,系统有权利关闭该Activity。

Stopped

该状态下,该Activity完全被另一个Activity遮挡(该Activity就会进入到背景状态)。进入stopped状态的Activity也是仍然处于存活状态。然而,它对用户是不可见的,同样在系统需要内存的时候,它会被关闭。

如果一个Activity进入paused或者stopped状态,系统可以通过调用finish方法或者终止进程的方式,将Activity从内存中清除。当该Activity从新打开,他必须要重新创建一次。

Activity完整的生命周期发生于onCreate()方法和onDestroy()方法之间。Activity应该在onCreate()方法时,设置一些全局状态,例如布局,并且在onDestroy()方法释放所有保持的资源。例如,如果Activity拥有一个线程在后台运行并正在从网络上下载数据,该线程可能是在onCreate()方法中创建的,那么就应该在onDestroy()方法中停止该线程。

Activity的可见生命周期发生于onStart()方法和onStop()方法之间。在这段时间,用户可以在屏幕上看见它,并进行交互。例如,onStop()方法被调用发生在当一个新的Activity启动,而当前Activity不在可见时。在这两个方法之间,你可以保有Activity所需要的资源。例如,你可以在onStart()方法调用时,注册一个BroadCartReceiver,让他监控你对UI的操作,并在用户不在看到这个Activity时,在onStop()方法中注销这个BroadCartReceiver。

Activity前景生命周发生于onResume()方法和onPause()方法之间。在这段时间中,该Activity处于所有Activity的上方并且拥有用户输入焦点。Activity能够频繁的在前景中出镜和入镜。例如,当设备进入睡眠或者有一个对话框弹出时,在onPause()方法被调用时。因为,这个状态频繁的转变,在这两个方法中的代码要尽量的轻量级,以避免转换太慢,让用户等待。

Method Description Killable after? Next
onCreate() 当Activity第一次被创建时调用。在这里,你应该做所有关于静态配置的事情-创建View,绑定数据到List等等。这个方法会传入一个Bundle对象,如果Activity中有捕获自身状态,那么它包含了Activity之前的状态。 No onStart()
onRestart() 在Activity停止之后被调用,指明Activity会被重新启动。 No onStart()
onStart() 在Activity变成用户可见状态之前调用。如果Activity要变成前景状态,那么onResume()方法会被调用,如果Activity要被隐藏,则onStop()方法会被调用。 No onResume() or onStop()
onResume() 在Activity开始与用户交互之前调用。这个时候,Activity会置于栈顶,并伴随着用户输入。 No onPause()
onPause() 在系统开始要恢复另一个Activity时被调用。该方法通常被用于提交未保存数据到持久数据中,停止动画和其他会占用CPU资源的操作。并且应该非常迅速的做这些事情,因为下一个Activity只有在当前方法执行完成之后才会恢复。如果Activity回到前端,则onResume()方法跟在onPaused()方法后面,如果对用户不可见,则onStop()方法跟在后面。 Yes onResume() or onStop()
onStop() 当Activity对用户不在可见时被调用。onStop()发生的原因是Activity被销毁,或者另一个Activity被恢复并正在覆盖当前Activity。如果紧跟随着的是onRestart()方法,则说明Activity正在恢复与用户的交互。如果跟着的是onDestory()方法,则说明这个Activity要被销毁了。 Yes onRestart() or onDestroy()
onDestroy() 在Activity被销毁时调用。这是Activity最后一个会接收到的调用。被调用的原因要么是因为finish()方法在哪个位置调用,或者因为系统因为要保留资源而临时销毁它。可以通过isFinishing()方法来区分两种不同情况。 Yes nothing

文献参考自:http://developer.android.com/guide/components/activities.html