1. 程式人生 > >Android元件之Activity講解

Android元件之Activity講解

       在Android系統中activity提供視覺化的使用者介面,一個Android應用通常由多個activity組成。多個activity組成了Activity棧,當前活動的Activity處於棧頂。Activity有自己的生命週期,由Android系統來控制。

       1、Activity狀態
  一般認為Activity有以下四種狀態:
  活動的:當一個Activity在棧頂,它是可視的、有焦點、可接受使用者輸入的。Android試圖盡最大可能保持它活動狀態,殺死其它Activity來確保當前活動Activity有足夠的資源可使用。當另外一個Activity被啟用,這個將會被暫停。
  暫停:在很多情況下,你的Activity可視但是它沒有焦點,換句話說它被暫停了。有可能原因是一個透明或者非全屏的Activity被啟用。在極特殊的情況下,Android將會殺死一個暫停的Activity來為活動的Activity提供充足的資源。當一個Activity變為完全隱藏,它將會變成停止。
  停止:當一個Activity不是可視的,它“停止”了。這個Activity將仍然在記憶體中儲存它所有的狀態和會員資訊。儘管如此,當其它地方需要記憶體時,它將是最有可能被釋放資源的。當一個Activity停止後,一個很重要的步驟是要儲存資料和當前UI狀態。一旦一個Activity退出或關閉了,它將變為待用狀態。

       銷燬:被系統或程序結束。

       2、Activity的建立

       建立一個Activity介面一般是繼承Activity類(當然也可以繼承ListActivity、MapActivity等),覆蓋Activity類的onCreate方法,在該方法中呼叫setContentView()方法展示要顯示的檢視,然後呼叫findViewById()方法例項化元件。注意的是必須在AndroidManifest.xml清單檔案中宣告Activity名稱才能使用。

      下面程式碼演示了在MainActivity中新增LinearLayout佈局檢視,在該檢視中新增一個按鈕和一個文字框,覆蓋Activity的onCreate()方法,在該方法中呼叫setContentView()方法展示要顯示的檢視,並呼叫findViewById()方法例項化元件。

public class MainActivity extends Activity {
	private static final String TAG = "lifecycle";
	private Button btnButton;
	private TextView tvtitle;
	//建立時呼叫
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//設定當前Activity介面佈局
		setContentView(R.layout.main);
		//通過findViewById方法獲得Button例項
		tvtitle = (TextView) findViewById(R.id.btnButton);
		//通過findViewById方法獲得Button例項
		btnButton = (Button) findViewById(R.id.btnButton);
				
	}
}
佈局檔案程式碼如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView 
        android:id="@+id/tvtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="簡單的Activity建立"
        />
    <Button 
        android:id="@+id/btnButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕"/>
</LinearLayout>
Manifest.xml清單檔案程式碼如下:
 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <!-- 宣告Activity -->
        <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>
    </application>
執行結果如下:


      3、啟動另一個Activity

像我們做Web開發一樣,經常會從一個頁面跳轉到另一個頁面。在Android中我們也經常會從一個Activity跳轉到另一個Activity做出一些處理。從一個Activity啟動另一個Activity可以使用startActivity方法或者startActivityForResult()方法。這兩個方法要傳遞的引數是Android中的另外一個非常重要的元件Intent,Intent是相同或不同元件間的信使。

      下面程式碼有兩個Activity:FirstActivity和SecondActivity。每個Activity中放置一個按鈕,FirstActivity中的按鈕響應事件跳轉到SecondActivity,SecondActivity中的按鈕響應事件跳轉到FirstActivity。

//FirstActivity.java
public class FirstActivity extends Activity {
	private Button btnButton;
	private TextView tvtitle;
	//建立時呼叫
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//設定當前Activity介面佈局
		setContentView(R.layout.main);
		//通過findViewById方法獲得Button例項
		tvtitle = (TextView) findViewById(R.id.tvtitle);
		//通過findViewById方法獲得Button例項
		btnButton = (Button) findViewById(R.id.btnButton);
		tvtitle.setText("這是FirstActivity");
		btnButton.setText("切換到SecondActivity");
		btnButton.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View arg0) {
				//顯示方式宣告Intent,直接啟動SecondActivity
				Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
				//啟動Activity
				startActivity(intent);
			}
		});
	}
}
//SecondActivity.java
public class SecondActivity extends Activity {
	private static final String TAG = "lifecycle";
	private Button btnButton;
	private TextView tvtitle;
	//建立時呼叫
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//設定當前Activity介面佈局
		setContentView(R.layout.main);
		//通過findViewById方法獲得Button例項
		tvtitle = (TextView) findViewById(R.id.tvtitle);
		//通過findViewById方法獲得Button例項
		btnButton = (Button) findViewById(R.id.btnButton);
		tvtitle.setText("這是SecondtActivity");
		btnButton.setText("切換到FirstActivity");
		btnButton.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View arg0) {
				//顯示方式宣告Intent,直接啟動SecondActivity
				Intent intent = new Intent(SecondActivity.this,FirstActivity.class);
				//啟動Activity
				startActivity(intent);
			}
		});		
	}
}
Manifest.xml清單檔案程式碼如下:
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <!-- 宣告FirstActivity -->
        <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>
        <!-- 宣告SecondtActivity -->
        <activity android:name=".SecondActivity"></activity>
    </application>
