android的Activity直接可以進行跳轉和數據傳遞,就是通過Intent來實現的。
Intent作用有三種,第一種是啓動一個新的Activity。第二種是啓動一個新的Service。第三種是來廣播一個事件。
1.主界面main.xml放兩個按鈕。
首先定義第二個按鈕的監聽器和監聽事件:
//定義一個button2的監聽器
Button.OnClickListener button2_listener = new Button.OnClickListener() {
public void onClick(View v){
setTitle("這是在MainActivity");//觸發這個監聽器的時候,把這個activity的title設置一下
Intent intent = new Intent();//
intent.setClass(MainActivity.this, button2Activity.class);//啓動button2Activity
startActivity(intent);//啓動
}
};
Button bt2_button = (Button)findViewById(R.id.button2);//得到bt2_button對象
bt2_button.setOnClickListener(button2_listener);//設置監聽器
僅僅是啓動一個新的Activity,新的Activity界面裏又有一個button按鈕,點擊後可以再啓動一個Activity。
public class button2Activity extends ActionBarActivity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity2);
Button.OnClickListener button3_listener = new Button.OnClickListener() {
public void onClick(View v) {
// finish();//點擊按鈕,退出
Intent intent = new Intent(button2Activity.this,button3Activity.class);//啓動另一個Activity,xml文件和button3Activity.java就不具體寫了
startActivity(intent);
}
};
Button button3_button = (Button)findViewById(R.id.button3);
button3_button.setOnClickListener(button3_listener);
setTitle("現在是在activity2裏");
}
}
2.關鍵是這個例子,通過Intent實現Activity間的數據傳遞。
定義button1的點擊事件,並設置監聽器:
Button.OnClickListener button1_listener = new Button.OnClickListener() {
public void onClick(View v){
Intent intent = new Intent();
intent.setClass(MainActivity.this, button1Activity.class);
intent.putExtra("activityMain", "數據來自activityMain");//putExtra()方法是將一組名值對添加到Intent的mExtras變量裏邊。他是一個Bundle類型,類似於HashMap。當新的Activity獲取的時候,通過第一個參數字符串來獲取第二個參數。(成對的映射)
startActivityForResult(intent,REQUEST_CODE);//用這個函數啓動Activity,當新的Activity結束時,還必須執行原Activity裏的回調函數onActivityResult()。第二個參數是請求碼,請求碼大於0時,當新的Activity結束的時候,這個請求碼被返回到onActivityResult()的參數裏邊。通過請求碼不同在回調 函數裏執行不同的操作。
//startActivity(intent);//用這個函數啓動Activity的話,不需要執行回調函數,也就是不需要返回結果。
}
};
Button bt1_button = (Button)findViewById(R.id.button1);
bt1_button.setOnClickListener(button1_listener);
新的Activity界面activity1.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/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="TextView" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button4" />
</LinearLayout>
有一個Textview來顯示從主Activity傳過來的數據,還有一個按鈕button4,點擊後返回數據給主Activity。
button1Activity.java如下:
public class button1Activity extends ActionBarActivity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
Bundle extras = getIntent().getExtras();//getIntent()方法返回啓動這個Activity的Intent,這裏返回的就是MainActivity裏定義的用來啓動的intent。getExtras()方法返回這個Intent的Bundle類型的變量eExtras。這裏存儲了Intent攜帶的數據,就是從主Activity傳來的數據。
if(extras != null) {
String data = extras.getString("activityMain");//名值對 //存儲的數據是名值對存儲的,通過“activityMain”映射獲取對應的數據。
TextView textview = (TextView)findViewById(R.id.textView1);
textview.setText(data);
setTitle("現在是在Activity1裏::" +data);//顯示在title
}
Button.OnClickListener button4_listener= new Button.OnClickListener() {
public void onClick(View v) {
Bundle bundle = new Bundle();//用於在Intent中攜帶需要返回的數據,定義一下
bundle.putString("store", "數據來自Activity1");//初始化一下,名值對形式存儲,主Activity可通過“store”獲取第二個參數。
Intent intent = new Intent();//定義一個新的Intent
intent.putExtras(bundle);//把存有名值對的bundle放在Intent中
setResult(RESULT_OK,intent);//第一個參數是結果碼,第二個參數是intent
finish();//結束當前Activity,就把數據返回給主Activity了
}
};
Button button4_button = (Button)findViewById(R.id.button4);
button4_button.setOnClickListener(button4_listener);
}
}
主Activity還有個重要的回調函數處理返回結果
protected void onActivityResult(int requestCode,int resultCode,Intent data) {//處理從新Activiy返回的數據
if(requestCode == REQUEST_CODE) {//requestCode(請求碼)就是原始Intent當中的requestCode,此例是REQUEST_CODE
if(resultCode == RESULT_CANCELED) {//resultCode(結果碼)是新的Activity當中的操作是否合法,如果一切正常,那麼返回0,如果出現了什麼問題,就不會返回0。可以構造自己的值,來區分發生了什麼。
setTitle("取消");
}
else if(resultCode == RESULT_OK) {
String temp = null;
Bundle extras = data.getExtras();//Intent data就是新的Activity執行完畢返回的Intent,通過getExtras函數來獲取返回的數據
if(extras != null) {
temp = extras.getString("store");//通過名值對映射來獲取store映射的值。
}
setTitle(temp);//設置爲Title
}
}
}
最後不要忘記在AndroidMainfest.xml文件中註冊新的Activity。