NO END FOR LEARNING

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

Cordova探索之旅系列(二)

| Comments

在Cordova中有一个很重要的概念:插件

插件会提供访问Cordova核心API的接口。

插件是一些附加的代码,它能够提供访问原生组件的接口。一般情况下,你都需要添加一些插件以启动Cordova设备级别的特性。

插件由官方和社区提供,可以在plugins.cordova.io上找到,当然还可以在命令行中去搜索插件。

从3.0之后,Cordova将所有设备的API都作为插件,并默认设置为是不启动的。

那么,如何添加插件呢?两种方式。

第一种是使用CLI命令行。

第二种是使用更低级别的命令行Plugman。

两个的区别在于,Plugman只能一次添加一个平台的插件,而CLI命令行会添加所有平台的插件。所以如果你只在单个平台上工作,使用Plugman就显得更合理。

使用CLI命令行添加插件:

1.添加插件

1
cordova plugin add org.apache.cordova.camera

2.删除插件

1
cordova plugin rm org.apache.cordova.camera

3.查看当前已有插件

1
cordova plugin ls

4.根据关键字搜索插件

1
cordova plugin search bar code

5.社区中会提供很多插件,但是如果它没有注册到registry.cordova.io,你可以通过仓库地址添加

1
cordova plugin add https://github.com/apache/cordova-plugin-console.git

使用plugman添加插件:

首先你需要安装plugman

1
npm install -g plugman

1.添加一个插件

1
plugman --platform <ios|amazon-fireos|android|blackberry10|wp7|wp8> --project <directory> --plugin <name|url|path> [--plugins_dir <directory>] [--www <directory>] [--variable <name>=<value> [--variable <name>=<value> ...]]

通过plugman命令行将一个插件加到一个Cordova工程中。你至少要指定平台信息、Cordova项目位置。

name:插件的目录名称。它必须是存在于plugins_dirpath路径下或者在Cordova中有注册。

url:以”http://“或者”git://”开头的url,指向一个合法的git可克隆仓库,仓库中应该包含一个plugin.xml的文件,仓库中的内容可以被拷贝到plugins_dir路径下。

path:一个指向包含合法插件(包含plugin.xml文件)目录的路径。该路径下的内容可以被拷贝到plugins_dir。 其他参数:

plugin_dir:默认是指向/cordova/plugins,当然也可以是任何包含每一个已获取插件的子目录。

www:默认指向项目的www目录,但是也可以指向Cordova项目的应用web asserts目录。

variable:允许在安装时指定某些变量,对于某些插件需要API key或者其他用户定义参数是有必要的。

下面是添加电池状态插件的安装命令行

1
plugman -d --platform android --project myProject –plugin org.apache.cordova.battery-status

-d或者—debug参数,会帮助你打印出内部调试信息,帮助你跟踪具体信息。

2.删除一个插件

1
plugman --uninstall --platform <ios|amazon-fireos|android|blackberry10|wp7|wp8> --project <directory> --plugin <id> [--www <directory>] [--plugins_dir <directory>]

Android Service(译)

| Comments

Service是Android应用程序中的一个组件,它能够长时间在后台运行,并且不提供界面。另一个应用程序的组件可以启动一个Service并持续在后台运行即便用户切换到别的应用程序。而且,组件可以和Service绑定并与它进行交互,甚至执行进程间通信(IPC)。例如,一个Service可以处理网络通信,播放音乐,执行IO操作,或者和启动它的组件交互,这些都是在后台进行。

使用Service有两种方式:

启动Start

当一个应用组件(例如Activity)调用startService()方法时,可以启动一个Service。一旦被启动,一个Service会无止境的运行在后台,即使启动它的组件被销毁了。通常启动一个Service会去执行一个单独的操作,并且不会返回任何的结果给调用者。例如,它可以下载或者上传文件。当这件事情完成,Service自己会停止。

绑定Bound

当一个应用组件调用bindService()方法时,可以绑定一个Service。一个被绑定的Service提供了一个CS模式的接口,它允许组件与Service进行交互,发送请求,返回结果,与进程间通信。被绑定的Service会一直运行只要有其他应用组件绑定它。多个组件可以绑定到同一个Service,但是当所有的组件都解除绑定,该Service就会被销毁。

