顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2015年12月28日 星期一

ImageView寬高時保持原比例

我只是要把一張bitmap放到App上置中秀出來, 並且可以保持原比例的放滿整個畫面.
為這樣子的功能Google了蠻久的, 因為總覺得不需要太複雜的設定, 就要可以達到這樣子的目的才對啊. 最後終於發現為什麼我一開始無法保持原比例放大了. 目前的結論如下:

layout的xml設定如下(它是一個LinearLayout 再加一個ImageView)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:gravity="center" >
    <ImageView android:id="@+id/template_imageview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
    </ImageView>
</LinearLayout>
android:layout_height="match_parent" <=== 很多人說要用"wrap_content"

然後在Java的程式裏面
ImageView imageView = (ImageView) findViewById(R.id.template_imageview);
imageView.setImageBitmap(downloadBitmap);
imageView.setAdjustViewBounds(true);
最重要的一行imageView.setAdjustViewBounds(true); 不設定為true的話無法放大圖片.

避免螢幕旋轉再次自動執行onCreate()

寫了一個程式, 裏面放了三個ListView, 依情況分別設定想要秀出來的ListView, 這時才發現, 當我旋轉手機後, 居然會重新呼叫onCreate(), 整個流程就從頭來過了.

查了一下官網的資料Handling The Change, 有教要如何避開這種情況. 主要是要做2個修正.
(1)AndroidManifest.xml (2)新增onConfigurationChanged

這兩個修改步驟如下:
(1)在AndroidManifest.xml裏面加入下圖, 紅色框框的文字.
新增的設定為android:configChanges="orientation|keyboardHidden|screenSize"
(2)在你的Activity.java檔案裏, 加入下面的程式碼
@Overridepublic void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);

}

根據實驗, 這樣子的修改後, 真的不會又被呼叫一次onCreate()了.

2015年12月1日 星期二

Android各個版本的使用狀況分析表

在Google的Android Dashboards頁面, 就有每個版本的使用率可以參考.
下圖是2015年11月份的狀況

2011年6月4日 星期六

Android Development Flow



  • 黃色框的部份是Android提供的工具.
  • 橘色框的部份是由開發者自行產生的檔案.
  • 剩餘的白色框的部份則是工具自行產生.

  • aapt:
    aapt stands for Android Asset Packaging Tool and is included in the tools/ directory of the SDK. This tool allows you to view, create, and update Zip-compatible archives (zip, jar, apk). It can also compile resources into binary assets.

Android Developer:aapt

2009年2月13日 星期五

Android on x86 展示影片

Android on the HP 2133 Demo


Android on Asus EeePC 901 Demo

2008年12月31日 星期三

X86上執行Android[轉貼]

Lim,GeunSik剛剛在android-porting討論組中詳細闡述了這個方法。我先把方法放過來,不過還沒來得及驗證,他用的是ASUS Eee,估計效果和N810上的差不多的。一下所有步驟都是基于Fedora的,ubuntu用戶自行參考。

開發環境:
- Linux PC: Fedora 9 ( 2.6.25.6-55.fc9 i686)
. CPU: Intel(R) Core(TM)2 Duo CPU T5750 @ 2.00GHz ( Samsung
SENS R60 Laptop )
. RAM: Samsung DDR Ram
- Target: Eee PC (ASUS) and Samsung nettop NC01
- Reference: http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=19

1. Linux發行版訊息

首先是驗證系統訊息

Fedora9$> uname -a
Linux fedora-invain9 2.6.25.6-55.fc9.i686 #1 SMP Tue Jun 10 16:27:49
EDT 2008 i686 i686 i386 GNU/Linux

Fedora9$> gcc –version and Fedora9$> gcc34 –version
Fedora9$> gcc –version
gcc (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8)
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There
is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.

Fedora9$> gcc34 –version
gcc34 (GCC) 3.4.6 20060404 (Red Hat 3.4.6-9)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There
is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE


2. repo init 和 Sync 操作
- 首先下載Android for x86的完整源代碼。Eee pc 的 dev tree 在 “git://android.git.kernel.org/platform/vendor/asus/eee_701.git”.

Fedora9$> cd ~
Fedora9$> mkdir bin_x86 && cd bin_x86
Fedora9$> mkdir mydroid && cd mydroid
Fedora9$> repo init -u git://android.git.kernel.org/platform/manifest.git
-b cupcake
Fedora9$> repo sync
Fedora9$> vi ./.repo/local_manifest.xml





Fedora9$> repo sync
… A new repo command ( 1.8) is available.
… You should upgrade soon:

cp /home/invain/bin_x86/mydroid/.repo/repo/repo /home/invain/bin/
repo

Initializing project platform/vendor/asus/eee_701 …
remote: Counting objects: 33, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 33 (delta 2), reused 33 (delta 2)
Unpacking objects: 100% (33/33), done.
From git://android.git.kernel.org/platform/vendor/asus/eee_701
* [new branch] cupcake -> korg/cupcake
* [new branch] master -> korg/master

3. 構建 x86 android

Fedora9$> export PATH=$PATH:/usr/sbin:/sbin (to use /sbin/tune2fs
command of e2fsprogs pack )
Fedora9$> TARGET_ARCH=x86 TARGET_PRODUCT=eee_701 DISABLE_DEXPREOPT=true CC=gcc34 CXX=g++34 make -j2 installer_img

build/core/product_config.mk:207: WARNING: adding test OTA key
============================================
TARGET_PRODUCT=eee_701
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_ARCH=x86
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=
============================================
build/core/main.mk:178: implicitly installing apns-conf_sdk.xml
…………… Below Omission ……………….


* 在構建中可能遇到一些問題,解決辦法是

- 用低版本gcc 替換 gcc-4.3 version. Ubuntu 8.04LT用的是GCC 4.2, Ubuntu 8.10是GCC 4.3,所以推荐用8.04來做build

- 如果你正在使用 GCC 4.3, 請照下面修改源代碼中的相關頭文件:

Fedora9$> vi external/srec/tools/thirdparty/OpenFst/fst/lib/../../fst/
lib/vector-fst.h
Fedora9$> vi external/srec/tools/thirdparty/OpenFst/fst/lib/symbol-
table.cpp
Fedora9$> vi frameworks/base/tools/aidl/aidl.cpp –> #include
, #include

等等。

- Lim,GeunSik使用的是gcc 3.4

#> yum install compat-gcc*
#> rpm -qa grep compat-gcc
compat-gcc-34-3.4.6-9.i386
compat-gcc-34-c++-3.4.6-9.i386
compat-gcc-34-g77-3.4.6-9.i386

Fedora9$> vi

Fedora9$> ls -lh out/target/product/eee_701/

