青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

life02

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks

#

       startActivityForResult與startActivity的不同之處在于: 1, startActivity( ) 僅僅是跳轉到目標頁面,若是想跳回當前頁面,則必須再使用一次startActivity( )。
 2, startActivityForResult( )可以一次性完成這項任務,當程序執行到這段代碼的時候,頁面會跳轉到下一個Activity, 而當這個Activity被關閉以后(this.finish()),程序
會自動跳轉會第一個Activity,并調用前一個Activity的onActivityResult( )方法。

 

http://www.cnblogs.com/linjiqin/archive/2011/06/03/2071956.html

 

android中使用startActivityForResult回傳數據(轉)

假設:我這里有兩個Activity:A和B,從A中向B中傳遞數據的時候采用的是Bundle封裝數據,然后從A中跳轉到B中,當B有需求將數據 封裝起來回傳給A并跳轉回A。那么A中接收數據時還要先判斷Bundle是否為空,因為第一次訪問A的時候(即B還沒有回傳的時候),Bundle是為空 的,這樣顯然是比較麻煩的,不明智的做法。

還好startActivityForResult來做跳轉給了我們更好的解決辦法。

1.跳轉的時候不是采用startActivity(intent) 這個方法,而是startActivityForResult(intent, 0)。

1 Intent intent=new Intent();
2 intent.setClass(A.this, B.class);
3 Bundle bundle=new Bundle();
4 String str1="aaaaaa";
5 bundle.putString("str1", str1);
6 intent.putExtras(bundle);
7 startActivityForResult(intent, 0);//這里采用startActivityForResult來做跳轉,此處的0為一個依據,可以寫其他的值,但一定要>=0

2.重寫onActivityResult方法,用來接收B回傳的數據。

1 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
2 switch (resultCode) { //resultCode為回傳的標記,我在B中回傳的是RESULT_OK
3   case RESULT_OK:
4 Bundle b=data.getExtras(); //data為B中回傳的Intent
5   String str=b.getString("str1");//str即為回傳的值
6 break;
7 default:
8 break;
9 }
10 }

3.在B中回傳數據時采用setResult方法,并且之后要調用finish方法。

setResult(RESULT_OK, intent); //intent為A傳來的帶有Bundle的intent,當然也可以自己定義新的Bundle
finish();//此處一定要調用finish()方法

這樣當B中調用finish方法的時候,跳轉到A時會自動調用onActivityResult方法,來獲取B中回傳的intent了。 
詳細的代碼不貼了,那純屬浪費時間,網上關于startActivityForResult的全是些轉帖的,都是代碼,看著真心煩。

posted @ 2011-12-06 21:48 life02 閱讀(426) | 評論 (0)編輯 收藏

     摘要:   閱讀全文
posted @ 2011-12-06 16:38 life02 閱讀(897) | 評論 (0)編輯 收藏

     摘要:   閱讀全文
posted @ 2011-12-06 11:30 life02 閱讀(2986) | 評論 (0)編輯 收藏

google上面下載Android的SDK或者OPhonesdn 下載 Ophonesdk,解壓出來后在SDK的根目錄下有一個tools文件夾,雙擊emulator.exe,直接啟動模擬器

1.模擬器外觀的定制:
480x320, landscape: emulator -skin HVGA-L
320x480, portrait : emulator -skin HVGA-P (default)
320x240, landscape: emulator -skin QVGA-L
240x320, portrait : emulator -skin QVGA-P
2.為模擬器加上SD卡:
emulator -sdcard D:\sdcard.img
下面我們再來說說如何創建"sdcard.img"文件:
“tools”目錄下還有另外一個很好用的工具“mksdcard.exe”,一看名字就知道——make sdcard。對,就用它來創建一個“SD卡”。
命令為:
mksdcard 512M D:\sdcard.img
OK,這樣一個容量為512M的SD卡就創建完畢了。
使用SDCard:
創建: mksdcard <512M>
(bytes(default),K,M)
連接到模擬器: emulator -sdcard <目錄/sdcard.img>
傳文件到SDCard: adb push <目錄/myaudio.mp3> 3、模擬器的通信
GPhone的模擬器有個特有的號碼:15555218135,這個就類似我們實體手機的SIM卡號碼啦。

 