对应于这两种方式,有两个回调函数去实现,onStartCommand()对应启动方式,onBind()对应绑定方式。

无论你的应用程序是启动还是绑定一个Service还是两种方式有用到,对于任何一个应用程序都可以使用该Service(即便是另外一个应用程序)。同理,任何组件也可以使用一个Activity(通过Intent)。然而,你可以在Manifest文件中将Service定义为私有的,并禁止其他应用访问它。

Service运行在宿主进程的的主线程中——Service不会创建它自己的进程,也不会运行在分开的进程中(除非你特别指定)。这意味着,如果你的Service要做任何占用CPU或者阻塞操作(例如播放音乐或者网络操作),你应该单独为Service创建一个线程。通过使用单独的线程,你会减小应用程序未响应(ANR-Application Not Responding)错误,并且让应用程序主线程保持用户与Activity进行交互。

创建Service,你必须创建一个Service的子类(或者一个已经存在的子类)。在实现类中,你需要重写一些回调函数,这些回调函数处理着Service的生命周期,并且提供一个机制让组件去绑定Service。

onStartCommand()

该方法被调用,当另一个组件,例如Activity通过调用startService(),请求一个Service启动。一旦该方法被执行,Service会启动,并在后台无止境运行。如果你实现这个方法,你就应该负责停止它(通过调用stopSelf()或者stopService(),但如果是绑定,就不用实现这些方法)。

onBind()

该方法被调用,当一个组件想要绑定该Service(例如执行RPC),需要调用bindService()。在这个实现方法中,你需要提供一个接口(返回一个IBinder)给调用者,以便调用者与Service进行交互。你必须实现这方法,但是如果你不希望该Service被绑定,那么你可以放回一个null。

onCreate()

该方法被调用,当Service被第一次创建,要去执行一次性的配置过程(在该方法被调用的要么是onStartCommand()或者onBind())。如果一个Service已经在运行,则这个方法不会再被调用。

onDestroy()

当Service不在被使用时,系统会去调这个方法。你的Service应该执行一些清理资源的工作,例如线程,已注册的监听器等。它是Service最后被调用的方法。

Android系统会强制停止一个Service,仅仅当内存不足且系统必须会已经有用户焦点的Activity恢复一些系统资源时。如果Service绑定到一个拥有用户焦点的Activity,那么一般不会被杀掉,如果该Service被定义在后台运行,那么它几乎不会被杀掉。否则,如果Service被启动且长时间运行,那么系统会降低它在后台任务中的位置,然后该Service会变成最容易被杀掉的服务。如果你的Service被启动,那么你必须将它优雅的设计成能够被系统重启。如果系统杀掉你的Service,它会在资源够用的时候立刻重启你的Service(虽然它也依赖于onStartCommand()方法返回的值)。

LifeCycle

Jasmine

Service的整个生命周期发生在onCreate()方法和onDestory()方法之间,就像Activity一样,分别进行一些初始化工作和清理资源工作。且无论是启动Service还是绑定Service,这两个方法都会被调用到。

Service活动周期开始于onStartCommand()或者onBind()方法,每一个方法都会被传入一个Intent对象。

如果Service以启动方式开始,那么活动周期与整个生命周期同时结束。如果Service是绑定的,那么活动周期是以onUnbind()方法结束。

Service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class ExampleService extends Service {
    int mStartMode;       // indicates how to behave if the service is killed
    IBinder mBinder;      // interface for clients that bind
    boolean mAllowRebind; // indicates whether onRebind should be used

   @Override
    public void onCreate() {
        // The service is being created
    }

   @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // The service is starting, due to a call to startService()
        return mStartMode;
    }

   @Override
    public IBinder onBind(Intent intent) {
        // A client is binding to the service with bindService()
        return mBinder;
    }

   @Override
    public boolean onUnbind(Intent intent) {
        // All clients have unbound with unbindService()
        return mAllowRebind;
    }

   @Override
    public void onRebind(Intent intent) {
        // A client is binding to the service with bindService(),
        // after onUnbind() has already been called
    }

   @Override
    public void onDestroy() {
        // The service is no longer used and is being destroyed
    }
}

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