執行結果如下:

      4、Activity之間傳遞引數

在Web開發中我們經常把資料放在某個Scope中(如request、session)來實現資料共享。在Android系統中不同的Activity之間又是如何傳遞資料呢?這裡用到另外一個物件Bundle,我們將要傳遞的資訊封裝到該物件裡,並通過Intent物件傳遞到另一個Activity中。

public class FirstActivity extends Activity {
	private Button btnButton;
	private EditText etUsername;
	//建立時呼叫
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//設定當前Activity介面佈局
		setContentView(R.layout.first);
		//通過findViewById方法獲得Button例項
		btnButton = (Button) findViewById(R.id.btnButton);	
		//通過findViewById方法獲得EditText例項
		etUsername = (EditText) findViewById(R.id.etusername);
		//設定Button點選監聽器
		btnButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//獲取姓名字串
				String name = etUsername.getText().toString();
				//例項化Bundle物件
				Bundle data = new Bundle();
				//將姓名資訊新增到Bundle物件中
				data.putString("name", name);
				//例項化Intent物件
				Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
				//為Intent新增Bundle
				intent.putExtras(data);
				//啟動第二個Activity
				startActivity(intent);
			}
		});

	}
}
<pre name="code" class="java">//SecondActivity.java
public class SecondActivity extends Activity {
	private TextView tvResult;
	//建立時呼叫
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//設定當前Activity介面佈局
		setContentView(R.layout.second);
		//通過findViewById方法獲得TextView例項
		tvResult = (TextView) findViewById(R.id.tvresult);
		Map<String,String> map = new HashMap<String, String>();
		map.put("James", "123456");map.put("Jordan", "abcdef");
		map.put("Paul", "ABCDEF");
		boolean isFinded = false;
		//獲得Intent
		Intent intent = getIntent();
		//從Intent中獲得Bundle物件
		Bundle b = intent.getExtras();
		//從Bundle中獲得name
		String name = b.getString("name");
		//通過Map.entrySet遍歷key和value
		for(Map.Entry<String, String> entry : map.entrySet()){
			if(entry.getKey().equals(name)){ 
				isFinded = true; 
				tvResult.setText("\n\n\nname:"+entry.getKey()+"-----------PassWordr:"+entry.getValue());
				break;
				}
		}
		
		if(isFinded == false){
			tvResult.setText("查詢不到此人:"+name+"的資訊");
		}
	}
}

執行結果如下:

      5、啟動另一個Activity並返回結果

有時候我們需要從第一個Activity啟動第二個Activity,在第二個Activity中處理完一些業務後,需要將處理結果返回到第一個Activity中,那麼,我們就需要在第一個Activity中使用startActivityForResult()方法啟動第二個Activity。

下面通過一個例項實現從第一個Activity中要求使用者輸入使用者名稱稱,將使用者名稱稱傳遞給第二個Activity。第二個Activity通過使用者名稱稱查詢使用者的密碼,然後在第二個Activity中將密碼返回給第一個Activity,並顯示。