正確啟動模擬器[SDK 1.5]
安裝好JDK后,運行框中輸入cmd,回車后就會彈出個黑框。(接下來的大部分操作都是在這黑框下進行的)在黑框中輸入cd /d D:/ android-sdk-windows-1.5/tools/
(這個路徑是我存放模擬器的路徑、大家要根據自己所存放的路徑輸入相應的路徑)
輸入完正確的命令后就會自動彈出你所存放模擬器的路徑(如上圖)
接著在這命令后面輸入android并回車,這時黑框中會彈出一堆的命令,看不懂也沒關系!我們滾動黑框見到最后一個命令的位置就好
在最后的這個命名后面輸入android create avd -t 2 -n g1,并回車?!鹤⒁猓哼@個命令中最后一個g1是可以任意取名的,你可以寫g2、android、gphone???之類的』
【大家在操作這步的時候,要切記android與create與avd與-t與2與-n與g1之間都是有空格的 】
這時又會彈出個新的命令出來!我們只要輸入no并回車就可以了
結束以上的操作之后,打開存放SDK模擬器的文件,找到模擬器的程序右鍵點擊發送——桌面快捷方式
回到桌面后,發現雙擊那個小綠人發現還是打不開模擬器!先不要著急、右鍵點擊屬性!在快捷方式-目標的路徑后面加上 -avd g1
再次注意:這個-前面是要空格一下的,avd后面跟著的g1則要跟你在上一步黑框中所輸入的名字是一致的
posted @ 2011-12-06 11:13 life02 閱讀(299) | 評論 (0)編輯 收藏

   啟動Android可以通過Eclipse的Avd與SDK Manager完成,另一種方法是通過命令行來完成模擬器的創建或啟動。方法如下:

1. android list target 

該命令顯示已安裝的android平臺,每個平臺有自己的id號。

 

2.android create avd -n skwwt -t 11

該命令創建一個新的模擬器,-n后面接創建模擬器的名字,-t后面接平臺的id,即(1)中顯示的id號。

 

3.emulator @skwwt 或者 emulator -avd skwwt

