在本講中,小編將想大家介紹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;
}
}
下面是效果圖:
最後還是以一句話結尾:我不是一名好的程序員,因爲我只會默默奉獻。