//FirstActivity.java
public class FirstActivity extends Activity {
	public static final int FIRSTREQUESTCODE = 0;
	private Button btnButton;
	private EditText etUsername;
	private TextView tvResult;
	//建立時呼叫
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//設定當前Activity介面佈局
		setContentView(R.layout.first);
		//通過findViewById方法獲得Button例項
		btnButton = (Button) findViewById(R.id.btnButton);	
		//通過findViewById方法獲得EditText例項
		etUsername = (EditText) findViewById(R.id.etusername);
		//通過findViewById方法獲得TextView例項
		tvResult = (TextView) findViewById(R.id.tvresult);
		//設定Button點選監聽器
		btnButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//獲取姓名字串
				String name = etUsername.getText().toString();
				//例項化Bundle物件
				Bundle data = new Bundle();
				//將姓名資訊新增到Bundle物件中
				data.putString("name", name);
				//例項化Intent物件
				Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
				//為Intent新增Bundle
				intent.putExtras(data);
				//啟動第二個Activity
				startActivityForResult(intent, FIRSTREQUESTCODE);
			}
		});

	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(FirstActivity.FIRSTREQUESTCODE == resultCode){
			//從Intent中獲得Bundle
			Bundle b = data.getExtras();
			//獲得使用者名稱和密碼
			String username = b.getString("name");
			String password = b.getString("password");
			tvResult.setText("\n\n\n返回結果:name:"+username+"-----------PassWord:"+password);
		}
	}
}
//SecondActivity .java
public class SecondActivity extends Activity {
	private TextView tvResult;
	private Button btnBack;
	private String userName;
	private String PassWord;
	//建立時呼叫
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//設定當前Activity介面佈局
		setContentView(R.layout.second);
		//通過findViewById方法獲得TextView例項
		tvResult = (TextView) findViewById(R.id.tvresult);
				
		Map<String,String> map = new HashMap<String, String>();
		map.put("James", "123456");
		map.put("Jordan", "abcdef");
		map.put("Paul",    "ABCDEF");
		
		boolean isFinded = false;
		//獲得Intent
		Intent intent = getIntent();
		//從Intent中獲得Bundle物件
		Bundle b = intent.getExtras();
		//從Bundle中獲得name
		String name = b.getString("name");
		//通過Map.entrySet遍歷key和value
		for(Map.Entry<String, String> entry : map.entrySet()){
			if(entry.getKey().equals(name)){
				 isFinded = true;
				 tvResult.setText("\n\n\n查詢結果:name:"+entry.getKey()+"-----------PassWord:"+entry.getValue());
				 userName = entry.getKey();
				 PassWord = entry.getValue();
				break;
			}
		}
		
		if(isFinded == false){
			tvResult.setText("查詢不到此人:"+name+"的資訊");
		}
		
		 //通過findViewById方法獲得Button例項
		btnBack = (Button) findViewById(R.id.btnButton);
		//設定Button點選監聽器
		btnBack.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				//獲得Intent
				Intent intent = getIntent();
				//例項化Bundle物件
				Bundle data = new Bundle();
				//從Bundle中獲得name
				data.putString("name", userName);
				data.putString("password", PassWord);
				//為Intent新增Bundle
				intent.putExtras(data);
				//設定返回結果
				SecondActivity.this.setResult(FirstActivity.FIRSTREQUESTCODE, intent);
				//結束當前Activity
				SecondActivity.this.finish();
			}
		});
	}
}
       first.xml佈局檔案程式碼如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView 
        android:id="@+id/tvtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是FirstActivity"
        />
     <TextView 
        android:id="@+id/tvusername"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="請輸入使用者名稱:"
        />
     <EditText 
         android:id="@+id/etusername"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
         />
     
    <Button 
        android:id="@+id/btnButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查詢"/>
    
        <TextView 
        android:id="@+id/tvresult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>
      second.xml佈局檔案程式碼如下所示:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView 
        android:id="@+id/tvtitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是SecondActivity"
        />
       <Button 
        android:id="@+id/btnButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="返回結果"/>
       
       <TextView 
        android:id="@+id/tvresult"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />
</LinearLayout>
執行結果如下:

相關推薦

Android元件Activity講解

       在Android系統中activity提供視覺化的使用者介面,一個Android應用通常由多個activity組成。多個activity組成了Activity棧,當前活動的Activity處於棧頂。Activity有自己的生命週期,由Android系統來控制。

Android 元件Fragment與Activity通訊小述

一、概述 本節主要介紹一下Fragment與Activity的互動方式,當然方法肯定並不是唯一的,我在這裡只是將自己平時的思路記錄一下,算是拋磚引玉 二、Fragment接收Activity傳遞的資料 我們想從Fragment內獲取它的託管Activity中的資料,這種情況我

Android--四大元件Activity(一)

####1. Activity是什麼? ####2. 生命週期 ######1). Activity跳轉 ######2). 從後臺啟動 ######3). 橫豎屏切換 ####3. 啟動模式 ######1). 任務棧 ######2). laucherMode ######3).

Android基礎——四大元件Activity

