1. 程式人生 > >Intent傳值常用型別

Intent傳值常用型別

前言

Intent可以用來啟動Activity(startActivity(Intent))、Serveice(startService(Intent))等元件,可以用來繫結Activity和Service以建立它們之間的通訊(bindServiceConnaction(Intent,ServiceConnection,int)),可以作為Broadcast Intent傳送給廣播接收器(sendBroadcast(Intent))。

介紹

主要講解Intent如何傳值和傳遞物件?

  • Intent可以傳遞什麼型別資料?

    Intent傳遞基本資料和基本資料陣列
    Intent傳遞Parcelable物件
    Intent傳遞Serializable物件
    Intent傳遞String,Integer,CharSequence泛型集合
    Intent傳遞基本自定義物件集合

  • Intent通過什麼傳遞資料

    通過Bundle儲存資料

使用

在介面跳轉的時候,如果我們使用Inten傳遞資料,下面我們就以下這幾方便做介紹:

(1)一個Activity資料傳遞到另一個Activity

主Activity:

 //通過setFlags(int flags)方法
 Intent intent=new Intent(MainActivity.this,SecondActivity.class);
 intent.setFlags(1000);
 startActivity(intent);

第二個 Activity:

//獲得setFlag傳遞的整形資料 
int flags=getIntent().getFlags(); 
//轉化為字串 
String sFlags=String.valueOf(flags); textView.setText(sFlags);

PS:此方法只能傳遞整形的資料(一般不用於傳遞資料),常用方式: intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//用於新增額外的控制旗標

(2)通過Intent.putExtra(String name, String value)方法

主Activity:

Intent intent=new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra
("name", "zhangsan"); intent.putExtra("age", "23"); startActivity(intent);

第二個Activity:

Intent intent=getIntent();
String name=intent.getStringExtra("name");
String age=intent.getStringExtra("age");
textView.setText("name:"+name+"\nage:"+age);

PS:此方法對於沒有實現序列化介面的型別無法使用,如Integer、Double、Float、Short

(3)通過Bundle繫結資料方法(推薦使用)

主Activity:

Bundle bundle=new Bundle();
bundle.putString("name", "張三");
bundle.putInt("age", 26);
Intent intent=new Intent(MainActivity.this,ThridActivity.class);
//使用bundle傳遞資料
intent.putExtras(bundle);
startActivity(intent);

第二個Activity:

Bundle bundle=this.getIntent().getExtras();
String name=bundle.getString("name");
int age=bundle.getInt("age");
textView.setText("name:"+name+"\nage:"+age);

PS:此方法最常用。

(4)跳轉Activity返回資料到主Activity

主Activity:

Bundle bundle=new Bundle(); 
bundle.putString(“userName”, “zhangsan”); 
bundle.putInt(“userAge”, 100); 
Intent intent=new Intent(MainActivity.this,ForthActivity.class); 
intent.putExtras(bundle); 
startActivityForResult(intent, 1024);//

第二個Activity:

Intent intent=new Intent(); 
intent.putExtra(“backData”, “這是返回主Activity的資料”); 
setResult(RESULT_OK, intent);//回傳資料到主Activity 
finish(); //此方法後才能返回主Activity

主Activity接收回傳資料,重寫onActivityResult()方法:

protected void onActivityResult(int requestCode, int resultCode, 
Intent data) { 
    // TODO Auto-generated method stub 
        switch (requestCode){ 
        case 1024: 
            if(resultCode==RESULT_OK){ 
                Bundle bundle=data.getExtras(); 
                String str=bundle.getString(“backData”); 
                Toast.makeText(MainActivity.this, str, 1).show(); 
            } 
            break; 
        default: 
            break; 
}

(5)Activity傳遞物件

主Activity:

Person是一個java檔案,必須實現Serializable接口才可以使用

person=new Person();
person.setName("zhangsan");
person.setSex("male");
person.setAge(80);
Bundle bundle=new Bundle();
bundle.putSerializable("person", person);//該方法傳遞物件
//或者putParcelable(key,object)方法
Intent intent=new Intent(MainActivity.this,FiveActivity.class);
intent.putExtras(bundle);
startActivity(intent);

第二個Activity:

Intent intent=getIntent(); 
Bundle bundle=intent.getExtras(); 
Person person=(Person) bundle.getSerializable(“person”);//獲得傳遞的物件 
tv.setText(person.toString()); 
物件Person方法://要實現Serializable介面,定義變數及方法省略 
public class Person implements Serializable{ }

(6)Activity傳遞bitmap

第一個Activity:

Intent intent=new Intent();
intent.setClass(MainActivity.this, ShowActivity.class);
intent.putExtra("bitmap", bitmap);
startActivity(intent);

第二個Activity:

接受圖片的時候需要用到Parcelable

Bitmap bitmap = getIntent().getParcelableExtra("bitmap");
mIv.setImageBitmap(bitmap);

總結

  1. startActivity():跳轉到目標頁面,若想跳回當前頁面,必須再一次使用startActivity()。

  2. startActivityForResult():可一次性完成返回跳轉,Activity可接收返回資料。

  3. 可以通過Bundle傳遞物件,但傳遞的物件要實現Serializable介面。

  4. 獲取Bitmap的時候需要用到getParcelableExtra()