學徒淺析Android開發:第五講——Handler和Intent的是傳值流程

                在本講中,小編將想大家介紹Android中最常用的傳值方式:Handler和Intent

                Intent是爲了實現Activity之間跳轉的工具,它同樣可以進一步將某些數據傳遞到終點Activity。當然Intent的傳值是無法代替SharedPreferences的。下面,便通過代碼向大家介紹Intent功能的實現。具體的詳細解釋,小編已寫入代碼中。

             本次一共創建了三個Activity。其中TextActivity展示了普通的Intent跳轉,ExtraActivity展示了Intent如何傳遞數據。

package com.example.intentdemo;
/**
 * @author Arthur Lee
 * @time 05/26/2014
 * */
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

	private EditText et,send,receive;
	private Button bt1,bt2,bt3;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		et = (EditText)findViewById(R.id.intent_edit);
		send = (EditText)findViewById(R.id.intent_send);
		receive = (EditText)findViewById(R.id.intent_receive);
		bt1 = (Button)findViewById(R.id.intent_bt1);
		bt2 = (Button)findViewById(R.id.intent_bt2);
		bt3 = (Button)findViewById(R.id.intent_bt3);
		
		bt1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				/**
				 * Activity的切換一般是通過Intent來實現的,
				 * Intent是一個Activity到達另一個Activity的橋接者,
				 * 它描述了起點(當前Activity)和終點(目標Activity)。
				 * 一個簡單Intent實現如下:*/
				//初始化Intent變量
				Intent intent = new Intent();
				//描述當前跳轉的起點和終點
				intent = intent.setClass(MainActivity.this, TextActivity.class);
				//啓動跳轉
				startActivity(intent);
				/**
				 * 調用finish()方法,會觸發Distory(),即終止了當前Activity,
				 * 再次跳轉到當前頁面時將會是新的一頁,若想保存相關頁面信息,可使用SharedParenfences。
				 * 詳細介紹請關注第七講*/
				finish();
			}
		});
        bt2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				/**
				 * 如果我們想在Activity之間切換的過程中,
				 * 傳遞某些參數或特定的信息,
				 * 同樣也可以由Intent實現。
				 * 在Intent中將使用Bundle封裝想要傳遞的參數*/
				//初始化Intent變量
				Intent intent = new Intent();
				//描述當前跳轉的起點和終點
				intent = intent.setClass(MainActivity.this, ExtraActivity.class);
				//初始化Bundle變量
				Bundle bundle = new Bundle();
				String message = et.getText().toString().trim();
				//封裝數據到bundle中,採用K-V鍵值對的形式
				bundle.putString("message", message);
				//將封裝好數據的bundle綁定到intent上
				/**
				 *Intent的putExtra()方法專門通過鍵值對的形式綁定數據,
				 *而putExtras()方法則專門針對Bundle */
				intent.putExtras(bundle);
				//啓動跳轉
				startActivity(intent);
				/**
				 * 終點Activity的接受步驟請見ExtraActivity的第26~30行
				 * */
			}
		});
        bt3.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				//初始化Intent變量
				Intent intent = new Intent();
				//描述當前跳轉的起點和終點
				intent = intent.setClass(MainActivity.this, ExtraActivity.class);
				//初始化Bundle變量
				Bundle bundle = new Bundle();
				String message = send.getText().toString().trim();
				//封裝數據到bundle中,採用K-V鍵值對的形式
				bundle.putString("message", message);
				//將封裝好數據的bundle綁定到intent上
				intent.putExtras(bundle);
				//啓動跳轉,跳轉參數爲Intent變量和請求狀態碼requestCode
				startActivityForResult(intent,0);
			}
		});
	}

	/**
	 * 重寫onActivityResult()方法,其中的參數分別是
	 * requestCode:請求狀態碼,
	 * resultCode:反饋狀態碼,
	 * data:Intent變量*/
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		/**
		 * 對終點Activity的反饋狀態碼進行判斷*/
		switch(resultCode){
		case RESULT_OK:
			Bundle bundle = data.getExtras();
			String message = bundle.getString("message");
			receive.setText(message.toString());
			break;
		default:
			break;
		}
	}


	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

  這是Intent的無值跳轉的終點Activity:TextActivity。

package com.example.intentdemo;
/**
 * @author Arthur Lee
 * @time 05/26/2014
 * */
import android.app.Activity;
import android.os.Bundle;

public class TextActivity extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_text);
		}
}

這是Intent攜值傳送的終點Activity:ExtraActivity。

對於實現Activity之間的數據交互,即可以使用SharedPreferences,也可以使用Intent的應答交互機制,前者更爲常用,後者較少見,後者就像兩人交流一樣,有問纔有答,一問一答。小編在這裏,就只論述後者的使用方法,SharedPreferences將在第七講中詳細介紹。