該命令啟動名字為skwwt的模擬器。


     下面是我轉的一些關于Android模擬器的使用方法

 

 

     1、Android模擬器介紹

  Android中提供了一個模擬器來模擬ARM核的移動設備。Android的模擬器是基于QEMU開發的,QEMU是一個有名的開源虛擬機項目(詳見http://bellard.org/qemu/),它可以提供一個虛擬的ARM移動設備。Android模擬器被命名為goldfish,用來模擬包括下面一些功能的ARM SoC:

  * ARM926ej-S CPU

  * Thumb support

  * MMC

  * RTC

  * Keyboard

  * USB Gadget

  * framebuffer

  * TTY driver

  * NAND FLASH

  Android模擬器所對應的源代碼主要在external/qemu目錄下。如果你想將Android移植到其他設備上,熟悉它目前所針對的模擬器環境可以提供一些參考。

  對于應用程序的開發者,模擬器提供了很多開發和測試時的便利。無論在Windows下還是Linux下,Android模擬器都可以順利運行,并且Google提供了Eclipse插件,可將模擬器集成到Eclipse的IDE環境。當然,你也可以從命令行啟動Android模擬器。

  這款模擬器功能非常齊全,電話本、通話等功能都可正常使用(當然你沒辦法真的從這里打電話)。甚至其內置的瀏覽器和Google Maps都可以聯網。用戶可以使用鍵盤輸入,鼠標點擊模擬器按鍵輸入,甚至還可以使用鼠標點擊、拖動屏幕進行操縱。

  當然模擬器畢竟是模擬器,和真實的機子還是存在差別的,

  android模擬器和真機的不同之處:

  * 不支持呼叫和接聽實際來電;但可以通過控制臺模擬電話呼叫(呼入和呼出)

  * 不支持USB連接

  * 不支持相機/視頻捕捉

  * 不支持音頻輸入(捕捉);但支持輸出(重放)

  * 不支持擴展耳機

  * 不能確定連接狀態

  * 不能確定電池電量水平和交流充電狀態

  * 不能確定SD卡的插入/彈出

  * 不支持藍牙

  2、創建和啟動Android模擬器

  要玩GPhone的模擬器,當然需要先去http://developer.android.com/sdk(如果打不開就用http://androidappdocs.appspot.com/sdk/index.html)上面下載Android 的SDK,解壓出來后在SDK的根目錄下有一個tools文件夾,里面就是模擬器和一些非常有用的工具。(SDK詳細的安裝過程請參照 http://blog.csdn.net/magicyu2/archive/2009/11/02/4755747.aspx)

  要正確的啟動模擬,你必須先要創建一個 AVD( Android Virtual Device 虛擬設備 )

,你可以利用AVD創建基于不同版本的模擬器,下面就介紹如何創建AVD:

 

  (1) 查看當前支持版本(在列出的版本中我們需要記住id值,這個值在第2步中使用):

  magicyu@magicyu-desktop:~$ android list target

  你可以看到幾個Available Android targets,比如:Name: Android 1.6,他們有各自的id號。

  (2) 創建AVD:

  magicyu@magicyu-desktop:~$ android create avd -n magicyu -t 2

  -n后面接需要創建avd的名字,-t后面接需要創建虛擬器的類型,2即為步驟(1)中得到的類型id號。

  (3) 查看是否創建成功(如果成功會顯示剛才我們創建的avd信息):

  magicyu@magicyu-desktop:~$ android list avd

  (4) 啟動模擬器:

  magicyu@magicyu-desktop:~$ emulator @magicyu 或者

  emulator -avd magicyu

  其中@和-avd后接的是你創建過的avd名字

  (5) 選擇啟動的皮膚

  magicyu@magicyu-desktop:~$ emulator -avd magicyu -skin QVGA

  skin后面接所要啟動皮膚的類型,所有的類型可以在/ platforms/android-1.*/skins目錄下找到,*為所指的版本。如在1.6版本的SDK下有HVGA,QVGA, WVGA800,WVGA854幾種。按Ctrl+F11,可以直接改變模擬器的橫縱擺放。

  當然AVD也可以在Eclipse中創建和啟動。關于Eclipse+ADT+SDK的安裝請參見http://blog.csdn.net/magicyu2/archive/2009/11/02/4755747.aspx。

  運行Eclipse,Window->Android SDK and AVD Manager,就能得到如下的界面,選擇新建即可新建一個AVD。

posted @ 2011-12-06 11:02 life02 閱讀(1793) | 評論 (0)編輯 收藏

在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模擬器新啟動時清空。
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

posted @ 2011-12-05 20:01 life02 閱讀(529) | 評論 (0)編輯 收藏

Android Emulator 備忘指令

發表於 一月 8, 2011 在 Android 分類. 10 則評論

  • Android 模擬器命令列啟動模式

在 android-sdk-windows-1.1\tools 執行 emulator 以執行模擬器
加上-skin參數,指定顯示模式為 HVGA-L,則可轉為橫向

emulator – skin HVGA-L (480*320
,水平顯示)
emulator – skin HVGA-L (320*480
,垂直顯示,模擬器預設模式)
emulator – skin HVGA-L (320*240
,水平顯示)
emulator – skin HVGA-L (240*320
,垂直顯示)

  • 使用 mksdcard 指令模擬 1GB 的記憶卡

mksdcard 1024M sacard.img

  • 模擬插入 SD 卡的模擬器

emulator – sdcard sdcard.img

  • 使用 adb+push 上載檔案到 SD 記憶卡

adb push 001.jpg /sdcard (複製檔案到 /sdcard 目錄下)
adb push pictures /sdcard (
複製 picture 照片目錄到 /sdcard 目錄下)
adb push mp3 /sdcard (
複製 mp3 音樂目錄到 /sdcard 目錄下)
adb shell (Android
模擬器啟動命令列模式)
#cd /sdcard (
進入 /sdcard 目錄)
#ls (
查看 SD 記憶卡中的檔案)

  • 使用 adb+pull 從 SD 記憶卡下載檔案

adb pull /sdcard/001.jpg . (下載 /sdcard 目錄下的檔案)
adb pull /sdcard/pictures . (
下載 sdcard 目錄下的 pictures 目錄)

  • 刪除 SD 卡裡面的檔案