total 770624
drwxrwxr-x 9 invain invain 4096 2008-12-24 16:05 .
drwxrwxr-x 3 invain invain 4096 2008-12-24 15:34 ..
-rw-rw-r– 1 invain invain 2606080 2008-12-24 15:50 boot.img
-rw-rw-r– 1 invain invain 57 2008-12-24 16:03 clean_steps.mk
drwxrwxr-x 4 invain invain 4096 2008-12-24 15:54 data
drwxrwxr-x 2 invain invain 4096 2008-12-24 15:50 grub
drwxrwxr-x 4 invain invain 4096 2008-12-24 16:05 installer
-rw-rw-r– 1 invain invain 406862848 2008-12-24 16:06 installer.img
-rw-rw-r– 1 invain invain 1951340 2008-12-23 19:18 kernel
drwxrwxr-x 12 invain invain 4096 2008-12-24 16:05 obj
-rw-rw-r– 1 invain invain 607384 2008-12-24 15:50 ramdisk.img
drwxrwxr-x 9 invain invain 4096 2008-12-24 15:50 root
drwxrwxr-x 4 invain invain 4096 2008-12-24 15:50 symbols
drwxrwxr-x 12 invain invain 4096 2008-12-24 15:53 system
-rw-rw-r– 1 invain invain 372056064 2008-12-24 16:05 system.img
-rw-rw-r– 1 invain invain 5156864 2008-12-24 16:04 userdata.img

Fedora9$> file out/target/product/eee_701/installer.img
./out/target/product/eee_701/installer.img: x86 boot sector; GRand
Unified Bootloader, stage1 version 0×3; partition 1: ID=0×83, active,
starthead 0, startsector 2048, 8878 sectors; partition 2: ID=0×83,
starthead 0, startsector 10926, 783728 sectors

