您好,登錄后才能下訂單哦!
本文主講了什么是Activity,它的生命周期,不對(duì)的操作,調(diào)用了什么函數(shù)。以及不同的Activity之間的跳轉(zhuǎn)、數(shù)據(jù)傳遞等。
Activity 是用戶接口程序,原則上它會(huì)提供給用戶一個(gè)交互式的接口功能。它是 android 應(yīng)用程序的基本功能單元。Activity 本身是沒(méi)有界面的。所以activity類(lèi)創(chuàng)建了一個(gè)窗口,開(kāi)發(fā)人員可以通過(guò)setContentView(View)接口把UI放到activity創(chuàng)建的窗口上,當(dāng)activity指向全屏窗口時(shí),也可以用其他方式實(shí)現(xiàn):作為漂浮窗口(通過(guò)windowIsFloating的主題集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是單獨(dú)的,用于處理用戶操作。幾乎所有的activity都要和用戶打交道。
一、Activity的生命周期簡(jiǎn)介
1、操縱生命周期的七種方法:
2、Activity的運(yùn)作流程
一般啟動(dòng)Activity:onCreate -> onStart -> onResume
呼叫另一個(gè)Activity: onPause -> onCreate -> onStart -> onResume -> onStop
還原Activity: onPause -> onRestart -> onStart -> onResume -> onStop -> onDestroy
退出Activity: onPause -> onStop -> onDestroy
回收再啟動(dòng)Activity: onCreate -> onStart –> onResume
3、Activity生命周期的四種基本狀態(tài):
(1)Active/Runing:一個(gè)新 Activity 啟動(dòng)入棧后,它在屏幕最前端,處于棧的最頂端,此時(shí)它處于可見(jiàn)并可和用戶交互的激活狀態(tài)。
(2)Paused:當(dāng) Activity 被另一個(gè)透明或者 Dialog 樣式的 Activity 覆蓋時(shí)的狀態(tài)。此時(shí)它依然與窗口管理器保持連接,系統(tǒng)繼續(xù)維護(hù)其內(nèi)部狀態(tài),所以它仍然可見(jiàn),但它已經(jīng)失去了焦點(diǎn)故不可與用戶交互。
(3)Stoped。當(dāng) Activity 被另外一個(gè) Activity 覆蓋、失去焦點(diǎn)并不可見(jiàn)時(shí)處于 Stoped狀態(tài)。
(4)Killed Activity。被系統(tǒng)殺死回收或者沒(méi)有被啟動(dòng)時(shí)處于 Killed狀態(tài)。
二、Activity生命周期代碼范例
1: /**
2: *Activity生命周期學(xué)習(xí)
3: *@author 林炳文(博客 )
4: *@time 2015.3.19
5: */
6: package com.example.activitylearning;
7: import android.os.Bundle;
8: import android.app.Activity;
9: import android.util.Log;
10: public class MainActivity extends Activity {
11: private static final String TAG="AvtivityTest";
12: @Override
13: protected void onCreate(Bundle savedInstanceState) {
14: super.onCreate(savedInstanceState);
15: Log.d(TAG, "onCreate() called");
16: setContentView(R.layout.activity_main);
17: }
18: @Override
19: protected void onStart(){
20: super.onStart();
21: Log.d(TAG, "onStart() called");
22:
23: }
24: @Override
25: protected void onResume(){
26: super.onResume();
27: Log.d(TAG,"onResume() called");
28:
29: }
30: @Override
31: protected void onPause(){
32: super.onPause();
33: Log.d(TAG, "onPause() called");
34:
35: }
36: @Override
37: protected void onStop(){
38: super.onStop();
39: Log.d(TAG, "onStop() called");
40:
41: }
42: protected void onDestroy(){
43: super.onDestroy();
44: Log.d(TAG, "onDestroy() called");
45:
46: }
47:
48:
49: }
1、程序啟動(dòng)
一般啟動(dòng)Activity:onCreate -> onStart -> onResume
2、程序啟動(dòng)后按下后退鍵
退出Activity: onPause -> onStop -> onDestroy
可以看到,程序已退出了。
3、程序啟動(dòng)后按下主屏幕鍵
還原Activity: onPause -> onRestart -> onStart -> onResume -> onStop -> onDestroy
再打開(kāi)程序:
三、多個(gè)Activity管理
1、Android 是通過(guò)一種 Activity 棧的方式來(lái)管理 Activity 的,一個(gè) Activity 的實(shí)例的狀態(tài)決定它在棧中的位置。
2、處于前臺(tái)的 Activity 總是在棧的頂端,當(dāng)前臺(tái)的 Activity 因?yàn)楫惓;蚱渌虮讳N(xiāo)毀時(shí),處于棧第二層的 Activity 將被激活,上浮到棧頂。
3、當(dāng)新的 Activity 啟動(dòng)入棧時(shí),原 Activity 會(huì)被壓入到棧的第二層。一個(gè) Activity 在棧中的位置變化反映了它在不同狀態(tài)間的轉(zhuǎn)換
注意:
在Android系統(tǒng)中,要使用Activity必須在AndroidManifest.xml文件中進(jìn)行配置。
在<application…/>元素中添加<activity…/>子元素即可
配置Activity通常指定如下三個(gè)屬性:
–name:指定該Activity的實(shí)現(xiàn)類(lèi)。
–icon:指定該Activity對(duì)應(yīng)的圖標(biāo)。
–label:指定該Activity的標(biāo)簽。
四、由一個(gè)Activity啟動(dòng)另一個(gè)Activity(不帶數(shù)據(jù)傳遞)
1、布局
activity_1.xml(放在layout)
1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: xmlns:tools="http://schemas.android.com/tools"
3: android:layout_width="match_parent"
4: android:layout_height="match_parent"
5: tools:context=".Activity1" >
6: <Button
7: android:id="@+id/id_button1"
8: android:layout_width="match_parent"
9: android:layout_height="wrap_content"
10: android:text="啟動(dòng)Activity2"
11: />
12: </RelativeLayout>
activity_2.xml
1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: xmlns:tools="http://schemas.android.com/tools"
3: android:layout_width="match_parent"
4: android:layout_height="match_parent" >
5: <Textview
6: android:text="歡迎來(lái)到Activity2"
7: android:layout_centerInParent="true"
8: android:layout_width="match_parent"
9: android:layout_height="wrap_content"
10: android:textSize="30sp"
11: />
12: </RelativeLayout>
2、對(duì)應(yīng)的代碼:
Activity1.java
1: /**
2: *Activity生命周期學(xué)習(xí)
3: *@author 林炳文(博客 http://blog.csdn.net/evankaka/)
4: *@time 2015.3.19
5: */
6: package com.example.activitylearning;
7: import android.os.Bundle;
8: import android.app.Activity;
9: import android.content.Intent;
10: import android.util.Log;
11: import android.view.View;
12: import android.view.View.OnClickListener;
13: import android.widget.Button;
14: public class Activity1 extends Activity {
15: private static final String TAG="Avtivity1";
16: private Button mButton;
17:
18: @Override
19: protected void onCreate(Bundle savedInstanceState) {
20: super.onCreate(savedInstanceState);
21: Log.d(TAG, "onCreate() called");
22: setContentView(R.layout.activity_1);
23: mButton=(Button)findViewById(R.id.id_button1);
24: mButton.setOnClickListener(new OnClickListener() {
25: @Override
26: public void onClick(View arg0) {
27: startActivity(new Intent(Activity1.this,Activity2.class));
28:
29: }
30: });
31: }
32: @Override
33: protected void onStart(){
34: super.onStart();
35: Log.d(TAG, "onStart() called");
36:
37: }
38: @Override
39: protected void onResume(){
40: super.onResume();
41: Log.d(TAG,"onResume() called");
42:
43: }
44: @Override
45: protected void onPause(){
46: super.onPause();
47: Log.d(TAG, "onPause() called");
48:
49: }
50: @Override
51: protected void onStop(){
52: super.onStop();
53: Log.d(TAG, "onStop() called");
54:
55: }
56: protected void onDestroy(){
57: super.onDestroy();
58: Log.d(TAG, "onDestroy() called");
59:
60: }
61:
62:
63: }
Activity2.java
1: package com.example.activitylearning;
2:
3: import android.app.Activity;
4: import android.os.Bundle;
5: import android.util.Log;
6:
7: public class Activity2 extends Activity {
8: private static final String TAG="Avtivity2";
9: @Override
10: protected void onCreate(Bundle savedInstanceState) {
11: super.onCreate(savedInstanceState);
12: Log.d(TAG, "onCreate() called");
13: setContentView(R.layout.activity_2);
14: }
15: @Override
16: protected void onStart(){
17: super.onStart();
18: Log.d(TAG, "onStart() called");
19:
20: }
21: @Override
22: protected void onResume(){
23: super.onResume();
24: Log.d(TAG,"onResume() called");
25:
26: }
27: @Override
28: protected void onPause(){
29: super.onPause();
30: Log.d(TAG, "onPause() called");
31:
32: }
33: @Override
34: protected void onStop(){
35: super.onStop();
36: Log.d(TAG, "onStop() called");
37:
38: }
39: protected void onDestroy(){
40: super.onDestroy();
41: Log.d(TAG, "onDestroy() called");
42:
43: }
44:
45: }
3、Activity注冊(cè)
Androidmanifest.xml中
增加:
1: <activity
2: android:name="com.example.activitylearning.Activity2"
3: android:label="@string/app_name">
4: </activity>
4、運(yùn)行結(jié)果
(1)、在Activity中點(diǎn)擊按鈕:?jiǎn)?dòng)Activity2
從上面可以看出Activity1沒(méi)被毀掉,而是變成Stop()了,當(dāng)前變成不可見(jiàn)。
(2 )然后再點(diǎn)擊后退鍵:
五、由一個(gè)Activity啟動(dòng)另一個(gè)Activity(帶數(shù)據(jù)傳遞)
1、界面
activity_1.xml(放在layout)
1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: xmlns:tools="http://schemas.android.com/tools"
3: android:layout_width="match_parent"
4: android:layout_height="match_parent"
5: tools:context=".Activity1" >
6: <Button
7: android:id="@+id/id_button1"
8: android:layout_width="match_parent"
9: android:layout_height="wrap_content"
10: android:text="啟動(dòng)Activity2"
11: />
12:
13: <EditText
14: android:id="@+id/id_edittext1"
15: android:layout_below="@id/id_button1"
16: android:layout_width="match_parent"
17: android:layout_height="wrap_content"
18: />
19: <EditText
20: android:id="@+id/id_edittext2"
21: android:layout_below="@id/id_edittext1"
22: android:layout_width="match_parent"
23: android:layout_height="wrap_content"
24: />
25: </RelativeLayout>
activity_2.xml(放在layout)
1: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2: xmlns:tools="http://schemas.android.com/tools"
3: android:layout_width="match_parent"
4: android:layout_height="match_parent" >
5: <TextView
6: android:id="@+id/id_textview1"
7: android:layout_width="match_parent"
8: android:layout_height="wrap_content"
9: android:textSize="30sp"
10: />
11: <TextView
12: android:id="@+id/id_textview2"
13: android:layout_below="@id/id_textview1"
14: android:layout_width="match_parent"
15: android:layout_height="wrap_content"
16: android:textSize="30sp"
17: />
18: </RelativeLayout>
兩個(gè)效果如下:
2、主要代碼。
Activity1.java中
1: Intent mIntent=new Intent(Activity1.this,Activity2.class);
2: String mString1 = mEditText1.getText().toString();
3: String mString2 = mEditText1.getText().toString();
4: mIntent.putExtra("one",mString1);
5: mIntent.putExtra("two",mString2);
6: startActivity(mIntent);
Activity2.java中
1: mTextView1=(TextView)findViewById(R.id.id_textview1);
2: mTextView2=(TextView)findViewById(R.id.id_textview1);
3:
4: String mString1=getIntent().getStringExtra("one");
5: String mString2=getIntent().getStringExtra("two");
6:
7: mTextView1.setText(mString1);
8: mTextView2.setText(mString1);
3、運(yùn)行結(jié)果
左邊為Activity1,右邊為Activity2.它會(huì)得到Activity1的結(jié)果并在TextView中顯示出來(lái)
六、得到返回的Activity的數(shù)據(jù)
這里要實(shí)現(xiàn)在Activity1中的兩個(gè)EditText中輸入內(nèi)容,打開(kāi)Activity2,將Activity1中的兩個(gè)EditText的內(nèi)容顯示在Activity2的兩個(gè)TextView中。
在在Activity2中的兩個(gè)EditText中輸入內(nèi)容,按下返回鍵,將Activity2中的兩個(gè)EditText的內(nèi)容顯示在Activity1的兩個(gè)TextView中。
1、布局
2、主要代碼
Activity1.java中:
1: mButton=(Button)findViewById(R.id.id_button1);
2: mButton.setOnClickListener(new OnClickListener() {
3: @Override
4: public void onClick(View arg0) {
5: Intent mIntent=new Intent(Activity1.this,Activity2.class);
6: String mString1 = mEditText1.getText().toString();
7: String mString2 = mEditText2.getText().toString();
8: mIntent.putExtra("one",mString1);
9: mIntent.putExtra("two",mString2);
10: startActivityForResult(mIntent, 0);
11:
12: }
13: });
注意要用 startActivityForResult(mIntent, 0);//0表示標(biāo)識(shí),等下Activity也要標(biāo)志為0
然后是處理Activity2返回后的事件
1: @Override
2: protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3: super.onActivityResult(requestCode, resultCode, data);
4: if(null==data)
5: return;
6: TextView mTextView3=(TextView)findViewById(R.id.id_textview3);
7: TextView mTextView4=(TextView)findViewById(R.id.id_textview4);
8:
9: String mString3=data.getStringExtra("three");
10: String mString4=data.getStringExtra("four");
11:
12: mTextView3.setText(mString3);
13: mTextView4.setText(mString4);
14: }
Activity2.java中:
在按下返回鍵的事件中,增加一些數(shù)據(jù)傳遞,其實(shí)這里主要是setResult(0,result);注意0要和上面的startActivityForResult(mIntent, 0);對(duì)應(yīng)。
1: @Override
2: public boolean onKeyDown(int keyCode, KeyEvent event) {
3: if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
4:
5: EditText mEditText3=(EditText)findViewById(R.id.id_edittext3);
6: EditText mEditText4=(EditText)findViewById(R.id.id_edittext4);
7: String mData1 = mEditText3.getText().toString();
8: String mData2 = mEditText4.getText().toString();
9: Intent result = new Intent();
10: result.putExtra("three", mData1);
11: result.putExtra("four", mData2);
12: setResult(0, result);
13:
14: }
15: return super.onKeyDown(keyCode, event);
16: }
3、效果
從Activity1中啟動(dòng)Activity2,可以看到,數(shù)據(jù)傳遞過(guò)去了
Activity1 Activity2
從Activity2中返回到Activity1中,可以看到,數(shù)據(jù)返回了
Activity2 Activity1
八、額外內(nèi)容
Activity返回值
使用startActivity方式啟動(dòng)的Activity和它的父Activity無(wú)關(guān),當(dāng)它關(guān)閉時(shí)也不會(huì)提供任何反饋??勺兺ǖ?,你可以啟動(dòng)一個(gè)Activity作為子Activity,它與父Activity有內(nèi)在的聯(lián)系。當(dāng)子Activity關(guān)閉時(shí),它會(huì)觸發(fā)父Activity中的一個(gè)事件處理函數(shù)。子Activity最適合用在一個(gè)Activity為其它的Activity提供數(shù)據(jù)(例如用戶從一個(gè)列表中選擇一個(gè)項(xiàng)目)的場(chǎng)合。
子Activity的創(chuàng)建和普通Activity的創(chuàng)建相同,也必須在應(yīng)用程序的manifest中注冊(cè)。任何在manifest中注冊(cè)的Activity都可以用作子Activity。
啟動(dòng)子Activity
startActivityForResult方法和startActivity方法工作很相似,但有一個(gè)很重要的差異。Intent都是用來(lái)決定啟動(dòng)哪個(gè)Activity,你還可以傳入一個(gè)請(qǐng)求碼。這個(gè)值將在后面用來(lái)作為有返回值A(chǔ)ctivity的唯一ID。
下面的代碼顯示了如何啟動(dòng)一個(gè)子Activity:
private static final int SHOW_SUBACTIVITY = 1;
Intent intent = new Intent(this, MyOtherActivity.class);
startActivityForResult(intent, SHOW_SUBACTIVITY);
和正常的Activity一樣,子Activity可以隱式或顯式啟動(dòng)。下面的框架代碼使用一個(gè)隱式的Intent來(lái)啟動(dòng)一個(gè)新的子Activity來(lái)挑選一個(gè)聯(lián)系人:
private static final int PICK_CONTACT_SUBACTIVITY = 2;
Uri uri = Uri.parse(“content://contacts/people”);
Intent intent = new Intent(Intent.ACTION_PICK, uri);
startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY);
返回值
當(dāng)子Activity準(zhǔn)備關(guān)閉時(shí),在finish之前調(diào)用setResult來(lái)給調(diào)用的Activity返回一個(gè)結(jié)果。
setResult方法帶兩個(gè)參數(shù):結(jié)果碼和表示為Intent的負(fù)載值。結(jié)果碼是運(yùn)行子Activity的結(jié)果,一般是Activity.RESULT_OK或Activity.RESULT_CANCELED。在一些情況下,你會(huì)希望使用自己的響應(yīng)代號(hào)來(lái)處理特定的應(yīng)用程序的選擇;setResult支持任何整數(shù)值。
作為結(jié)果返回的Intent可以包含指向一個(gè)內(nèi)容(例如聯(lián)系人,電話號(hào)碼或媒體文件)的URI和一組用來(lái)返回額外信息的Extra。
接下來(lái)的代碼片段節(jié)選自子Activity的onCreate方法,顯示了怎樣向調(diào)用的Activity返回不同的結(jié)果:
1: Button okButton = (Button) findViewById(R.id.ok_button);
2:
3: okButton.setOnClickListener(new View.OnClickListener() {
4:
5: public void onClick(View view)
6:
7: {
8:
9: Uri data = Uri.parse(“content://horses/” + selected_horse_id);
10:
11: Intent result = new Intent(null, data);
12:
13: result.putExtra(IS_INPUT_CORRECT, inputCorrect);
14:
15: result.putExtra(SELECTED_PISTOL, selectedPistol);
16:
17: setResult(RESULT_OK, result);
18:
19: finish();
20:
21: }
22:
23: });
24:
25: Button cancelButton = (Button) findViewById(R.id.cancel_button);
26:
27: cancelButton.setOnClickListener(new View.OnClickListener() {
28:
29: public void onClick(View view)
30:
31: {
32:
33: setResult(RESULT_CANCELED, null);
34:
35: finish();
36:
37: }
38:
39: });
處理子Activity的結(jié)果
當(dāng)子Activity關(guān)閉時(shí),它的父Activity的onActivityResult事件處理函數(shù)被觸發(fā)。
重寫(xiě)這個(gè)方法來(lái)處理從子Activity返回的結(jié)果。onActivityResult處理器接受好幾個(gè)參數(shù):
請(qǐng)求碼
曾經(jīng)用來(lái)啟動(dòng)子Activity的請(qǐng)求碼。
結(jié)果碼
結(jié)果碼是由子Activity設(shè)置的,用來(lái)顯示它的結(jié)果。它可以是任何整數(shù)值,但典型的值是Activity.RESULT_OK和Activity.RESULT_CANCELLED。
如果子Activity非正常關(guān)閉或在關(guān)閉時(shí)沒(méi)有指定結(jié)果碼,結(jié)果碼都是Activity.RESULT_CANCELED。
數(shù)據(jù)
一個(gè)Intent來(lái)打包任何返回的數(shù)據(jù)。依賴于子Activity的目的,它可能會(huì)包含一個(gè)代表特殊的從列表中選擇的數(shù)據(jù)的URI。可變通的,或額外的,子Activity可以使用“extras”機(jī)制以基礎(chǔ)值的方式返回臨時(shí)信息。
下面的框架代碼實(shí)現(xiàn)了一個(gè)Activity中的onActivityResult事件處理函數(shù):
1: private static final int SHOW_SUB_ACTIVITY_ONE = 1;
2:
3: private static final int SHOW_SUB_ACTIVITY_TWO = 2;
4:
5: @Override
6:
7: public void onActivityResult(int requestCode, int resultCode, Intent data) {
8:
9: super.onActivityResult(requestCode, resultCode, data);
10:
11: switch(requestCode)
12:
13: {
14:
15: case (SHOW_SUB_ACTIVITY_ONE) :
16:
17: {
18:
19: if (resultCode == Activity.RESULT_OK)
20:
21: {
22:
23: Uri horse = data.getData();
24:
25: boolean inputCorrect = data.getBooleanExtra(IS_INPUT_CORRECT, false);
26:
27: String selectedPistol = data.getStringExtra(SELECTED_PISTOL);
28:
29: }
30:
31: break;
32:
33: }
34:
35: case (SHOW_SUB_ACTIVITY_TWO) :
36:
37: {
38:
39: if (resultCode == Activity.RESULT_OK)
40:
41: {
42:
43: // TODO: Handle OK click.
44:
45: }
46:
47: break;
48:
49: }
50:
51: }
52:
53: }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。