adb shell
#ced /sdcard
#rm 001.jpg (
刪除 SD 記憶卡裡的檔案)
#rm -r * (
刪除 SD 記憶卡裡所有檔案與目錄)

  • Android模擬器影片播放方法

mksdcard 4096M video.img (製作一個影像檔的 SD 記憶卡)
adb push video.avi /sdcard (
從電腦複製影像檔到 SD 卡中)
emulator -sdcard video.img (
啟動模擬器並載入 SD 卡)
下載免費的影片播放軟體,ex: Meridian Video Player (iiivpa.apk)

http://sites.google.com/site/eternalsandbox/Home/meridian-video-player

adb install iiivpa.apk (安裝Meridian Video Player)
接下來就可以用裝上去的player播放.mp4、3gp與.wmv三種檔案格式

  • 安裝 APK 應用程式

adb install filename.apk (安裝filename.apk)
adb install -r filename.apk (
保留已設定資料,重新安裝filename.apk)
adb -s emulator-5554 install filename.apk (
指定安裝 APK 套件在 5554 的 Android 模擬器中)

  • 移除 APK 應用程式

adb uninstall package
adb uninstall -k package (
移除程式時,保留資料)
此package名稱不是安裝APK套裝時的檔名或顯示在模擬器中的應用程式名稱
可以先到/data/data或data/app目錄下,查詢想移除的package名稱
adb shell
ls /data/data
或 /data/app (查詢 Package 名稱)
exit
adb uninstall package (
移除查詢到的 Package)

  • ADB 系統除錯與連結工具

$adb devices (顯示目前有多少個模擬器正在執行)
$adb -s (
指定模擬器來操作)
adb -s emulator-5554 install email.apk
$adb install apkfile (
安裝 APK 應用程式套件)
adb install email.apk
$adb uninstall package (
移除 APK 應用程式套件)
adb uninstall com.android.email
$adb shell (
進入 Android 系統指令列模式)
$ls
$dmesg (
查看 Android Linux Kernel 運作訊息)
ls –
顯示檔案目錄
cd –
進入目錄
rm –
刪除檔案
mv –
移動檔案
mkdir –
產生目錄
rmdir –
刪除目錄 $adb push (複製檔案到 SD )
adb push mp3 /sdcard
$adb pull . (
從 Android 系統下載檔案)
adb pull /data/app/com.android.email
$adb logcat (
監控模擬器運作紀錄,以Ctrl + c 離開監控模式)
$adb bugreport (
產生 adb 除錯報告)
$adb get-state (
獲得 adb 伺服器運作狀態)
$adb start-server (
啟動 adb 伺服器)
$adb kill-server (
關掉 adb 伺服器)
$adb forward tcp:6100 tcp:7100 (
更改模擬器網路 TCP 通訊埠)
$adb shell ps -x (
顯示 Android 上所有正在執行的行程)
$adb version (
顯示 adb 版本)
$adb help (
顯示 adb 指令參數)

  • Emulator 命令列啟動參數

emulator -timezone Asia/Taipei (指定時區)
emulator -no-boo-anim (
省略開機小機器人動畫畫面)
emulator -scale auto (
調整模擬器視窗大小)
emulator – scale factor (factor: 0.1-3.0)
emulator -dpi-device 300 (
更改模擬器的解析度,default為 165dpi)
emulator -skin (
更改模擬器顯示模式)
emulator -help-keys (
顯示鍵盤快速鍵說明)
emulator -shell (
相當於adb shell 功能)
emulator -data data.img (
使 /data 目錄使用 data.img 的檔案空間)
emulator -sdcard sdcard.img (
使 /sdcard 目錄使用 sdcard.img 的檔案空間)
emulator -cache cache.img (
瀏覽器暫存檔儲存空間)
emulator -wipe-data (
使模擬器恢復到原廠設定)
emulator -help (
顯示 emulator 指令參數)

 


posted @ 2011-12-05 19:54 life02 閱讀(588) | 評論 (0)編輯 收藏

安裝APK文件到Android模擬器

