代码改变世界

Adobe Flash Builder 4.5 Android Air 程序开发系列 之四 打开与关闭应用程序是的保存数据

2011-07-25 12:34  c#在路上  阅读(4954)  评论(1编辑  收藏  举报

在Android 系统中,每一个应用程序,也称为活动,被赋予了唯一的用户ID而在自己的进程中运行。系统本身,或者叫活动管理器,来

维护应用程序的周期和一个公用的活动栈。

每一个应用程序的生命周期有3个阶段,活动或者运行,暂停 和 停止。AIR的应用程序和其他的应用程序是一样的。因为应用程序有一个

有限的周期,所以他可以存储数据。Android 提供了sqlite 数据库,或者是内部状态,是一些简单 的name/value 键值对。

AIR 使用自己的API来保存数据。AIR有自己的Sqllite 引擎,和文件系统的权限。也提供了Local shared object ,一个像cookies 的解决方案。

这一讲中,将讲述这些概念。

AIR 应用程序

NativeApplication 代表了你的AIR应用程序。他在flash.desktop.pakage 中,继承自EventDispatcher。他采用单例模式,在程序加载后被自动

创建。你可以用静态方法 NativeApplication.nativeApplication获取一个引用的实例.

他还可以触发应用程序类型的事件,比不invoke和exiting 以及一些应用程序的特殊属性,比如icon 和 systemIdleMode.有些属性是为

AIR 的桌面程序创建的,不提供在移动应用程序中,比如:activewindow 或者是opendwindows,因为移动设备中没有多个窗口。

应用程序的打开

在点击图标后,你的程序开始运行,而当前运行的程序被移动到后台运行。AIR开发的应用程序与其他程序之间的导航是相同的,可以

可以任意切换。

Android 没有提供应用程序的启动界面。所以程序的启动时一个黑色的背景。测试你的应用程序,如果启动的时间很长,你必须重写

你的启动模块。有一个变通,你的根应用程序必须是一个简单的加载indicator 图片。程序加载是,注册ADDED_TO_STATE 事件,使用loader 记载你自己的

Application 。

      程序默认是没有全屏显示的,你可以通过设置应用程序配置 来使之全屏显示<fullScreen>true</fullScreen>。

  应用程序的关闭

当其他程序被选择,AIR 程序其实是在后台运行,而不是关闭。对于AIR ,NativeApplication 将会触发exiting 事件和closing 事件。你可以注册该事件,一遍在应用程序关闭的时候做一些自己的工作。

import flash.desktop.NativeApplication;

import flash.events.Event;

NativeApplication.nativeApplication.dispatchEvent(Event.EXITING.onExit);

function onExit(event:Event):void

{

//save application's current state

}

在android 中,【Settings】|【Aplications】|【Manager applications】 强制关闭应用程序,在AIR中可以是使用一下代码强制关闭应用程序

NativeApplication.nativeApplication.exit();

后天运行与前台运行

当应用程序转到前天或者后台运行,NativeApplication 都会触发事件。如下:

NativeApplication.nativeApplication.addEventListerner(Event.ACTIVATE,onActivate);

NativaApplication.nativeApplication.addEventListerner(Event.DEACTIVATE,onDeactivate);

在Flash Player 10.1 中 和AIR2.0 中,为了考虑到内存和电池的使用寿命,做了部分改进。当应用程序在不在激活状态,程序将进入到睡眠模式,停止rendering 和 刷新的频率降低到4fpps。为什么是使用4,这个数字是socket 连接必须的。如果你的AIR 程序不需要持久的socket连接,你可以将这个值设为0。

stage.frameRate=0;

有些是需要保持的状态,如视屏。这个示例展示了怎么样play和暂停正在播放的视屏。

import falsh.desktop.NatvieaApplication;

import flash.events.Event;

import flash.media.Video;

import flash.media.NetConnection;

import flash.media.NetStream;

NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE,onActivate);

NativeApplication.nativeApplication.aadEventListener(Event.DEACTIVATE,onDeActivate);

var video:Video=new Video(640,270);

var nc:NetConnection=new NetConnection();

nc.connect(null);

var ns:NetStream=new NetStream(nc);

video.attachNetStream(ns);

ns.play("youmoive.mp4");

public function onDeActivate(event:Event):void

{

 ns.pause();

}

public function onActivate(event:Event):void

{

 ns.play()

 }

当有电话打进来的时候,在通话过程中也播放视屏是一个很差的用户体验。添加READ_PHONE_STATE 权限到应用程序配置文件。这样的话,AIR 在打电话过程将会关闭声音。

<user-permission android:name="android.permission.READ_PHONE_STATE "?>

在应用程序返回是,使用system.gc 方法。

菜单,返回,搜索按钮

有一些按钮别用于系统的导航与搜索。除过Home 按钮,其它的你可以自定义他们的事件在AIR程序中。

注册keyboardEvent.KEY_DOWN 事件,通过keycode 识别按下的那个健,使用event.preventDefault() 阻止该事件,然后使用自定义的行为。

package 

{

import flash.desktop.NativeApplication;

import flash.display.Sprite;

import flash.display.Stage;

import flash.display.StageAlign;

import flash.events.Event;

import flash.events.KeyboardEvent;

import flash.ui.Keyboard;

// replace Sprite for MovieClip if using Flash Professional

public class AirApplication extends Sprite

{

public function AirApplication()

{

stage.align = StageAlign.TOP_LEFT;

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKey);

NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, onActivate);

NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, onDeactivate);

}

private function onKey(event:KeyboardEvent):void {

switch(event.keyCode) {

case Keyboard.BACK :

event.preventDefault();

trace("back");

// go back within AIR application

break;

case Keyboard.MENU :

event.preventDefault();

trace("menu");

// display custom menu

break;

case Keyboard.SEARCH :

event.preventDefault();

trace("search");

// use as a help button or debug tool

break;

}

}

private function onActivate(event:Event):void {

stage.frameRate = 24;

trace("application in foreground");

}

private function onDeactivate(event:Event):void {

stage.frameRate = 4;

trace("application in background");

// to shut-down application, uncomment following line

// NativeApplication.nativeApplication.exit();

}

}

}

在移动设备上保存数据

保存数据时应用程序必备的功能,如程序在后天运行,或者被关闭后,保存程序配置信息等。

内部与外部存储

以下列出一些目录:

内部的一些存储:File.ApplicationDirectory ,是应用程序的安装目录,在这个目录是只读的。

File.ApplicationStorageDirectory 是应用程序的存储目录,使用这个目录可以保存大量的数据,和用户设置等。如果应用程序被删除的话,这个目录也会被删除。

外部的一些存储:

File.documentsDirectory ,File.userDirectory,File.desktopDirectory 等。可以保存大的数据,如图片,视屏,和临时文件。访问这些文件的全选是:

<uses-permision android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,在使用之前,确认是否有sd卡:

 If(File.userDirectory==true)

//proceed with saving data

一下变量所指的目录:

App:/

File.applicationDirectory

/data/data/app.appId/app/assets

|app-storage:/

/data/data/app.appID/appID/Local Store

|File.applicationStorageDirectory

/data/data/app.appID/appID/LOcal Store

|File.documentsDirectory

File.userDierecory

File.desktopDirectory

/sdcard

|File.createTempDirectory()

File.createTempFile()

/data/data/app.appId/cache