Fedora9$> file out/target/product/eee_701/installer.img
File: `./out/target/product/eee_701/installer.img’
Size: 406862848 Blocks: 793552 IO Block: 4096 일반 파일
Device: fd00h/64768d Inode: 5349917 Links: 1
Access: (0664/-rw-rw-r–) Uid: ( 778/ invain) Gid: ( 778/
invain)
Access: 2008-12-24 16:08:21.000000000 +0900
Modify: 2008-12-24 16:06:05.000000000 +0900
Change: 2008-12-24 16:06:05.000000000 +0900

Fedora9$> file out/target/product/eee_701/system.img
./out/target/product/eee_701/system.img: Linux rev 0.0 ext2 filesystem
data

Fedora9$> file out/target/product/eee_701/userdata.img
./out/target/product/eee_701/userdata.img: Linux rev 0.0 ext2
filesystem data

Fedora9$> pushd out/target/product/eee_701/

Fedora9$> sudo mount -o loop boot.img /mnt

Fedora9#> popd
total 2519
-rw-rw-r– 1 invain invain 77 2008-12-24 15:50 cmdline
-rw-rw-r– 1 invain invain 1951340 2008-12-24 15:50 kernel
-rw-rw-r– 1 invain invain 607384 2008-12-24 15:50 ramdisk

Fedora9$> cat /mnt/test/cmndline
console=tty0 console=ttyS1,115200n8 console=tty0
androidboot.hardware=eee_701

Fedora9$> cp /mnt/test/ramdisk /tmp/ramdisk.gz
Fedora9$> pushd /tmp
Fedora9$> gunzip ramdisk.gz
Fedora9$> cpio -iv < ramdisk

Fedora9$> popd
init.goldfish.rc
init
data
init.eee_701.rc
proc
sbin
sbin/adbd
system
init.rc
default.prop
lib
lib/modules
lib/modules/atl2.ko
lib/modules/drm.ko
lib/modules/fbcon.ko
lib/modules/cfbimgblt.ko
lib/modules/i915.ko
lib/modules/cfbcopyarea.ko
lib/modules/bitblit.ko
lib/modules/softcursor.ko
lib/modules/font.ko
lib/modules/cfbfillrect.ko
dev
sys
2958 blocks

Fedora9$> file /tmp/init
/tmp/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
statically linked, not stripped


4. 制作USB Pen Disk安裝包

- 在BIOS中把第一啟動設備設置成USB,然後

Fedora9$> dd if=out/target/product/eee_701/installer.img of=/dev/your_usb_disk(例如/dev/sda1)

好了,接下來可以用你的android USB Pen Disk來嘗試啟動了。Enjoy it。

最後友情提示一句,我還沒有試這種方法,不過反正也不會破壞什麼,有興趣的朋友可以試一下。

資料來源:
http://www.forwind.cn/2008/12/24/android-on-x8/
Howto build Android full source for X86 Architecture like EeePC(ASUS)

2008年11月7日 星期五

Simple Guide for Porting Android Kernel[轉貼]

作者:劉旭暉colorant@163.com轉載請註明出處
http://blog.csdn.net/colorant/

移植Android的kernel到實際的硬件平台上,很多人很早就做過這件事了,不過相關的文檔和經驗總結不多,我就寫一個吧,也為了自己記錄一下大致的流程,以後好繼續。

1. Android內核Porting相關背景知識

1.1 運行平台
Google的Android平台到今天為止(2008-2-27),應用部分還是以二進制的Binary的形式發布的,其编譯的目標平台是ARM926EJ-S的CPU屬於ARMV5T的版本,所以ARMV4架購的CPU平台無法使用其二進制代碼。關於這點,可以参考下面這篇文章,Benno在此做了詳細的理論分析和代碼測試:http://benno.id.au/blog/2007/11/21/android-neo1973 . 所以目前只有基於ArmV5或以上的架構的平台可以實際運行Android。

1.2 軟件環境

SDK下載:

KERNEL,模擬環境等SRC包下載: http://code.google.com/p/android/downloads/list

1.2.1 Kernel

到M5-r14 release為止,Android的Kernel是基於Linux2.6.23的內核開發的,主要添加了一個名為Goldfish的虛擬CPU以及Android所需相關特定驅動代碼。你需要一個支持EABI的內核作為你內核Porting的起點(最低版本?不知道,只要EABI OK,應該沒有本質區別,但是,Android的很多驅動依賴於2.6.23的內核API,版本越低的內核,移植修改內核相關代碼的工作量越大)

1.2.2 Toolchain

SDK中的內核使用的是4.2.1版本的GCC,基本上,你需要的是一個支持EABI的工具鏈,比如你可以使用Codesourcery的最新工具鏈: http://www.codesourcery.com/

1.2.3 其他工具

Android的Emulator是一個很好的仿真工具,其底層是基於QEMU來實現的,可以使用SDK中的adb工具登陸Emulator的控制台,和控制台交換文件等,用於獲取你所需的信息。

1.3 相關論壇資源

http://benno.id.au/blog/

http://groups.google.com/group/android-internals

http://groups.google.com/group/android-developers

2. Porting 基本思路

2.1 所需資源

2.1.1 硬件

首先,當然是需要一個可以用來向上porting的硬件開發板了,對硬件的需求除了上面說的,需要ArmV5+兼容的CPU以外,最低要求基本需要64M+的內存,64M-128M+的FLASH(取決於你加載文件系統的方式,如果可以透過網絡使用NFS-ROOT或者MMC卡等來存放文件系統的話,這個應該就無所謂了)

2.1.2 軟件

除了上述kernel和tools chain,為了方便調試,最好有靜態編譯的Busybox和Strace等工具。 也可以從Benno的blog上下載到他編譯好的版本。也可以從Benno的blog上下載到他編譯好的版本。

2.2 基本流程

下載Android內核代碼

(1).下載官方2.6.23内核
(2).製作Android和2.6.23内核的diff文件
(3).去除diff文件中和Goldfish和QEMU相關的代碼,如果你的系統已經支持YAFFS2,還可以去除這部分代碼去除diff文件中和Goldfish和QEMU相關的代碼,然後將diff文件Patch到你自己的内核上,如果需要,修改内核相關文件代碼使得patch能夠順利完成。將diff文件Patch到你自己的內核上,如果需要,修改內核相關文件代碼使得patch能夠順利完成。 (這部分大概是主要的工作量,如果你的内核版本差得比較遠的話)
(4).如果必要,修改你的内核代碼中Framebuffer的驅動,使其Virtual_yres 等於兩倍的Yres,並實際分配兩倍分辨率大小的framebuffer内存。

配置內核,確保下列內容得到配置:
CONFIG_ARM_THUMB=y
CONFIG_AEABI=y
CONFIG_BINDER=y
CONFIG_ANDROID_LOG=y
CONFIG_ANDROID_POWER=y
CONFIG_ANDROID_POWER_STAT=y

*從SDK中獲取Android的文件系統,基本上你只需要System etc sbin init這幾個目錄/文件就可以了,其它自建,其中data目錄是有內容的,但是這個目錄的內容可以由Android在啟動時動態的創建出來。
*可以使用adb工具在EMULATOR先tar包裝,再拷貝出來。M3的release也可以從benno那裡直接拿到他抓出來的文件系統
*確保你的dev目錄下有足夠系統啟動的設備節點,如console等,其它的節點Android在啟動過程中會自動創建出來。
*使用NFSROOT或者chroot等手段Android的文件系统。

啟動流程的大致外在表現分階段依次是:

Ø LCD上出現Android幾個字符
Ø LCD短時間的Blank
Ø LCD上出現一個左右滾動的紅色滾動條 (如果有問題,基本上就死在這一步了)
Ø 進入主界面
目前為止我的狀態是:鍵盤可以工作,觸摸屏有響應但是未校準,位置不對,啟動最後階段以及之後啟動新的程序,出現Vmalloc分配內存Failed問題,導致如Brower等應用程序不能完全啟動。 其它網絡等東東還沒開始看呢。

3. 一些TIPS

*Android會對文件使用memory mapped的方式進行操作,JFFS2不支持這種操作,所以要使用別的文件系統。 當然也有繞過去的辦法,自己搜一下吧。
*為了方便測試,可以修改/etc/init.rc,註釋掉runtime,dbus-daemon,Xzygote等相關內容,在init啟動以後再手工啟動這些進程:

/system/bin/app_process -Xzygote /system/bin –zygote &
/system/bin/dbus-daemon –system –nofork & /system/bin/dbus-daemon –system –nofork &
sleep 1; sleep 1;
/system/bin/runtime & /system/bin/runtime &

*Android的Init位於根目錄下,所以如果你需要直接啟動Init,可以在內核參數命令行中用init=/init來指定,或者chroot目錄/init來指定。 當然,啟動/bin/sh以後,再手動啟動/init也是可以的。
*/dev/binder /dev/alarm /dev/log/*等文件是最重要的幾個設備節點,由於這幾個設備節點號的主次設備號是動態分配的,所以,最好確認你的文件系統中的這幾個設備節點的主次設備號是否正確。 如果不知道如何確認,直接删除掉再重啟動。
*如果flash速度太慢或者nfs網絡連接太差,可以將data tmp這兩個目錄mount到內存裡,前提是你的內存足夠大。
*如果啟動過程中,紅色滾動條速度太快(和emulator裡的表現比較),runtime或者system_server進程CPU佔用率接近100%,那麼你可以修改一下你的framebuffer代碼中pan_display相關的函數的代碼,保證其調用返回時得到足夠的幀同步延遲時間。 據Google的swetland給我的說法是:This is usually indicative of lack of vsync/pageflip in the fb driver.The surfaceflinger believes it will be limited by the vsync rate and the startup animation depends on that.
*目前的Android的內核代碼有M3-r20和M5-r14兩個版本,這兩個版本對binder和power兩個驅動做了較大的修改,上層的文件系統和內核必須配套使用。 (另,我的板子上,M5版本可以跑起来,M3的版本會出現段錯誤,沒跑起來:(如果一個版本實在跑不起來,不妨試試別的版本)
*使用strace去跟踪問題!

There are some reference sites for research listed below:
http://wiki.droiddocs.net/Compilation_of_Android_kernel
http://benno.id.au/blog/
http://code.google.com/p/androidbmi/
http://www.anddev.org/
android內核編譯方法: http://blog.chinaunix.net/u/26691/showart_468007.html

http://code.google.com/p/android/downloads/list 下載emulator以及kernel. 下載而來的SDK可以檢視其rootfs,再對照 http://blog.chinaunix.net/u/26691/showart_468007.html or http://wiki.droiddocs.net/Compilation_of_Android_kernel 來編譯出自己的 kernel 給 emulator來掛載. kernel config file在 陈罡的blog亦可下載取得. 在上一篇 adnroid news 裡面有一些研究出來的心得與 URL 可以供參考學習.

想知道Android模擬器裏的Kernel config設定檔嗎?
命令:adb pull /proc/config.gz .
上面那行指令可以把Kernel config取出來看唷!

轉載來源:
http://rider51.wordpress.com/2008/05/13/simple-guide-for-porting-android-kernel/

Android模擬器adb命令介紹

在SDK的Tools文件夾下包含着Android模擬器操作的重要命令adb,adb的全稱為(Android Debug Bridge就是調試橋的作用。通過adb我們可以在Eclipse中方面通過DDMS來調試Android程序,說白了就是debug工具。

adb的工作方式比較特殊採用監聽Socket TCP 5554等端口的方式讓IDE和Qemu通訊,默認情況下adb會daemon相關的網絡端口,所以當我們運行Eclipse時adb進程就會自動運行。

1.通過adb可以輕鬆的執行Linux Shell命令,進入設備或模擬器的shell:adb shell就可以進入模擬器的shell環境中。也可以執行各種Linux的命令,其命令格式為:adb shell command
範例:
adb shell dir 就是列舉目錄,在Linux中根目錄為/而不是Windows上的C磁碟、D磁碟
adb shell dmesg 會列印出Linux的debug訊息。
2.安裝apk程序到模擬器則執行adb install android123.apk,這樣名為android123的安裝包就會安裝到Android模擬器中,前提是android123.apk文件需要放到SDK\Tools目錄下。
3.向emulator傳送文件,使用adb push android123.txt /tmp/android123.txt命令可以把SDK\Tools下的android123.txt文件傳輸到模擬器的/tmp/文件夾中,需要注意的是/tmp/文件夾中內容會在Android模擬器新啟動時清空。除了說明了使用ADT插件中DDMS外,如圖
4.從Android模擬器中回傳文件到電腦
通過adb pull /tmp/android123.txt android123.txt命令就會把模擬器的tmp文件夾下android123.txt文件回傳到電腦SDK\Tools目錄下。

繼續android adb命令相關介紹,除了可以方便的安裝apk文件、pc和Android模擬器互傳資料外還有Android Debug Bridge一些輔助的功能。
1.如果在Eclipse中發現有* daemon not running. starting it now *的提示可以結束adb
adb kill-server

2.顯示android模擬器狀態
adb devices 端口號等信息,執行後會顯示TCP端口號
adb get-product 獲取設備型號
adb get-serialno 獲取序列號

3.等待正在運行的設備
adb wait-for-device

4.端口轉發
adb forward adb forward tcp:5555 tcp:1234 實現將默認的TCP 5555端口轉發到1234端口上

5.查看bug報告
adb bugreport

Android - How to mount the SDCard image file to Android Emulator

(1)首先必須產生SDCard的image file
mksdcard: create a blank FAT32 image to be used with the Android emulator
usage: mksdcard [-l label]
if is a simple integer, it specifies a size in bytes
if is an integer followed by 'K', it specifies a size in KiB
if is an integer followed by 'M', it specifies a size in MiB

ex:mksdcard 1024M sdcard.iso

(2)讓SDCard連到Android Emulator
a:./emulator -sdcard ~/.android/SDK-1.0/sdcard.iso
b:用Eclipse中設定程式的Open Run Dialog裏,Target頁籤的Aditional Emulator Command Line Option中加入啟動參數 -sdcard scard.iso

(3)透過adb傳收檔案到emulator
adb push
adb pull
ex:
adb push ~/mp3/audio.mp3 /sdcard/audio.mp3

linux底下也可以使用,來管理
mount -o loop sdcard.img android_sdcard

(4)進入emulator的shell
adb shell


資料來源:
http://www.android123.com.cn/moniqi/54.html
http://www.android123.com.cn/moniqi/55.html
http://blackdidi.wordpress.com/2008/10/10/android-how-to-mount-the-sdcard-image-file-to-android-emulator/
http://www.android123.com.cn/moniqi/48.html

官方ADB文件:
http://code.google.com/android/reference/adb.html

2008年9月26日 星期五

Android 1.0 SDK Released

更新速度真快@@
Android 1.0 SDK已經在2008/09/24釋放出來可以下載囉!
有興趣的人快去載來玩看看吧!

http://android-developers.blogspot.com/2008/09/announcing-android-10-sdk-release-1.html

0.9->1.0改變了些什麼呢?
http://code.google.com/android/migrating/0.9-1.0/changes-overview.html

  1. Content Provider

  2. Settings.System加入了許多新的Wi-Fi設定,用來提供儲存Wi-Fi的狀態。

  3. Device Hardware

  4. Camera增加了新的介面,名為Camera.ShutterCallback,用來在拍照後快門關閉後的事件回呼函式。
    SensorManager增加了一些新的fields。

  5. Maps

  6. ItemizedOverlay增加新的方法(methods)到overlays。
    MyLocationOverlay類別增加一個新的方法去偵測是否有指南針被顯示在MapView以及接收sensor位置改變時的事件。

  7. Media

  8. 在AudioManager裏加入了新的載入/卸載音效的方法。
    MediaMetadataRetriver類別在此版尚不支援。
    android.media.MediaPlayer.getFrameAt()在此版本也不支援。

  9. NetWork

  10. android.net.wifi新增了一些類別用來保持wi-fi無線喚醒及識別配對加密的WPA功能,這也改變了其它相關類別的fields及methods。
    org.apache.http.impl已被加入到這個平台

  11. Package manager
  12. 刪除使用者資料及快取(cache)的方法已經從PackageManager中移除。

  13. Text input
  14. TextKeyListener增加了release()的方法。

  15. Test

  16. 在android.test裏增加了一些新的類別及介面,如建置包含測試裝置的測試環境,測試單元及測試包。
    新增junit.runner套件。
    新增android.test.mock套件含工具類別,用來提供stub或mock來進行Android框架區塊單元的各種測試。
    新增android.test.suitebuilder套件含工具類別,用來提供test runner classes。

  17. Views

  18. 新增數個XML屬性給View物件。
    新增支援音效功能。
    你已可以監聽sensors(感知器)的改變狀態。
    WebView加入新的透明物件用來給移動的WebView跨越process的範圍。
    WebView加入新方法給managing scrollbar overlays.

  19. XML

  20. org.xmlpull.v1在這平台已可以使用

  21. Widgets

  22. verifyDrawable(Drawable)這個方法的屬性已從公開(public)改變成保護(protected).還有一些小widget有做一些變動。



1.0 Source Code下載網址
http://code.google.com/p/android/downloads/list
主要項目如下四個:
Linux 2.6.25 for Android 1.0 SDK,Release 1
Source for WebKit as included in Android 1.0 SDK, Release 1
Emulator for Android 1.0 SDK, Release 1
Android Development Tools: Plugins 0.8.0 for Eclipse 3.3/3.4, for Android SDK 1.0_r1(source only)

2008年9月17日 星期三

Anatomy of an Android Application

Anatomy of an Android Application - 剖析Android應用程式的四大區塊
原則上Android的應用程式會由下面四個區塊所組合而成

  1. Activity
  2. Broadcast Intent Receiver
  3. Service
  4. Content Provider
並不是所有的Android程式都需要有這四個部份才行,而是由上面那四項去挑選出來組合而成。
當你決定要在你的程式裏放這些元件時,你必需將它們明確的列在AndroidManifest.xml這個檔案裏。 所以在這個xml檔案,你必需宣告你要使用的元件並且明白的指出它們所擁有的能力及需求。 manifest檔案更詳細的內容請點我

底下列出一個簡單的manifest.xml範例,這個範例程式就只有放一個Activity元件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my_domain.app.helloactivity">
<application android:label="@string/app_name">
<activity android:name=".HelloActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>

(1)Activity:
Activities是四個元件當中最常被使用的。一個Activity在你的程式裏通常都會有一個畫面(single screen)可呈現出來。每個Activity都會實作出一個類別,而且這個類別是繼承自Activity這個基礎類別。你的這個類別要顯示使用者介面的話就必需再組合可視元件(Views)及回應事件功能。大部份的程式都會由多畫面(multiple screens)組成。比如:一個文字訊息傳送程式會有一個畫面是用來顯示可傳送訊息的聯絡人清單,一個畫面用來輸入要傳送的訊息內容,另一個畫面用來查閱舊的訊息內容,或是改變程式的設定畫面。每個畫面都會實作在一個Activity裏。換一個畫面就是去啟動另一個Activity起來,在某些情況下Activity可以回傳值給上一個Activity:比如說有個Activity可以讓使用者選一張照片,然後告知上一個Activity使用者選到了那張圖片。當一個新的畫面顯示出來後,上一個畫面就會進入pause的狀態,系統會將它放進歷史堆疊去。有了歷史堆疊,使用者可以很方便的返回上一個畫面。如果畫面不再需要使用的話,也可以選擇從堆疊中移除。Android會幫你管理這個歷史堆疊的資料,從家(Home)畫面開始執行的所有應用程式都會被管理到。
Intent and Intent Filters:
Android使用了一個很特別的類別叫Intent,用來從一個畫面跳到另一個畫面。Intent是用來描述一個程式想要作些什麼事情。在Intent的資料結構裏有兩個很重要的部份,一個是動作(action)及對資料產生反應(data to act upon)。action主要的內容有MAIN(程式的進入點),VIEW,PICK,EDIT等等。data則是用URI的形示來表示。比如:想要查看一個人的聯絡資料時,你需要建立一個Intent,它包含了VIEW的動作(action)及指向該人資料的URI描述句。

還有另一個相關的類別是IntentFilter。當Intent要求做某些事情時,IntentFilter被用來描述這個activity能夠做些什麼事情。比如一個activity要能夠顯示個人連絡資料,你就必需要在IntentFilter說明你要如何處理個人連絡資料並用ACTION_VIEW呈現出來。IntentFilter都會宣告在AndroidManifest.xml檔案裏。

而畫面的切來切去則是由resolving intent來實現的。當你想產生新的畫面時,現行的activity就使用startActivity(myIntent)。然後系統會根據所有已安裝的程式所定義的intent filter來看那個程式是最適合myIntent。當startActivity被呼叫時,resolving Intents的處理過程是伴隨而來的。
resolving intent提供我們兩個好處:
讓Activities可以很容易的利用Intent的方式去使用別的程式的功能。
讓Activities可以很容易的在任何情況下由新Activity所取代。

先來看看底下的範例:它的目的是希望在onClick事件引發時,使用Intent去打開http://stenlyho.blogspot.com/ 這個網頁,所以你會發現要做兩件事情,1.設定URI資料2.把uri及action傳給新的Intent,這裏的action是view,最後startActivity(intent)把intent執行起來。但按寫程式的常理來推斷,應該是把網址傳給瀏覽器啊,為什麼都沒看到執行瀏覽器的動作,只有Intent呢?這就是resolving Intent的功能囉!其實就像你在Windows裏點.doc檔時,自動會叫起word,點.txt檔時,自動會用記事本一樣的功能啦,resolving intent會根據uri內容是http開頭的,action又是VIEW時,就直接執行browser去把你設定的網址view出來給你看。

public void onClick(){
Uri uri = Uri.parse("http://stenlyho.blogspot.com/");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}

(2)Broadcast Intent Receiver :
當你想要寫一個程式來對外部的事件做些處理時,可以使用Broadcast Intent Receiver。比如:當電話響時,網路資料可以使用時,或半夜來臨時。Broadcast Intent Receiver它並不能拿來顯示UI畫面,它必需利用NotificationManager來通知使用者他們感興趣的事件發生了。
Broadcast Intent Receiver同樣的可以被宣告定義在AndroidManifest.xml檔案中,但你也可以用寫Context.registerReceiver()程式的方式來註冊你自己的Broadcast Intent Receiver。你自己的程式並不會因為BroadcastReceivers被呼叫而被它執行起來。而是當BroadcastReceiver被觸發時系統會依需求來執行相對應的程式。
程式可以利用Context.sendBroadcast()來發出他們自己的intent broadcast給其它的程式。

(3)Service
Service就是一段程式,它並沒有UI呈現畫面,但它可以長期的存在系統內執行。舉個多媒體播放器的例子來說:一個媒體播放器可能會有一個以上的activities存在,允許使用者選歌及播放歌曲。但是你可能不能一直用activity來做播放的行為,因為使用者可能會希望可以持續的播放歌曲的同時,他要去看其它的畫面,比如一邊聽歌,一邊逛網頁。
在這種情況下你就必需使用Context.startService()來使程式在背景執行,以保持音樂的持續播放。系統將會一直讓音樂保持播放的狀態,一直到它結束為止。
當它進入背景狀態時,你可以利用Context.bindService()來跟Service進行連結。當你正確的連結後,你就可以透過這個Service開放出來的界面跟它進行溝通。以剛剛放音樂的例子來看,Service應該就會開放出讓你暫停播放,倒轉,快轉等功能囉!

(4)Content Provider
應用程式可以將它們的資料儲存起來到一個檔案,存到SQLite資料庫,或其它的機制儲存起來。當你希望你的程式資料可以被其它程式使用時,Content Provider就非常有用了,Content Provider實現了讓應用程式之間互相分享資料。更多的結節請看Accessing Content Providers

資料來源:
http://code.google.com/android/intro/anatomy.html

2008年9月16日 星期二

DroidDraw

什麼是DroidDraw?
User Interface (UI) designer/editor for programming the Android Cell Phone Platform

如果你已經使用eclipse去玩過了Android的一些程式後,應該會發現,要做UI時,超級的難用,一開始時,我還以為所有要用的元件都要自己手動寫程式寫在res/layout/main.xml裏面,後來才發現原來eclipse有支援,增加元件的功能。如下圖:
上面那個增加元件的功能,最少可以,讓你在需要Button時,不用自己手動打,幫你自動產生底下的程式碼。
<Button android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
但,還是超麻煩的,因為如果我想要去改變Button的顯示文字,或位置及大小,又要去翻文件,把元件屬性找出來,然後自己手動修改。(至少我找不到這種功能,如果有人知道麻煩告知一下,感謝!)

但如果用DroidDraw的話,非常的方便,它提供你,用托拉的方式把元件拉到畫面上去,還可以編輯元件的屬性,等你都排好,設定好後,再用"Generate"產生xml檔,你再把這個程式Copy到你自己的xml去,就完成囉!

DroidDraw網址

它提供2個版本,一個可以直接在網頁上編輯,另一個是提供standalone executable版本,讓你也可以在本機端使用^^

2008年9月12日 星期五

Google Developer Day 2008 Taiwan : Android: Dalvik VM Internals

Google Developer Day 2008 Taiwan : Android: Dalvik VM Internals
想要更了解Android: Dalvik Virtual Machine有什麼特異功能嗎?看這裏就對了^^

中文版:程本中介紹Android: Dalvik VM Internals

http://sites.google.com/site/developerdaytaiwan/google-developer-day-2008-taiwan/android-dalvik-vm-internals

Google文件:程本中介紹Android: Dalvik VM Internals
http://docs.google.com/Present?docid=dfqs8fqs_4379243wxzk

英文版:Dan Bornstein介紹Android: Dalvik VM Internals

http://sites.google.com/site/io/dalvik-vm-internals

2008年9月11日 星期四

Android Process Lifecycle(行程生命週期)

Process Lifecycle(行程生命週期)

除了Activity Lifecycle之外,Android還有一段Process Lifecycle的說明如下:

Android系統基本上都會盡量的維持應用程式的運作,但如果記憶體真的不夠用時,就會需要把舊的或不需要用的應用程式移除。 就如同之前的Activity生命週期所介紹,這個移除的決定是由應用程式所處的狀態來判斷。一般來說,一個應用程式有四個狀態,底下由最重要到不重要的順序列出這四個狀態。 當需要移除應用程式時系統將會自已做排序,然後從最不重要的開始移除。

  1. Foreground Activity(這個activity就是在螢幕最頂端,是目前跟使用者保持互動)所以它的優先權最高,原則上會是一個最後被移除的程式,除非,這個Activity所需要的記憶體大小已經超出系統所能給與的了。

  2. Visible Activity(這個activity是可以被使用者看見,但並不是最頂端的一個程式,比如說:最頂端的程式並不是全螢幕的,或者是有個對話盒跳出來時),所以它的權重也很高,非到必要的情況,也不會去移除這種activity。

  3. Background Activity(這個activity是無法被使用者看到的的情況,並且已處於pause的狀態)這種情況下的應用程式就沒上面兩種情況處於那麼重要的位置,所以當系統需要把更多的記憶體空間分配給foreground或visible process時,系統就可以考慮把background activity給安全的移除掉。如果說這個background activity就移除了,使用者又操作了返回這個已被移除的activity時,這個activity就會把savedInstanceState並執行onCreate(Bundle),savedInstanceState是來自於當activity被移除時所會執行的onSaveInstanceState(Bundle)所儲存起來的。

  4. Empty Process這個所謂的空行程指的是那些沒有跟Activity綁定在一起的行程,也沒有跟任何的應用程式元件(比如Service或BroadcastReceiver)綁定在一起,這些空行程一定是最最最快被系統優先考慮移除的,所以如果你真的必需要用到Service/BroadcastReceiver這些功能時,你一定要把他們給你的activity綁在一起,否則系統會認為它不重要而去移除它。
有時候有些Activity可能會需要執行較長時間的操作,而且希望這個操作可以是一個較特別的activity生命週期。比如說一個攝影機的應用程式,它允許使用者上傳相片到網站去,這個上傳的時間可能需要蠻長的,這種情況下這個應用程式應要可以讓使用者離開這個應用程式,但上傳程式還必需繼續運作,要實現這種功能,你的應用程式就必需啟動一個Service用它來負責上傳的功能。 在這種情況下呢,你可以把這個上傳功能的service看成是比non-visible activity再重要一點的地位。

資料來源:
http://code.google.com/android/reference/android/app/Activity.html

2008年9月10日 星期三

Android Architecture 2

一‧Android的來源:
Google 併購 Android 公司後所推出的手機平台,採用 Linux 為作業系統。所以系統程式包含了 C 語言的標準函式庫,但應用程式主要以Java語言在Dalvik VM虛擬機器執行,應用程式開發環境以Eclipse為主,加上 Android Development Tools (ADT) Plugin。

二‧Android的目的:
Android平台的主旨是提供一個應用程式架構(application framework),好讓各家OEM業者可不須從頭進行軟體開發,就能推出一系列的Android平台手機。

三‧Android的特色:
Application framework:提供可重覆使用及改寫的元件。
Dalvik virtual machine:提供給行動裝置一個最佳化過的Java虛擬機器。
Integrated browser:基於一個WebKit引擎開放源碼的瀏灠器 ,像Mac上的Safari也是從WebKit衍生出來的。
Optimized graphics:最佳化過的繪圖函式庫,包含了SGL的2D繪圖函式庫及基於OpenGL ES 1.0規範的3D繪圖函式庫。
SQLite:一個結構化的資料庫系統 。
Media support:多媒體影音格式支援包含了MPEG4,H.264,MP3,AAC,AMR,JPG,PNG,GIF 。
GSM:GSM手機的通話能力其實必須在硬體電路層次實現,軟體層次無法實現,只是Android平台要求必須要有GSM通話能力,此項功效特點與其說是特點,不如說是訂立出最低的硬體要求規範。
Bluetooth,EDGE,3G,and WiFi,Camera,GPS,compass,and accelerometer:同GSM它必需由實際硬體決定是否支援 。
Rich development environment:包含了裝置模擬器,除錯工具,記憶體及效能評估分析工具及讓Eclipse IDE支援Android專案的外掛程式。

四‧Android的系統架構圖如下:

上圖呈現出整個系統架構分成(1)Applications,(2)Application Framework,(3)Libraries,(4)Android Runtime,(5)Linux Kernel五大架構
Android本身是一套軟體堆疊(Software Stack),或稱為「軟體疊層架構」,疊層主要分成三層:作業系統、中介軟體(Middleware,大陸方面稱為:中間件)、應用程式。想開發可在Android平台執行的應用程式,必須用Java程式語言撰寫才行。
中介軟體,凡是介於作業系統與應用程式間的,多概稱為中介軟體,Android的中介軟體可再細分出兩層,底層為函式庫(Library)及虛擬機器(Virtual Machine;VM),上層為應用程式框架(Application Framework)。 上面的架構圖裏全部的藍色框框全部都是用Java語言撰寫的綠色框框由C/C++組成紅色的Kernel層當然就是C囉

底下分別簡介一下各層的功用

應用程式層(Applications)
Android出貨時整套的應用程式將會包含了有電子郵件程式,短訊程式,日曆,地圖,瀏覽器,通訊程式...等等。所有的應用程式皆必需以Java的程式語言撰寫。

應用程式框架層(Application Framework)
程式設計師在寫應用程式時可以完整的存取使用統一的應用程式標準介面,這個應用程式框架的架構是可以很容易的去重覆使用各個原件, 所有的應用程式都可以提供出它自己本身的特殊功能,所有的應用程式也可以較容易的去使用其它程式的特殊功能。這樣子的統一機制,有助於開發者去改寫自己新的軟體原件。

基本上所有的應用程式是由services及systems所組成,包含有:
(1)Views System:用來建構一個應用程式的基本原件,包含了有lists,grids,text boxes,buttons,甚至是一個嵌入式的瀏覽器。這裏有Android整理好的view外觀圖
(2)Content Providers(內容提供者):它可以用來讓程式跟程式之間互相存取/分享資料。例如某一個應用程式可以去存取通訊錄應用程式內的聯絡人資料。或者呼用Resource Manager可存取的非程式碼資源,例如:當地性設定(該地貨幣、語言、時間格式)、圖像...等。
(3)Resource Manager(資源管理員):提供各種資源讓程式去使用,比如:區域性的字串,圖片,排版檔(layout files)。
(4)Notification Manager(訊息管理員):提供程式在狀態列(status bar)的地方顯示應用程式自有的警示(alert)訊息。 狀態列Android設定在手機的頂部,像短訊(short message),voice mail皆會出現在此。
(5)Activity Manager(活動管理員):管理所有的應用程式生命週期及一般性的回溯導航(navigation backstack )。
(6)Window Manager(視窗管理員):管理所有的視窗程式
(7)Location Manager:應該是用來做地圖服務的功能。
(8)Telephony Manager:用來管理所有的移動設備(電話)的功能,就是提供使用者撥打與接收電話的功能啦。
(9)Package Manager:Android系統內所有安裝的程式管理。
(10)XMMP Service
ineXtensible Messaging and Presence Protocol透過此服務得知手機的位置,在0.9 SDK已暫時移除此功能的樣子。

函式庫層(Libraries)
Android所有豐富多樣的元件皆是由C/C++函式庫所組成,但Android所有的應用程式皆必需經由API來使用這些功能。
主要的核心函式庫列表如下:

(1)System C library - 一個由BSD衍生出來的標準C系統函式庫(libc),目前這個已針對Linux嵌入式裝置進行過最佳化。
(2)Media Libraries - 基於PacketVideo's OpenCORE的多媒體函式庫;這個多媒體函式庫支援播放/錄製許多現在很流行的聲音及影像格式。比如:MPEG4,H.264,MP3,AAC,AMR,JPG,及PNG。
(3)Surface Manager - 這個部份讓開發者可以去存取顯示系統,以及實現無接縫的2D/3D多應用程式之間的整合。
(4)LibWebCore - 一個先進的網頁瀏覽器引擎。
(5)SGL - 2D繪圖引擎。
(6)3D Libraries - 一個基於OpenGL ES 1.0規範的3D繪圖引擎。它可以選擇要硬體的3D加速或高度最佳化的3D軟體程式去呈現結果。
(7)Free Type - 點陣圖及向量字形。
(8)SQLite - SQLite是一套開放原碼的關連式資料庫,提供給android上所有的應用程式使用。其特點在於輕量性(僅500KB左右的容量),適合手持式裝置運用,此外桌上型運算的應用程式也有使用,如OpenOffice.org 2.0版之後就有內建SQLite。
(9)SSL - Secure Socket Layer專門用於保護網頁通訊的協定。


執行層(Android Runtime)
Android 雖然用Java程式語言來開發、撰寫應用程式,但卻不使用一般大家目前在用的Java Runtime(J2ME)版本來執行Java程式,而是用Android自有的Android Runtime來執行。

Android Runtime包含下面兩個核心
(1)Core Libraries
核心函式庫裡頭已經包含了絕大多數Java程式語言所需要呼用的功效函式,接著每一個Android應用程式都會以自屬的process而且Android不是用一個Dalvik虛擬機器來同時執行多個Android應用程式,而是每個Android應用程式都用一個自屬的Dalvik虛擬機器來執行。
(2)Dalvik Virtual Machine
Dalvik虛擬機器是一種暫存器型態的虛擬機器。在撰寫開發時就已經設想用最少的記憶體資源來執行,以及前述的「同時可執行多個VM個體」。
Dalvik虛擬機器有許多地方是參考Java虛擬機器設計,Dalvik虛擬機器所執行的中介碼並非是Java虛擬機器所執行的Java Bytecode,同時也不直接執行Java的類別檔(Java Class File),而是依靠轉換工具將Java bytecode轉為Dalvik VM執行時特有的dex(Dalvik EXcutable)格式,稱為.dex。Dalvik VM相較於Java VM最大的不同在於Java VM為Stack-based,而Dalvik是register-based。 以技術層面考量Register-based VM的特性有個很大的好處,那就是對於現有主流的硬體架構,如此很容易與現有系統整合且最好化,而所需要的資源也相對較少。 甚至在硬體實作VM上會比較容易實現。 最重要的是Dalvik 並非是Java ME的實作,因此沒有Java ME授權相關的議題。
正常的Java比較慢不單單只是因為Virtual Machine的關係,Java的程式編釋成bytecode的也是關鍵因素之一,因Java VM採用了Stack Based的方式產生指令,所以所有的變數皆需push,pop到stack裏去,所以就會多出不少指令,而Delvik VM則改用register based的方式,變數皆存放於暫存器中,相較之下Delvik VM的指令就會少一點,速度也就會再加快一點。

作業系統層(Linux Kernel)
Android平台的作業系統用的是Linux,其核心版本為2.6版,Android所用的Linux核心,其包含的功效包括:安全(Security)、記憶體管理(Memory Management)、行程管理(Process Management)、網路堆疊(Network Stack,大陸方面稱為:網絡堆棧)、驅動程式模型(Driver Model)等,另外也在前述的軟體堆疊與硬體間建立起一個抽象層(Abstraction Layer)。

資料來源:
Google Android裡頭有什麼?
http://tech.digitimes.com.tw/ShowNews.aspx?zCatId=416&zNotesDocId=0000075729_A6M61Q6E423GAM68B95IS
What is Android?
http://code.google.com/android/what-is-android.html
Dalvik VM Internals
Android's Developers Blog

2008年9月9日 星期二

Android Activity生命週期簡介

何謂Activity:最簡單的就是你可以把Activity看成一個User Interface Program,原則上它會提供使用者一個互動式的介面功能,那一個activity只有一個UI嗎?當然不是囉,舉例來說:一個EMail程式,就可能包含三個activity(1)郵件列表的activity(2)顯示郵件內容的activity(3)寫新郵件或回覆郵件的activity。

所有的Activity在系統裏由Activity堆疊所管理,當一個新的Activity被執行後,它將會被放置到堆疊的最頂端,並且變成"running activity", 而先前的Activity原則上還是會存在於堆疊中,但它此時不會是在前景的情況,除非剛剛那個新的Activity離開。

一個Activity基本上有四個生命狀態

  • 當一個Activity在螢幕的最上層時(堆疊的最頂端),它就是屬於activerunning的狀態


  • 如果一個Activity失去焦點(focus)但還看得到它的畫面(比如:一個新的Activity畫面並不是全螢幕或者它是一個半透明的情況),那失去焦點的這個Activity則處在paused的狀態。像這個失去焦點的Activity它還是完全活著的喔,並沒有消失。(活著的意思是指,Activity自已本身所有的狀態及資料都還是存在的,也跟視窗管理程式window manager保持連繫著),像這種paused的activity,會在一種情況下消失,那就是當系統的記憶體不夠用之時,系統會自動判斷,把不重要的activity移除。


  • 如果一個Activity被其它的Activity完全的遮住時,這個被遮的Activity處於stop的狀態,它仍然保有全部的狀態及資料,但因為它已不再被使用者看見,所以它的畫面是被隱藏起來的(畫面不需要更新),當系統記憶體不足時,這種stop狀態的activity是最先被系統考慮拿來釋放記憶體的。


  • 當一個Activity處於pause或stop的狀態時,系統可以要求Activity結束(finish)或直接移除(kill)它。當它需要再度呈現在使用者面前時,它必需要能完整的重新啟動及回復先前的狀態。


  • 底下的流程圖呈現出一個Activity的狀態運行的情況,長方形的方塊代表著回呼函式(callback methods)你可以自已實作出在每個狀態你想要處理的事情,有顏色的部份就是實際Activity會處於的狀態。


    上圖裏有三個主要迴路
    (1)entire lifetime
    一個Activity的entire lifetime是由onCreate(Bundle)開始,一直到onDestroy()結束。一個Activity可以把所有的資源設定寫在onCreate裏,一直到onDestroy()時,再釋放出來。比如說,你需要一個執行緒在背景執行網路下載資料,這個thread就可以在onCreate()裏建立起來,一直到onDestroy()再把thread釋放不要用。
    (2)visible lifetime
    一個Activity的visible lifetime則是指在onStart()到onStop()之間,算是"可視生命時期",在這段時間內,使用者可以在螢幕上看見Activity,要注意這個"看見"算是抽象形容詞@@這個Activity不見得一定在前景直接跟使用者可直接互動。比如說:你可以在onStart()註冊一個BroadcastReceiver用來監控並改變你的UI,當使用者不想再看你所呈現的結果時,在onStop()移除註冊的BroadcastReceiver。onStart()跟onStop()可以在activity在visible及hidden兩個狀態切換時多次被呼叫執行。
    (3)foreground lifetime
    一個foreground lifetime則是指onResume()到onPause()之間,在這個時期的Activity是在所有的Activity的前面,並且直接跟使用者進行互動,所以這段時期指的就是圖裏的Activity is running囉。 一個Activity能很頻繁的在resume及pause這兩個狀態切換,比如:當一個裝置進行睡眠時,當一個Activity的結果被傳送,當一個新的intent被傳送時。所以在onResume()及onPause()裏實作的程式應盡量精簡。

    看到這裏先做個小結:onCreate()用來做程式的初使化動作,onDestory()通常都拿來把onCreate()時所要來的資料做釋放的動作,onPause()時把需要保存的資料在此時保存,onResume()把保存的資料拿回來使用。


    整個Activity的生命週期所用到的方法(methods)定義如下表,這些methods都可以依據你實際上的需求去繼承出來改寫它的行為。所有的Activity都會實作onCreate(Bundle)來實現他們的初使化設定;或許你也需要去實作出onPause()來保留一些資料;但請記得當你要使用這些methods時必需要做一件事情,那就是在你改寫的methods裏必需呼叫superclass相對應的methods.如:super.onCreate(Bundle)。

    public class Activity extends ApplicationContext {
    protected void onCreate(Bundle savedInstanceState);
    protected void onStart();
    protected void onRestart();
    protected void onResume();
    protected void onPause();
    protected void onStop();
    protected void onDestroy();
    }


    底下這段影片是在說明Activity Lifecycle的影片,內容有個lifecycle的demo,可以讓你對onCreate/onStart/onResume/onPause/onStop...更有感覺。



    lifecycle demo的程式碼: svn://svn.sleepydog/net/guestarea/android/LifeCycleDemo
    user=android_ro
    password=welcome

    更詳細的內容請參照
    http://code.google.com/android/reference/android/app/Activity.html

    http://sleepydroid.blogspot.com/
    http://blip.tv/file/958450/

    2008年8月15日 星期五

    Android Architecture


    舊版(M5-rc14)架構
    What is Android?
    Android的來源:
    Google 併購 Android 公司後所推出的手機平台,採用 Linux 為作業系統。所以系統程式包含了 C 語言的標準函式庫,但應用程式主要以Java語言在Dalvik VM虛擬機器執行,應用程式開發環境以Eclipse為主,加上 Android Development Tools (ADT) Plugin。

    Android的目的:
    Android平台的主旨是提供一個應用程式架構(application framework),好讓各家OEM業者可不須從頭進行軟體開發,就能推出一系列的Android平台手機。

    Android本身是一套軟體堆疊(Software Stack),或稱為「軟體疊層架構」,疊層主要分成三層:作業系統、中介軟體(Middleware,大陸方面稱為:中間件)、應用程式。想開發可在Android平台執行的應用程式,必須用Java程式語言撰寫才行。
    中介軟體,凡是介於作業系統與應用程式間的,多概稱為中介軟體,Android的中介軟體可再細分出兩層,底層為函式庫(Library)及虛擬機器(Virtual Machine;VM),上層為應用程式框架(Application Framework)。

    Android Presentation

    Android 雖然用Java程式語言來開發、撰寫應用程式,但卻不使用一般大家目前在用的Java Runtime(J2ME)版本來執行Java程式,而是用Android自有的Android Runtime來執行。
      Android Runtime包含下面兩個核心。
    1. Core Libraries

    2. 核心函式庫裡頭已經包含了絕大多數Java程式語言所需要呼用的功效函式,接著每一個Android應用程式都會以自屬的process而且Android不是用一個Dalvik虛擬機器來同時執行多個Android應用程式,而是每個Android應用程式都用一個自屬的Dalvik虛擬機器來執行。
    3. Dalvik Virtual Machine

      • Dalvik虛擬機器是一種暫存器型態的虛擬機器。在撰寫開發時就已經設想用最少的記憶體資源來執行,以及前述的「同時可執行多個VM個體」。

      • Dalvik虛擬機器有許多地方是參考Java虛擬機器設計,Dalvik虛擬機器所執行的中介碼並非是Java虛擬機器所執行的Java Bytecode,同時也不直接執行Java的類別檔(Java Class File),而是依靠轉換工具將Java bytecode轉為Dalvik VM執行時特有的dex(Dalvik EXcutable)格式,稱為.dex。Dalvik VM相較於Java VM最大的不同在於Java VM為Stack-based,而Dalvik是register-based。 以技術層面考量Register-based VM的特性有個很大的好處,那就是對於現有主流的硬體架構,如此很容易與現有系統整合且最好化,而所需要的資源也相對較少。 甚至在硬體實作VM上會比較容易實現。 最重要的是Dalvik 並非是Java ME的實作,因此沒有Java ME授權相關的議題。

    Android在應用程式框架中的軟體元件主要有10個,如Activity Manager(活動管理員)、Window Manager(視窗管理員)、Resource Manager(資源管理員)等,在此無法詳述每個元件的功效,因此以下挑數個重點元件來說明。

    舉例來說,Content Providers(內容管理員)負責應用程式與應用程式間的資料存取傳遞,例如某一個應用程式可以去存取通訊錄應用程式內的聯絡人資料。或者呼用Resource Manager可存取的非程式碼資源,例如:當地性設定(該地貨幣、語言、時間格式)、圖像...等。

    再者,應用程式若呼用Notification Manager(通知管理員),則可以在狀態列(Status Bar)的地方設計出應用程式自有的警示(Alert)訊息。至於Activity Manager則提供應用程式的生命週期管理。

    更多詳細內容請看:Google Android裡頭有什麼?

    Androidology - Part 1 of 3 - Architecture Overview
    Androidology - Part 2 of 3 - Application Lifecycle

    Androidology - Part 3 of 3 - APIs

    A first hand look at building an Android application

    Android Demo

      Android Linux Kernel:
       based on version 2.6.23 kernel
       ARCH_GOLDFISH configuration for ARM architecture
       Using EABI (Embedded ABI) Feature
       YAFFS2 File System
       OpenBinder IPC
      Kernel Patches
       ARM Architecture : ARMv5TE or later
      • For EABI Support
      • ex) ARM926EJ-S, XScale(PXA900), ARM1176JZ(F)-S
       YAFFS2 File System :
      • For NAND memory support
       OpenBinder
      • For IPCs among the equal applications on mobile devices
      • ex) Intent Broadcasting

    參考資料:
    Android 手機開發平台
    研發觀點 開放手機革命:市場觀察與Android SDK
    大廠在前 Android何時出頭?
    真實平台移植過程
    源始程式下載
    Android on OMAP Kernel Patch
    HTC TyTN II Vogue Linux
    Android OS 現身 HTC TyTN II
    Android - An Open Handset Alliance Project Documentation
    Google Android裡頭有什麼?

    這個網頁給大家參考一下吧!Google手機程式設計寫得蠻不錯的唷!
    http://ccc.kmit.edu.tw/mybook/GooglePhoneProgramming/GooglePhoneProgramming.htm
    [2008] 陳鍾誠, Google手機程式設計 (未出版草稿) -- 下載
    http://ccc.kmit.edu.tw/mybook/GooglePhoneProgramming/GooglePhoneProgramming.doc

    一個小故事讓我們明白資金流通的意義

    “又是炎熱小鎮慵懶的一天。太陽高掛,街道無人,每個人都債台高築,靠信用度日。這時,從外地來了一位有錢的旅客,他進了一家旅館,拿出一張1000 元鈔票放在櫃檯,說想先看看房間,挑一間合適的過夜,就在此人上樓的時候---- 店主抓了這張1000 元鈔,跑到隔壁屠戶那裡支付了他欠的肉錢...