Android手機使用的執行文件為APK格式,類似于Windows平臺的exe文件。在Android模擬器中安裝APK文件有多種方法,如果 你是開發人員,可以通過Eclipse+ADT,使用DDMS可以傳輸文件。大多數可以直接在Windows的cmd中操作就可以了。

一、首先在Android SDK的Tools文件夾中找到emulator.exe文件并運行,這時Android模擬器就啟動了,

二、 將android123.apk文件復制到Android SDK的Tools目錄中(點擊下載Android123.apk文件),使用cmd的cd命令定位到Android 模擬器目錄Tools中,執行adb install android123.apk命令,這時模擬器將會自動執行安裝。 

三、在Android模擬器中可以找到我們安裝好的文件-Android手機之家。

四、 用鼠標單擊這個文件就可以看到Android手機之家網站的演示程序。 

  寫在最后我們可以發現安裝Android軟件到模擬器很簡單,只需要執行adb install命令就可以了,當然其實我們做的是復制文件到Android模擬器的/data/app文件夾,并創建了一個快捷方式。

 

Android sdcard的使用

 

(下面是在linux運行的,而且是在sdcard的鏡像文件同一目錄下進行操作的)
這兩天在實現播放器列表實現,其中需要使用到Sdcard,在網上收集到了一些sdcard的使用,發現幾乎都是錯誤的,最后經過小組幾個人的探討,終于將sdcard使用成功了。下面就將使用sdcard的使用步驟總結下來:
我們在網上會發現,很多人都是這樣來操作sdcard的:
1、首先是生成sdcard鏡像文件sdcard.img或者是其他的名稱。命令為:mksdcard -l sdcard capacity directory
例如:mksdcard 1024M D:\sdcard.img

directory 指的是鏡像文件存放的目錄,capacity就是要創建的鏡像文件的容量。這里將鏡像文件放在當前目錄下。

2、之后,啟動模擬器:emulator -sdcard sdcard鏡像文件的目錄
例如:emulator -sdcard D:\sdcard.img

3、打開另外一個終端,輸入下面命令來將資源放入到sdcard里面
adb push source-file sdcard的鏡像文件目錄
這個時候會發現這是不能成功的,會得出Read Only System 這樣的錯誤失敗提示。
這里,來分析一下為什么會失敗。
在 創建sdcard鏡像文件的時候,生成的sdcard.img只是一個鏡像文件,而不是一個真正的目錄,所以如果要將資源文件放入到sdcard的鏡像文 件中,當然是錯誤的,而我們會發現,sdcard是Android中的存儲模擬設備,類似于計算機的硬盤一樣,這樣我們可以向其中放入資源文件,即可以將 命令adb push <目錄/audio.mp3> </sdcard/audio.mp3>的鏡像文件目錄
改為 adb push <目錄/audio.mp3> </sdcard.之后,我們進入adb shell中檢查是否將文件放入了sdcard中,使用命令adb shell,ls一下,找到sdcard,檢查一下sdcard中,這時,sdcard中已經擁有資源了,即我們的push命令運行成功。
以上就是sdcard存儲資源的使用。

 

adb命令的使用

adb(Android Debug Bridge)是Android 提供的一個通用的調試工具,借助這個工具,我們可以管理設備或手機 模擬器 的狀態 。還可以進行以下的操作:
1、快速更新設備或手機模擬器中的代碼,如應用或Android系統升級;
2、在設備上運行shell命令;
3、管理設備或手機模擬器上的預定端口;
4、在設備或手機模擬器上復制或粘貼文件;

