日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android的面孔_Actiyity

發布時間:2025/3/8 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android的面孔_Actiyity 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是Activity?

??? 簡單的說:Activity就是布滿整個窗口或者懸浮于其他窗口上的交互界面。在一個應用程序中通常由多個Activity構成,都會在Manifest.xml中指定一個主的Activity,如下設置

<actionandroid:name="android.intent.action.MAIN" />

當程序第一次運行時用戶就會看這個Activity,這個 Activity可以通過啟動其他的Activity進行相關操作。當啟動其他的Activity時這個當前的這個Activity將會停止,新的 Activity將會壓入棧中,同時獲取用戶焦點,這時就可在這個Activity上操作了。都知道棧是先進后出的原則,那么當用戶按Back鍵時,當前 的這個Activity銷毀,前一個Activity重新恢復。

二、Activity生命周期

先看下圖:

這個圖不再多說什么,下面我們通過一個實例來說明問題。新建工程,編寫如下代碼:

[java] view plaincopy print?
  • <span?style="font-size:18px;">package?com.android.ttx.actiitylifedemo;??
  • import?android.app.Activity;??
  • import?android.os.Bundle;??
  • import?android.util.Log;??
  • import?android.view.KeyEvent;??
  • public?class?ActivityLifeDemo?extends?Activity?{??
  • ????private?final?static?String?TAG="ActivityLifeDemo";??
  • ??????
  • ????@Override??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.main);??
  • ??????????
  • ????????Log.i(TAG,?"onCreate");??
  • ????}??
  • ????@Override??
  • ????protected?void?onStart()?{??
  • ????????Log.i(TAG,?"onStart");??
  • ????????super.onStart();??
  • ????}??
  • ????@Override??
  • ????protected?void?onRestart()?{??
  • ????????Log.i(TAG,?"onRestart");??
  • ????????super.onRestart();??
  • ????}??
  • ????@Override??
  • ????protected?void?onResume()?{??
  • ????????Log.i(TAG,?"onResume");??
  • ????????super.onResume();??
  • ????}??
  • ????@Override??
  • ????protected?void?onPause()?{??
  • ????????Log.i(TAG,?"onPause");??
  • ????????super.onPause();??
  • ????}??
  • ????@Override??
  • ????protected?void?onStop()?{??
  • ????????Log.i(TAG,?"onStop");??
  • ????????super.onStop();??
  • ????}??
  • ????@Override??
  • ????protected?void?onDestroy()?{??
  • ????????Log.i(TAG,?"onDestroy");??
  • ????????super.onDestroy();??
  • ????}??
  • }??
  • </span>??

  • 代碼很簡單,只涉及到一個Activity,一些用戶的操作,我們通過記錄操作和打印日志的方式來看看Activity的生命周期過程。

    1、? 運行
    看到如下打印日志:
    08-31 08:46:53.916: INFO/ActivityLifeDemo(312): onCreate
    08-31 08:46:53.916: INFO/ActivityLifeDemo(312): onStart
    08-31 08:46:53.916: INFO/ActivityLifeDemo(312): onResume
    2、按下返回按鍵:
    08-31 09:29:57.396: INFO/ActivityLifeDemo(354): onPause
    08-31 09:29:58.216: INFO/ActivityLifeDemo(354): onStop
    08-31 09:29:58.216: INFO/ActivityLifeDemo(354): onDestroy
    3、長按Home鍵,彈出最近打開過的應用程序,點擊ActivityLifeDemo
    08-31 08:51:46.916: INFO/ActivityLifeDemo(312): onCreate
    08-31 08:51:46.916: INFO/ActivityLifeDemo(312): onStart
    08-31 08:51:46.936: INFO/ActivityLifeDemo(312): onResume
    4、按Home鍵
    08-31 08:53:32.676: INFO/ActivityLifeDemo(312): onPause
    08-31 08:53:33.796: INFO/ActivityLifeDemo(312): onStop
    5、在AllList中點擊打開
    08-31 08:54:14.286: INFO/ActivityLifeDemo(312): onRestart
    08-31 08:54:14.286: INFO/ActivityLifeDemo(312): onStart
    08-31 08:54:14.296: INFO/ActivityLifeDemo(312): onResume

    通過日志信息,我們可以看到。Activity的啟動過 程:onCreate—onStart—onResume;下返回鍵時:onPause—onStop—onDestroy 正如上面說是,當按下返回鍵時,此Activity彈出棧,程序銷毀。確實如此,我們再次 打開時的啟動過程又回到onCreate—onStart—onResume。OK,啟動之后按下Home鍵,回到Launcher,查看打印信 息:onPause—onStop,再次打開的運行過程:onRestart—onStart—onResume。

    我們通過對Activity的各種操作,構成了Activity的生命周期,我們看到無論對Activity做如何的操作,都會接收到相關的回調方法,那么我們在開發的過程中通過這些回調方法就可以寫工作,比如說釋放一些重量級的對象,網絡連接,數據庫連接,文件讀等等。

    以下是各個方法的詳細說明:

    onCreate():當?activity?第一次創建 時會被調用。在這個方法中你需要完成所有的正常靜態設置?,比如創建一個視圖(?view?)、綁定列表的數據等等。如果能捕獲到?activity?狀 態的話,這個方法傳遞進來的?Bundle?對象將存放了?activity?當前的狀態。調用該方法后一般會調用?onStart()?方法。

    onRestart():在?activity?被停止后重新啟動時會調用該方法。其后續會調用?onStart?方法。

    onStart()à當?activity?對于用戶可見前即調用這個方法。如果?activity回到前臺則接著調用?onResume()?,如果?activity?隱藏則調用onStop()

    onResume():在?activity?開始與用戶交互前調用該方法。在這時該activity?處于?activity?棧的頂部,并且接受用戶的輸入。其后續會調用?onPause()?方法。

    onPause():在系統準備開始恢復其 它?activity?時會調用該方法。這個方法中通常用來提交一些還沒保存的更改到持久數據?中,停止一些動畫或其它一些耗?CPU?的操作等等。無論 在該方法里面進行任何操作,都需要較快速完成,因為如果它不返回的話,下一個?activity?將無法恢復出來。如果?activity?返回到前臺將 會調用?onResume()?,如果?activity?變得對用戶不可見了將會調用onStop()?。

    onStop():在?activity?對用戶不可見時 將調用該方法。可能會因為當前?activity?正在被銷毀,或另一個?activity?(已經存在的activity?或新 的?activity?)已經恢復了正準備覆蓋它,而調用該方法。如果?activity?正準備返回與用戶交互時后續會調用onRestart?,如 果?activity?正在被釋放則會調用?onDestroy?。

    onDestroy():在?activity?被銷毀前 會調用該方法。這是?activity?能接收到的最后一個調用。可能會因為有人調用了?finish?方法使得當前activity?正在關閉,或系統 為了保護內存臨時釋放這個?activity的實例,而調用該方法。你可以用?isFinishing?方法來區分這兩種不同的情況。

    三、如何啟動一個新的Activity?

    要啟動一個新的Activity,我們可以通過調用Context中的startActivity來啟動。像這樣:

    [java] view plaincopy print?
  • <span?style="font-size:18px;">Intent?intent?=?new?Intent(this,?ActivityDemo.class);??
  • startActivity(intent);??//?ActivityDemo是需要啟動的Activity類??
  • </span>??

  • 通過上面的方法可以啟動新的Activity了,但如果我要從當前的Activity中傳遞數據到新的Activity呢?很簡單:

    [java] view plaincopy print?
  • <span?style="font-size:18px;">Intent?intent?=?new?Intent(this,ActivityDemo.class);??
  • Bundle?bundle?=?new?Bundle();??
  • bundle.putBoolean("bool_key",?true);??
  • intent.putExtras(bundle);??
  • startActivity(intent);??
  • </span>??

  • 還有,有時候我們需要啟動帶返回值的Activity,簡單的說就是需要新啟動的Activity返回時將值傳遞給啟動它的Activity,像這樣:

    [java] view plaincopy print?
  • <span?style="font-size:18px;">Intent?intent?=?new?Intent(ActivityLifeDemo.this,RevalueActivity.class);??
  • startActivityForResult(intent,?0x1001);??
  • </span>??

  • ActivityLifeDemo是當前的Activity,啟動RevalueActivity,我們在ActivityLifeDemo中需要獲取RevalueActivity傳回來的值。那么在RevalueActivity中就必須這樣寫:

    [java] view plaincopy print?
  • <span?style="font-size:18px;">Intent?intent??=?new?Intent();??
  • intent.putExtra("revalue_key","haha-revalueActivity");??
  • setResult(0x1001,?intent);</span>??
  • 那么“revalue_key”值在哪里獲取呢?必須重寫onActivityResult方法,通過判斷requestCode,來確定

    [java] view plaincopy print?
  • <span?style="font-size:18px;">if(requestCode==0x1001){??
  • ????????????String?str?=?data.getStringExtra("revalue_key");??
  • ????????????Log.i(TAG,?"返回的值為:"+str);??
  • ????????}??
  • </span>??

  • 好了,詳細的請看代碼吧。下載地址:http://download.csdn.net/detail/tangcheng_ok/3580700

    ?

    四、保存Activity運行狀態

    通過重寫onSaveInstanceState()方法來實現Activity的運行狀態,請注意以下幾點:

    1)由于activity?對象被暫停或停止時,它仍然保留在內存里面,關于它的成員信息和當前狀態都是活動的,所以此時可以保存Activity的狀態,從而使用戶所作的Activity的更改保存在內存中

    2)? 當系統回收內存而將Activity銷毀時,就無法保存其狀態,所以需要調用onSaveInstanceState()方法來實現狀態的保存

    3)? 很多情況并不需要保持狀態信息,比如按下返回鍵直接關閉程序,所以并不能保證會調用onSaveInstanceState。如果調用了該方法,一般是在 onStop?方法之前且可能在?onPause?之后調用。盡管如此,即使你沒做任何操作或沒有實現?onSaveInstanceState()?方 法,你的?activity?狀態也能通過Activity?類里面默認實現的?onSaveInstanceState?方法恢復出來。特別是會為布局 中的視圖(?View?)默認調用onSaveInstanceState?方法,并在這個方法中允許每一個視圖提供它需要恢復的任何信息。幾乎每一 個?Android框架中的?widget?都視情況實現了這個方法。

    注:因為?onSaveInstanceState?方法 不一定會被調用,所以你應該只是用它來保存一些?activity?的轉換過程狀態(即?UI?的狀態),而不能用來保存永久性數據。但你可以 用?onPause?方法在用戶離開?activity?時來保存永久性數據,比如需要保存到數據庫的數據。

    有一個很好的方法可以用來檢驗應用程序保存狀態的能力,就 是簡單地旋轉你的設備來改變屏幕的方向。因為當屏幕方向改變時,系統為了給新的方向提供一個可能合適的代替資源,會銷毀?activity?并新建一個新 的。由于這個原因,你的?activity?是否能在其重新創建時完成保存狀態就顯得尤為重要,因為用戶經常會在使用應用程序時旋轉屏幕的。

    上文部分內容參考了:http://blog.csdn.net/sam_zhang1984/article/details/6430817,在這里多謝這位博主了。

    五、完全退出程序

    通過上面的介紹,我們知道當點擊back鍵時,程序調用了 onDestroy方法,程序退出了,但是我們查看其進程,發現調用了onDestroy方法之后這個Activity還在運行。甚至調用了 finish()方法之后程序還能在進程中看到。通過下面這種方式可以實現程序的完全退出:

    [java] view plaincopy print?
  • <span?style="font-size:18px;">Intent?intent?=?new?Intent();??
  • Intent.setClass(context,MainActivity.class);??
  • intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);??
  • intent.putExtra(“flag”,EXIT_APPLICATION);??
  • context.startActivity(intnet);???
  • </span>?
  • 總結

    以上是生活随笔為你收集整理的Android的面孔_Actiyity的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。