activity是Android四大組件之一,其中所有的操作都與用戶密切相關(guān)烛卧,是一個負(fù)責(zé)與用戶交互的組件佛纫,可以通過 setContentView(View) 來顯示組件。
Activity整個生命周期的4種狀態(tài)总放、7個重要方法
4種基本狀態(tài)
- 活動(Active/Running)狀態(tài)
當(dāng)Activity運行在屏幕前臺(處于當(dāng)前任務(wù)活動棧的最上面),此時它獲取了焦點能響應(yīng)用戶的操作,屬于運行狀態(tài)呈宇,同一個時刻只會有一個Activity 處于活動(Active)或運行
- 暫停(Paused)狀態(tài)
當(dāng)Activity失去焦點但仍對用戶可見(如在它之上有另一個透明的Activity或Toast、AlertDialog等彈出窗口時)它處于暫停狀態(tài)局雄。暫停的Activity仍然是存活狀態(tài)(它保留著所有的狀態(tài)和成員信息并保持和窗口管理器的連接),但是當(dāng)系統(tǒng)內(nèi)存極小時可以被系統(tǒng)殺掉
- 停止(Stopped)狀態(tài)
如果一個Activity被另外的Activity完全覆蓋掉甥啄,叫做停止?fàn)顟B(tài)(Stopped)。它依然保持所有狀態(tài)和成員信息炬搭,但是它不再可見蜈漓,所以它的窗口被隱藏,當(dāng)系統(tǒng)內(nèi)存需要被用在其他地方的時候尚蝌,Stopped的Activity將被強行終止掉迎变。
- 非活動(Dead)狀態(tài)
如果一個Activity是Paused或者Stopped狀態(tài),系統(tǒng)可以將該Activity從內(nèi)存中刪除飘言,Android系統(tǒng)采用兩種方式進行刪除,要么要求該Activity結(jié)束驼侠,要么直接終止它的進程姿鸿。當(dāng)該Activity再次顯示給用戶時谆吴,它必須重新開始和重置前面的狀態(tài)。
7個重要方法(建議看上圖)
- onCreate(Bundle savedInstanceState);
通常用于初始化(碎片和加載器)設(shè)置:
- 使用setContentView加載布局
- 初始化控件和變量等
- 連接數(shù)據(jù)庫并將數(shù)據(jù)綁定到list列表中
注1:Activity還在后臺苛预,不可見(啟動動畫那些的還是不要來了吧)
注2:這個方法會傳遞一個保存了此Activity上一狀態(tài)信息的Bundle對象句狼。緊隨其后的方法總是onStart().
- onStart();
在此Activity可見(顯示在前臺)之前調(diào)用。
如果接著是顯示在前臺热某,緊隨其后的方法是onResume()腻菇;如果接下來此Activity被隱藏了,則緊隨其后的方法是onStop()昔馋。
- onRestart()
處于停止態(tài)的Activity調(diào)用此方法筹吐,可以讓此Activity重新顯示在前臺。
緊隨其后的方法總是onStart()
- onResume
Activity在這個階段已經(jīng)出現(xiàn)在前臺并且可見了秘遏,可打開獨占設(shè)備(相機等)此時該Activity位于Activity棧的頂部丘薛,在等待用戶的操作(輸入數(shù)據(jù)或點擊按鈕等)。緊隨其后的方法是onPause().
- onPause
當(dāng)啟動其他activity時調(diào)用此方法邦危。在這個方法體里洋侨,通常用于提交未保存的數(shù)據(jù)、停止動畫/視頻和處理其他占用CPU資源的程序倦蚪,等等希坚。同時在這個方法體里處理的都是一些迅速快捷的操作,因為下一個activity會在onPause()方法執(zhí)行完之后才可以在前臺顯示陵且。
如果此Activity重新回到前臺顯示吏够,則緊隨其后的方法是onResume();如果此Activity變得不可見了滩报,則緊隨其后的方法是onStop()
- onStop()
當(dāng)Activity不可見時調(diào)用此方法锅知。這個方法的調(diào)用時刻是在Activity需要銷毀或者被其他otherActivity取代且覆蓋此Activity在前臺顯示時調(diào)用。
如果此Activity重新顯示在前臺脓钾,緊隨其后的方法是onRestart()售睹;如果此Activity需要被銷毀,緊隨其后的方法是onDestroy()
- onDestroy
Activity被銷毀時調(diào)用此方法可训。這是Activity生命周期里最后調(diào)用的一個方法昌妹。這個方法的調(diào)用可以發(fā)生在activity調(diào)用了finish()方法之后,或者是系統(tǒng)為了節(jié)省空間而銷毀了此Activity的實例握截。你可以使用isFinishing()方法來區(qū)分這兩種情況
創(chuàng)建一個Activity
編寫一個繼承 AppCompatActivity 的 Java 類并在 AndroidManifest.xml 聲明即可飞崖。
- 編寫 java 類
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = MainActivity.class.getSimpleName();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.e(LOG_TAG, "onCreate");
}
@Override
protected void onStart() {
Log.e(LOG_TAG, "onStart");
super.onStart();
}
@Override
protected void onResume() {
Log.e(LOG_TAG, "onResume");
super.onResume();
}
@Override
protected void onPause() {
Log.e(LOG_TAG, "onPause");
super.onPause();
}
@Override
protected void onStop() {
Log.e(LOG_TAG, "onStop");
super.onStop();
}
@Override
protected void onDestroy() {
Log.e(LOG_TAG, "onDestroy ");
super.onDestroy();
}
}
- 在 AndroidManifest.xml 聲明
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在一個Activity啟動另一個Activity
Intent intent =new Intent(CurrentActivity.this,OtherActivity.class);
startActivity(intent);
注: 兩個 Activity 都需要在 清單文件中配置
startActivityForResult
頁面跳轉(zhuǎn)之后,需要返回到之前的頁面谨胞,同時要保留用戶之前輸入的信息.
步驟:
- 從A頁面跳轉(zhuǎn)到B頁面時固歪,我們就不使用"startActivity()"方法了,使用"startActivityForResult"方法。
- 在A頁面的Activity中牢裳,需要重寫"onActivityResult"方法
方法詳解:
onActivityResult(int requestCode, int resultCode, Intent data)
第一個參數(shù): 用于標(biāo)識請求來源逢防。
比如說: 一個Activity有兩個按鈕,點擊這兩個按鈕都會打開同一個Activity
我想要知道新Activity是由那個按鈕打開的蒲讯⊥可以通過 requestCode 識別。
第二個參數(shù):返回的數(shù)據(jù)來自于哪個新Activity
第三個參數(shù):一個Intent對象判帮,帶有返回的數(shù)據(jù)局嘁。
Activity 之間通信
使用 Intent 通信
Android 中通過 Intent 對象來表示一條消息,一個 Intent 對象不僅包含有這個消息的目的地晦墙,還可以包含消息的內(nèi)容悦昵,這好比一封 Email,其中不僅應(yīng)該包含收件地址偎痛,還可以包含具體的內(nèi)容旱捧。對于一個 Intent 對象,消息“目的地”是必須的踩麦,而內(nèi)容則是可選項枚赡。
- 發(fā)送信息,如果我們想要給“收件人”Activity 說點什么的話谓谦,那么可以通過下面這封“e-mail”來將我們消息傳遞出去:
Intent intent =new Intent(CurrentActivity.this,OtherActivity.class);
// 創(chuàng)建一個帶“收件人地址”的 email
Bundle bundle =new Bundle();// 創(chuàng)建 email 內(nèi)容
bundle.putBoolean("boolean_key", true);// 編寫內(nèi)容
bundle.putString("string_key", "string_value");
intent.putExtra("key", bundle);// 封裝 email
startActivity(intent);// 啟動新的 Activity
- 接受信息贫橙,在 OtherActivity類的 onCreate()或者其它任何地方使用下面的代碼就可以打開這封“e-mail”閱讀其中的信息:
Intent intent =getIntent();// 收取 email
Bundle bundle =intent.getBundleExtra("key");// 打開 email
bundle.getBoolean("boolean_key");// 讀取內(nèi)容
bundle.getString("string_key");
上面我們通過 bundle對象來傳遞信息,bundle維護了一個 HashMap< String, Object>對象反粥,將我們的數(shù)據(jù)存貯在這個 HashMap 中來進行傳遞卢肃。但是像上面這樣的代碼稍顯復(fù)雜,因為 Intent 內(nèi)部為我們準(zhǔn)備好了一個 bundle才顿,所以我們也可以使用這種更為簡便的方法:
Intent intent =new Intent(EX06.this,OtherActivity.class);
intent.putExtra("boolean_key", true);
intent.putExtra("string_key", "string_value");
startActivity(intent);
接收信息:
Intent intent=getIntent();
intent.getBooleanExtra("boolean_key",false);
intent.getStringExtra("string_key");
使用 SharedPreferences
SharedPreferences 使用 xml 格式為 Android 應(yīng)用提供一種永久的數(shù)據(jù)存貯方式莫湘。對于一個 Android 應(yīng)用,它存貯在文件系統(tǒng)的 /data/ data/your_app_package_name/shared_prefs/目錄下郑气,可以被處在同一個應(yīng)用中的所有 Activity 訪問
// 寫入 SharedPreferences
SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putBoolean("boolean_key", true);
editor.putString("string_key", "string_value");
editor.commit();
// 讀取 SharedPreferences
SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE);
preferences.getBoolean("boolean_key", false);
preferences.getString("string_key", "default_value");
其它方式
- SQLite
- 文件
- IPC方式
一些關(guān)于 Activity 的技巧
鎖定 Activity 運行時的屏幕方向
有時我們的應(yīng)用程序僅能在橫屏 / 豎屏?xí)r運行幅垮,比如某些游戲,此時我們需要鎖定該 Activity 運行時的屏幕方向
< activity > 節(jié)點的 android:screenOrientation
屬性 就是控制屏幕方向的尾组。
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">// 豎屏 , 值為 landscape 時為橫屏
…………
</activity>
全屏
// 設(shè)置全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// 去除標(biāo)題欄
requestWindowFeature(Window.FEATURE_NO_TITLE);