以下為一些常用的操作:
1、安裝 應用到模擬器:
adb install
比較遺憾的是,Android并沒有提供一個卸載 應用的命令,只能自己手動刪除 :
adb shell
cd /data/app
rm app.apk
2、進入設備或模擬器的shell:
adb shell
通過上面的命令,就可以進入設備或模擬器的shell環境中,在這個Linux Shell中,你可以執行各種Linux 的命令,另外如果只想執行一條shell命令,可以采用以下的方式:
adb shell [command]
如:adb shell dmesg會打印出內核的調試信息。
3、發布端口:
可以設置任意的端口號,做為主機 向模擬器或設備的請求端口。如:
adb forward tcp:5555 tcp:8000
4、復制文件 :
可向一個設備或從一個設備中復制文件,
復制一個文件或目錄到設備或模擬器上:
adb push
如:adb push test.txt /tmp/test.txt
從設備或模擬器上復制一個文件或目錄:
adb pull
如:adb pull /addroid/lib/libwebcore.so .
5、搜索模擬器/設備的實例:
取得當前運行的模擬器/設備的實例的列表及每個實例的狀態:
adb devices
6、查看bug報告:
adb bugreport
7、記錄無線通訊日志:
一般來說,無線通訊的日志非常多,在運行時沒必要去記錄,但我們還是可以通過命令,設置記錄:
adb shell
logcat -b radio
8、獲取設備的ID和序列號:
adb get-product
adb get-serialno
9、訪問數據庫SQLite3
adb shell
sqlite3

10、通過gsm call命令可以像Android 模擬器打電話 ,除了在EclipseADT 的DDMS中通過按鈕Dial外,還可以通過DDMS外殼調用gsm call命令直接撥打,我們首先需要啟動AndroidEmulator,然后在cmd環境下執行telnet localhost 5554 下面就可以向Android模擬器 撥號,參數為gsmcall < phoneNum> ,比如給10086打電話 為gsm call +10086


posted @ 2011-12-05 19:34 life02 閱讀(584) | 評論 (1)編輯 收藏

emlulator可以在運行時與eclipse聯起來測試. 但怎么測試己經打好包的apk呢?

何果打apk就先不說了.

 

1 把apk放到emulator里,安裝,運行:(avd運行,安裝apk)

   運行cmd :

    android-sdk-windows-1.5_r3\tools>adb install snake-sample.apk

  就OK了. 你打開emulator就看到了.

 

2 如何在live-CD里按裝apk呢?

 

把apk放到網絡上的一個地方, 然后下載(我試圖放到hotmail的復件里,但不行, 又放到163的復件里, 也不行,后來我自己起了個tomcat點擊下載的). 會下載到sdcard/download/目錄下.

把它copy到/data/app就自動按好了.


posted @ 2011-12-05 19:32 life02 閱讀(313) | 評論 (0)編輯 收藏

很多初入Android開發的網友向我們問到Context有什么作用,很多地方都用到它,這里Android123給這些新入門的網友做個簡單的解釋:

   Context字面意思上下文,位于framework package的android.content.Context中,其實該類為LONG型,類似Win32中的Handle句柄,很多方法需要通過Context才能識別調用者的實例,比如說Toast的第一個參數就是Context,一般在Activity中我們直接用this代替,代表調用者的實例為Activity,而到了一個button的onClick(View view)等方法時,我們用this時就會報錯,所以我們可能使用ActivityName.this來解決,主要原因是因為實現Context的類主要有Android特有的幾個模型,Activity、Service以及BroadcastReceiver。

  常規需要Context實例的方法主要有各種Service實現的類,比如說SensorManager在實例化時需要getSystemService(String)方法就必須由Context的實例執行,還有一些私有的文件系統I/O比如說openFileInput以及常用的Toast的makeText方法。

在android中context可以作很多操作,但是最主要的功能是加載和訪問資源。在android中有兩種context,一種是 application context,一種是activity context,通常我們在各種類和方法間傳遞的是activity context。
比如一個activity的onCreate:
protected void onCreate(Bundle state) {
        super.onCreate(state);

        TextView label
= new TextView(this); //傳遞context給view control
        label.setText("Leaks are bad");

        setContentView(label);
}
把activity context傳遞給view,意味著view擁有一個指向activity的引用,進而引用activity占有的資源:view hierachy, resource等。
這樣如果context發生內存泄露的話,就會泄露很多內存。
這里泄露的意思是gc沒有辦法回收activity的內存。

Leaking an entire activity是很容易的一件事。

當屏幕旋轉的時候,系統會銷毀當前的activity,保存狀態信息,再創建一個新的。