小編在裏面寫了一段關於Handler傳值的小例子。

具體關於Handler的介紹,已寫入代碼。

package com.example.intentdemo;
/**
 * @author Arthur Lee
 * @time 05/26/2014
 * */
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class ExtraActivity extends Activity{

	EditText et ,send;
	Button bt,bt2;
	ProgressDialog pDialog;
	int count = 0;
	/**
	 * 對於一個APP來說,縱觀其整體,只有一個主線程,即創建之初形成的主Service,
	 * 其餘的各種Service和操作,均被視爲子線程,
	 * Android的處理流程是把複雜的任務處理工作交給子線程來完成,
	 * 然後子線程再通過Handler對象告知主線程,有主線程來更新相關頁面,從而實現完成整個操作。
	 * 主要在於相關控件的線程(子線程)並不能保證其安全性。*/
	/**
	 * 一個Handler對象可以很好地傳遞Runnable和Message,下面便舉一個進度條的小例子
	 * 講解Handler的傳值過程*/
	Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			//通過switch語句,對Message的數據進行分類處理。
			//Message的what方法即獲得傳遞回來的信息狀態碼。
			switch(msg.what){
			case 0:
				pDialog.cancel();
				break;
			case 1:
				break;
			default:
				break;	
			}
		}
		
	};
	Thread time = new Thread(){

		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
				while(count<101){
					pDialog.setProgress(count++);
					Thread.sleep(100);
				}
				/**
				 *我們無法在單獨的線程中改變當前UI的狀態,
				 *只有通過Handler向主線程傳送消息,通知主線程來改變當前UI狀態 */
				//通過sendEmptyMessage()方法傳遞一個Integer型的傳遞信息狀態碼,該狀態碼用開發者自定義的
				handler.sendEmptyMessage(0);
			}catch(Exception e){
				e.printStackTrace();
			}
		}};
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_extra);
		
		et = (EditText)findViewById(R.id.extra_edit);
		send = (EditText)findViewById(R.id.extra_send);
		bt = (Button)findViewById(R.id.extra_bt);
		bt2 = (Button)findViewById(R.id.extra_bt2);
		pDialog = new ProgressDialog(this);
		//獲取當前的Intent的變量
		Intent intent = getIntent();
		//獲取當前Intent變量中綁定的數據
		Bundle bundle = intent.getExtras();
		//判斷當前Intent是否綁定了數據
		if(!bundle.isEmpty()){
			//取出相應數值
			String message = bundle.getString("message");
			if(!"".equals(message))
			    et.setText(message);
			else
			    et.setText("沒有來自MainActivity的數值");
		}
		
		bt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				int count = 0;
				//設置進度條模式爲水平模式。
				pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
				//是夠可通過點擊頁面返回
				pDialog.setCancelable(true);
				//進度條的顯示是否不明確
				pDialog.setIndeterminate(false);
				//設計進度條的容量,可以指定爲下載文件或zip包的大小,這裏假設爲1000
				pDialog.setProgress(1000);
				pDialog.setTitle("Hnadler傳值機制");
				pDialog.setMessage("演示案例");
				pDialog.show();
				time.start();
			}
		});
        bt2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				//初始化Intent變量
				Intent intent = new Intent();
				//描述當前跳轉的起點和終點
				intent = intent.setClass(ExtraActivity.this, MainActivity.class);
				//初始化Bundle變量
				Bundle bundle = new Bundle();
				String message = send.getText().toString().trim();
				//封裝數據到bundle中,採用K-V鍵值對的形式
				bundle.putString("message", message);
				//將封裝好數據的bundle綁定到intent上
				/**
				 *Intent的putExtra()方法專門通過鍵值對的形式綁定數據,
				 *而putExtras()方法則專門針對Bundle */
				intent.putExtras(bundle);
				//啓動跳轉,跳轉參數爲Intent變量和反饋狀態碼resultCode
				ExtraActivity.this.setResult(RESULT_OK, intent);
				finish();
			}
		});
	}

	/**
	 * 重寫onActivityResult()方法,其中的參數分別是
	 * requestCode:請求狀態碼,
	 * resultCode:反饋狀態碼,
	 * data:Intent變量*/
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		/**
		 * 對始點Activity的請求狀態碼進行判斷*/
		switch(requestCode){
		case 0:
			Bundle bundle = data.getExtras();
			String message = bundle.getString("message");
			et.setText(message.toString());
			break;
		default:
			break;
		}
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

}

下面是效果圖:



最後還是以一句話結尾:我不是一名好的程序員,因爲我只會默默奉獻。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章