1.Activity          >概念:活動面板   應用程式元件  可以繪製Ui介面  可以和使用者進行互動     預設展示全屏  其他情況 介面比其他視窗小  懸浮在其他視窗上方     >建立一個Activity         >1,建立

Android 基礎知識——四大元件Activity(二)

今天我們來探討一下activity有什麼啟動模式,都有什麼特點呢,且看下面分析 1.Task以及back stack     >Task(任務)  為了完成一個功能  多個Activity的集合,     當你的應用程式啟動時 系統會自動建立Task用於管理Activ

Android四大元件Activity-生命週期

一. Android 四大元件包括 Activity 活動 Service 服務 Broadcast Receiver 廣播接收者 Content Provider 內容提供者 1.什麼是Activity? 使用者可與其提供的螢幕進行互動,以執行撥打電話、拍

Android四大元件Activity-啟動模式

1.Activity的啟動模式 當我們多次呼叫同一個Activity時,系統會重複建立多個例項並把它們一一放入任務棧中,這種方式顯然不符合我們的設計要求。所以Android在設計時就提供了四種啟動模式來解決此問題。 四種啟動模式分別如下: standard-標

Android 四大元件Activity的IntentFilter匹配規則小述

一、概述 本節主要介紹Activity的IntentFilter匹配規則,其是我們在隱式啟動一個Activity的過程中所用到的知識點,在這裡我就大概的介紹下,隱式啟動一個Activity需要我們的Intent能夠匹配待啟動Activity的IntentFilt

Android 四大元件Activity

Activity 是安卓四大元件之一,也是最常用最重要的元件。 四大元件:Activity、Service、Content provider、Broadcast Receiver。 通常一個Activity表示的就是一屏(也就是App的某個介面)。Activit

Android四大元件Activity

Android有四大基本元件,他們分別是: Activity Service(服務) BroadcastReceive(廣播) Content Provider(內容提供者) 這四大元件在Android開發中必不可缺,今天我們來介紹一下Activity Activi

Android 四大元件 Activity生命週期

一、 Activity 的生命週期概念 Activity 的生命週期指的是, Activity 物件從被建立到銷燬的全過程 二、 Activity 的狀態 執行狀態( Running): 該狀態表示 Activity 可見並且擁有使用者焦點; 暫停狀

Android 四大元件 Activity-帶值跳轉

從一個Activity跳轉到另外一個Activity,並且可以帶值跳轉,但我們日常生活中使用App時會經常遇到這種狀況,假設有某個介面A,點選上面不同的按鈕會啟動不同的介面B、C、D。。。,這些介面會處理某個業務並將處理結果返回給介面A,可以採用帶返回值得跳轉來

Android四大元件Activity詳解

一、Activity的生命週期: import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { /*建立Activity時被

Android 四大元件---Activity 詳解

Android Activity生命週期詳解 1. 什麼是Activity? Activity作為Android四大元件之一,它有著舉足輕重的地位,每一個Activity都會獲得一個用於繪製其使用者介面的視窗,Activity是一個v

Android面試(2):四大元件Activity---生命週期

  全文來自剛哥的《Android藝術探究》 我們這裡分成兩種情況詳細介紹: 一、正常情況下的生命週期:     所謂正常情況下的生命週期,是指在有使用者參與的情況下,Activity所經過的生命週期的改變。 二、異常情況下的生

Android四大元件ActivityActivity生命週期

      Android四大基本元件分別是Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器。      Activity作為四大元件之一,其生命週期也就是它所在的程序的生命週期。Activity生

Android開發筆記: android四大元件Activity

一,什麼是Activity? 活動Activity:一個單獨的螢幕 一個顯示的視窗 一個介面定義:用來顯示android應用的介面的一個元件!!!什麼是android元件:android應用:主要由4大元件構成元件:建立  銷燬 :一個元件從建立到銷燬的過程:生命週期不同的元

Android入門——四大元件Activity啟動模式

standrad singleTop singleTask singleInstance 在AndroidManifest.xml中通過中設定 <activity android:name=".MainActivity" android:l

Android四大元件 Activity(上)

(一)概述 本節開始講解Android的四大元件之一的Activity(活動); 官方文件: Activity是一個應用程式的元件,他在螢幕上提供了一個區域,允許使用者在上面做一些互動性的操作, 比如打電話,照相,傳送郵件,或者顯示一個地圖!Activit

Android 四大元件 Activity(2)--傳值

Activity 之間的資料傳輸 1.  Intent 直接傳值 第一個頁面傳值的方法 Intent intent = new Intent(); intent.putExtra("one", num1); intent.putEx