比如我們寫了一個應用程序,它需要加載一個很大的圖片,我們不希望每次旋轉屏 幕的時候都銷毀這個圖片,重新加載。實現這個要求的簡單想法就是定義一個靜態的Drawable,這樣Activity 類創建銷毀它始終保存在內存中。
實現類似:
public class myactivity extends Activity {
       
private static Drawable sBackground;
       
protected void onCreate(Bundle state) {
                super.onCreate(state);

                TextView label
= new TextView(this);
                label.setText(
"Leaks are bad");

               
if (sBackground == null) {
                        sBackground
= getDrawable(R.drawable.large_bitmap);
                }
        label.setBackgroundDrawable(sBackground);
//drawable attached to a view

        setContentView(label);
        }
}
這段程序看起來很簡單,但是卻問題很大。當屏幕旋轉的時候會有leak(即gc沒法銷毀activity)。
我們剛才說過,屏幕旋轉的時候系統會銷毀當前的activity。但是當drawable和view關聯后,drawable保存了view的 reference,即sBackground保存了label的引用,而label保存了activity的引用。既然drawable不能銷毀,它所 引用和間接引用的都不能銷毀,這樣系統就沒有辦法銷毀當前的activity,于是造成了內存泄露。gc對這種類型的內存泄露是無能為力的。

避免這種內存泄露的方法是避免activity中的任何對象的生命周期長過activity,避免由于對象對 activity的引用導致activity不能正常被銷毀。我們可以使用application context。application context伴隨application的一生,與activity的生命周期無關。application context可以通過Context.getApplicationContext或者Activity.getApplication方法獲取。

避免context相關的內存泄露,記住以下幾點:
1. 不要讓生命周期長的對象引用activity context,即保證引用activity的對象要與activity本身生命周期是一樣的
2. 對于生命周期長的對象,可以使用application context
3. 避免非靜態的內部類,盡量使用靜態類,避免生命周期問題,注意內部類對外部對象引用導致的生命周期變化



posted @ 2011-12-05 17:13 life02 閱讀(358) | 評論 (0)編輯 收藏

