之前一直是在CSDN上寫的blog漓藕,感覺csdn經(jīng)常會出現(xiàn)一下bug,所以就開始向簡書上轉(zhuǎn)移。
之前csdn的博客地址
Android四大組件:Activity敌完、Service服務(wù)、Content Provider內(nèi)容提供者羊初、BroadcastReceiver廣播接收器滨溉。Activity翻譯為“活動”什湘,在android應(yīng)用中,一個Activity通常就是一個單獨的屏幕晦攒,用來與用戶進行交互闽撤。它是Android應(yīng)用中最常見、最常用的組件脯颜。
1 建立和配置Activity
建立自己的Activity需要繼承Activity類哟旗,也可以根據(jù)情況繼承Activity的子類。如下:FirstActivity.java
package com.vn.hello;
import android.app.Activity;
import android.os.Bundle;
public class FirstActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
除此之外還需要布局文件activity_main.xml文件用來顯示Activity界面栋操,其代碼如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.vn.hello.FirstActivity" >
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/first" />
</RelativeLayout>
布局文件可以通過修改RelativeLayout來調(diào)整頁面布局方式闸餐。可以再上述文件中間添加所需控件如:button矾芙、textview绎巨、editview等。
還有就是需要在清單文件AndroidManifest.xml文件里配置需要顯示的Activity蠕啄。
<activity
android:name=".FirstActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
將此元素添加到<application> </application>中間场勤。上面代碼中的
name表示該Activity的實現(xiàn)類;
label表示該Activity的標簽歼跟。
<intent-filter....../>可以有一個或多個和媳,用于指定該Activity可以響應(yīng)的Intent。配置完這些運行安裝到手機就可以顯示出這個Activity了哈街。
2 Activity的生命周期
先看一下Activity的生命周期圖:
這個是Activity的流程留瞳,
- 啟動Activity:系統(tǒng)會先調(diào)用onCreate方法,然后調(diào)用onStart方法骚秦,然后調(diào)用onResume她倘,Activity進入運行狀態(tài)。
- 用戶銷毀當前Activity:系統(tǒng)先調(diào)用onPause方法作箍,然后調(diào)用onStop方法硬梁,最后調(diào)用onDestory方法,結(jié)束當前Activity胞得。
- 當前Activity由被覆蓋狀態(tài)回到前臺或解鎖屏或?qū)υ捒蛳В合到y(tǒng)會調(diào)用onResume方法荧止,再次進入運行狀態(tài)。
- 當前Activity轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏阶剑,自身退居后臺:系統(tǒng)會先調(diào)用onPause方法跃巡,然后調(diào)用onStop方法,進入停滯狀態(tài)牧愁,此時不可見素邪。
- 用戶后退回到此Activity:系統(tǒng)會先調(diào)用onRestart方法,然后調(diào)用onStart方法猪半,最后調(diào)用onResume方法兔朦,再次進入運行狀態(tài)猿涨。
- 當前Activity處于被覆蓋狀態(tài)或者后臺不可見狀態(tài)匀泊,即第2步和第4步废酷,系統(tǒng)內(nèi)存不足遂黍,殺死當前Activity俐填,而后用戶退回當前Activity:再次調(diào)用onCreate方法安接、onStart方法、onResume方法英融,進入運行狀態(tài)盏檐。
- 當前Activity被其他Activity覆蓋其上或被鎖屏或被對話框覆蓋:系統(tǒng)會調(diào)用onPause方法,暫停當前Activity的執(zhí)行驶悟。
3 Activity跳轉(zhuǎn)
看一下這個例子兩個Activity的跳轉(zhuǎn):
FirstActivity.java
package com.vn.test;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class FirstActivity extends Activity {
private String TAG = "FirstActivity";
private Button mButton;
//Activity創(chuàng)建時調(diào)用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
Log.i(TAG, "First--onCreate");
mButton=(Button) findViewById(R.id.button1);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(FirstActivity.this,SecondActivity.class));
}
});
}
//Activity創(chuàng)建胡野、從后臺重新回到前臺時被調(diào)用
@Override
protected void onStart() {
super.onStart();
Log.i(TAG ,"First--onStart");
}
//Activity從后臺回到前臺
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG ,"First--onRestart");
}
//Activity從創(chuàng)建、被覆蓋到顯示痕鳍、從后臺回到前臺
@Override
protected void onResume() {
super.onResume();
Log.i(TAG ,"First--onResume");
}
//獲取或失去焦點
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.i(TAG ,"First--onWindowFocusChanged "+hasFocus);
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG ,"First--onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG ,"First--onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG ,"First--onDestroy");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
}
第二個Activity SecondActivity.java
package com.vn.test;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SecondActivity extends Activity {
private String TAG = "SecondActivity";
private Button jump;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second);
Log.i(TAG ,"Second--onCreate");
jump=(Button) findViewById(R.id.button1);
jump.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(SecondActivity.this,FirstActivity.class));
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG ,"Second-onStart");
}
//Activity從后臺回到前臺
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG ,"Second--onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG ,"Second--onResume");
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.i(TAG ,"Second--onWindowFocusChanged "+hasFocus);
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG ,"Second--onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG ,"Second--onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG ,"Second--onDestroy");
}
}
當應(yīng)用程序開啟時輸出log:
First--onCreate
First--onStart
First--onResume
First--onWindowFocusChanged true
當點擊FirstActivity的按鈕會跳轉(zhuǎn)到SecondActivity硫豆,調(diào)用方法順序(可能會因為Andorid版本的改動而有所變動):
First--onPause
Second--onCreate
Second-onStart
Second--onResume
First--onWindowFocusChanged false
Second--onWindowFocusChanged true
First--onStop
onWindowFocusChanged方法在Activity窗口獲得或失去焦點時被調(diào)用。不一定在第二個界面顯示出來才調(diào)用笼呆,我試了兩個手機熊响,結(jié)果不一樣。版本低的是上述的情況诗赌,另一個版本較高的手機順序是:
First--onPause
First--onWindowFocusChanged false
Second--onCreate
Second--onStart
Second--onResume
Second--onWindowFocusChanged true
First--onStop
從新回到FirstActivity汗茄,調(diào)用方法順序:
Second--onPause
Second--onWindowFocusChanged false
First--onRestart
First--onStart
First--onResume
First--onWindowFocusChanged true
Second--onStop
當鎖屏或屏幕休眠時,依次調(diào)用方法:
First--onPause
First--onStop
重新解鎖:
First--onRestart
First--onStart
First--onResume
并沒有調(diào)用onWindowFocusChanged方法铭若。
而當按home鍵時洪碳,回到手機主頁面,依次調(diào)用方法如下叼屠,屏幕失去焦點瞳腌。
First--onPause
First--onWindowFocusChanged false
First--onStop
重新進入程序打開FirstActivity,獲取焦點镜雨。調(diào)用方法:
First--onRestart
First--onStart
First--onResume
First--onWindowFocusChanged true
當?shù)谝粋€界面彈出一個對話框(沒有全部覆蓋FirstActivity)纯趋,或者SecondActivity是對話框形式的。方法如下:
First--onPause
First--onWindowFocusChanged false
Second--onCreate
Second-onStart
Second--onResume
Second--onWindowFocusChanged true
//第一個界面并沒有調(diào)用onStop方法冷离。只有全部覆蓋才會調(diào)用onStop方法吵冒。