僅列出標題
共20頁: First 9 10 11 12 13 14 15 16 17 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩综合另类| 99国产精品久久久久久久久久| 亚洲国产精品久久久久久女王| 久久伊人免费视频| 最新精品在线| 久久久水蜜桃av免费网站| 欧美吻胸吃奶大尺度电影| 在线欧美福利| 另类酷文…触手系列精品集v1小说| 亚洲一区二区在线免费观看视频| 欧美黑人在线播放| 亚洲国产欧美一区二区三区同亚洲 | 欧美激情精品久久久久久免费印度| 亚洲精选一区| 欧美电影免费| 亚洲福利在线看| 久久视频在线看| 性做久久久久久久免费看| 国产精品久久久久婷婷| 亚洲一卡二卡三卡四卡五卡| 亚洲精品在线看| 欧美三区在线观看| 性欧美超级视频| 欧美尤物一区| 在线视频观看日韩| 亚洲国产精品ⅴa在线观看 | 国产精品欧美日韩| 亚洲欧洲日产国产网站| 欧美亚洲成人网| 一区二区三区回区在观看免费视频| 亚洲国产99精品国自产| 美女尤物久久精品| 亚洲经典在线| 99日韩精品| 国产区二精品视| 久久尤物视频| 欧美精品在线网站| 国产亚洲欧美日韩一区二区| 欧美在线资源| 欧美日韩精品免费在线观看视频| 午夜精品视频在线| 欧美日韩一区二区在线| 欧美成人有码| 国产精品久久夜| 国产农村妇女精品一区二区| 久久xxxx| 久久成人免费| 欧美一区激情| 男女精品视频| 久久久国产精品亚洲一区| 国产精品视频成人| 亚洲黄色在线看| 久久一二三国产| 亚洲国产精品黑人久久久 | 亚洲国产天堂久久国产91| 亚洲精选在线观看| 久久综合九色综合欧美就去吻| 亚洲国产精品久久久久婷婷884 | 久久aⅴ国产紧身牛仔裤| 欧美在线免费观看亚洲| 欧美一区二区三区四区在线观看地址| 欧美人与禽性xxxxx杂性| 久久男女视频| 亚洲三级免费观看| 久久久久久久一区二区三区| 欧美一区二区三区视频免费播放| 中日韩视频在线观看| 激情国产一区| 国内精品亚洲| 老司机一区二区三区| 亚洲国产一区二区在线| 一本色道久久精品| 欧美暴力喷水在线| 亚洲综合色婷婷| 一区二区精品在线观看| 国产精品亚洲产品| 亚洲精品日韩综合观看成人91| 99精品欧美一区| 亚洲成人在线| 欧美日韩大片一区二区三区| 亚洲欧美精品suv| 欧美亚洲专区| 在线观看亚洲专区| 欧美在线视频免费观看| 亚洲午夜影视影院在线观看| 国产精品成人播放| 一本久久a久久精品亚洲| 一区二区在线免费观看| 国产精品日日做人人爱| 亚洲一区二区三| 亚洲天堂av综合网| 久久久999精品免费| 亚洲午夜精品国产| 久久精品欧美日韩| 亚洲黄色片网站| 久久精品在线视频| 香蕉久久夜色精品国产| 亚洲无毛电影| 男男成人高潮片免费网站| 狼人社综合社区| 欧美一区免费| 久久久久一区| 美女精品在线| 久久精品免费电影| 亚洲午夜久久久久久久久电影院| 亚洲高清三级视频| 亚洲国产高清在线| 国产一区二区三区四区三区四 | 欧美日韩亚洲另类| 韩日成人av| 久久国产视频网站| 久久中文久久字幕| 亚洲动漫精品| 欧美激情一区二区| 亚洲日本欧美天堂| 国产精品99久久久久久久女警| 欧美国产综合| 亚洲精品在线免费观看视频| 亚洲一区二区三区精品动漫| 国产精品v欧美精品v日韩精品| 亚洲午夜久久久久久久久电影网| 香蕉免费一区二区三区在线观看 | 久久久精品久久久久| 好吊日精品视频| 六十路精品视频| 亚洲美女在线观看| 欧美亚洲三区| 1024成人| 国产精品卡一卡二卡三| 久久久久国产一区二区| 亚洲经典三级| 亚洲欧美日韩国产| 精品福利电影| 欧美三级日韩三级国产三级| 性欧美超级视频| 91久久精品日日躁夜夜躁欧美| 亚洲综合第一| 极品av少妇一区二区| 欧美日韩国产三区| 欧美在线观看网址综合| 亚洲激精日韩激精欧美精品| 欧美在线免费视屏| 亚洲美女黄色片| 国产一区二区高清不卡| 欧美精品激情| 欧美主播一区二区三区美女 久久精品人| 亚洲第一福利社区| 欧美一区=区| 中文久久乱码一区二区| 在线观看日韩av先锋影音电影院| 欧美无乱码久久久免费午夜一区| 能在线观看的日韩av| 香港久久久电影| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 午夜精品亚洲| 亚洲精品乱码久久久久久黑人 | 国产欧美精品一区二区三区介绍 | 久久国产精品72免费观看| 亚洲第一色在线| 美女国内精品自产拍在线播放| 欧美aa在线视频| 91久久精品美女| 老司机精品视频一区二区三区| 中文一区二区在线观看| 在线电影欧美日韩一区二区私密| 国产麻豆日韩| 欧美四级伦理在线| 欧美精品v国产精品v日韩精品| 久久精品国产精品 | 欧美高清自拍一区| 久久久久九九九| 欧美一区二区三区久久精品| 亚洲永久精品国产| 在线中文字幕一区| 99伊人成综合| 一本色道久久99精品综合 | 国产精品―色哟哟| 欧美午夜免费| 欧美三级精品| 国产精品你懂的在线| 欧美亚洲第一区| 国产精品免费福利| 国产精品久久久久999| 国产精品国产一区二区| 国产精品久久久久久超碰| 国产精品成人在线观看| 国产精品三级视频| 国产专区精品视频| 伊人久久噜噜噜躁狠狠躁| 亚洲第一天堂无码专区| 亚洲国产高清视频| 亚洲伦伦在线| 亚洲天堂成人在线观看| 亚洲欧美日韩国产一区二区| 午夜精品一区二区三区在线| 欧美亚洲一区二区在线| 久久久久欧美| 欧美激情黄色片| 夜夜精品视频| 欧美一级理论片|