亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android intent之間復雜參數傳遞方法詳解

2019-10-23 20:08:54
字體:
來源:轉載
供稿:網友

本文詳細講述了Android intent之間復雜參數傳遞方法。分享給大家供大家參考,具體如下:

Intent是Activity與Activity之間,Activity與Service之間傳遞參數的介質,而這兩種通常實現的是Java基本對象類型和String的傳遞。
在實際項目中,頁面之間傳值,除了以上幾種,經常還有傳遞Object對象、List類型、List<Object>類型和全局變量等等的需求。本文就是介紹怎么傳遞這幾種類型的參數。

一、傳遞List<String>和List<Integer>

以下以傳遞List<String>為例,發送List<String>語法為:

intent.putStringArrayListExtra(key, list);

接收List<String>的語法為:

list = (ArrayList<String>)getIntent().getStringArrayListExtra(key);

以下是一個運用實例:

// =============發送List<String>=============ArrayList<String> stringList = new ArrayList<String>();stringList.add("string1");stringList.add("string2");stringList.add("string3");Intent intent = new Intent();intent.setClass(ListDemoActivity.this, StringListActivity.class);intent.putStringArrayListExtra("ListString", stringList);startActivity(intent);// ====================接收List<String>======================ArrayList<String> stringList = (ArrayList<String>) getIntent().getStringArrayListExtra("ListString");

List<Integer>類似以上的操作調用下面的方法也可以實現發送和接收:

intent.putIntegerArrayListExtra(key, list);list =(ArrayList<Integer>) getIntent().getIntegerArrayListExtra(key);

二、使用Serializable和Parcelable兩種方式傳遞Object

Android的Intent之間傳遞對象有兩種方法,一種是Bundle.putSerializable(Key,Object);另一種是Bundle.putParcelable(Key,Object)。方法中的Object要滿足一定的條件,前者實現了Serializable接口,而后者實現了Parcelable接口。

以下是實現了Serializable接口的User類,命名為SerializableUser純粹是從類名方便區分實現了Parcelable接口的User類,實際開發中不建議這么命名:

public class SerializableUser implements Serializable {  private String userName;  private String password;  public SerializableUser() {  }  public SerializableUser(String userName, String password) {    this.userName = userName;    this.password = password;  }  public String getUserName() {    return userName;  }  public void setUserName(String userName) {    this.userName = userName;  }  public String getPassword() {    return password;  }  public void setPassword(String password) {    this.password = password;  }}

以下是實現了Parcelable接口的User類:

public class ParcelableUser implements Parcelable {  private String userName;  private String password;  public ParcelableUser() {  }  public ParcelableUser(String userName, String password) {    this.userName = userName;    this.password = password;  }  public String getUserName() {    return userName;  }  public void setUserName(String userName) {    this.userName = userName;  }  public String getPassword() {    return password;  }  public void setPassword(String password) {    this.password = password;  }  public static final Parcelable.Creator<ParcelableUser> CREATOR = new Creator<ParcelableUser>() {    @Override    public ParcelableUser createFromParcel(Parcel source) {      ParcelableUser parcelableUser = new ParcelableUser();      parcelableUser.userName = source.readString();      parcelableUser.password = source.readString();      return parcelableUser;    }    @Override    public ParcelableUser[] newArray(int size) {      return new ParcelableUser[size];    }  };  @Override  public int describeContents() {    // TODO Auto-generated method stub    return 0;  }  @Override  public void writeToParcel(Parcel dest, int flags) {    // TODO Auto-generated method stub    dest.writeString(userName);    dest.writeString(password);  }}

使用兩種方式傳遞的語法分別為:

bundle.putSerializable(key,object);bundle.putParcelable(key,object);

使用兩種方式接收的語法分別為:

object=(Object) getIntent().getSerializableExtra(key);object=(Object) getIntent().getParcelableExtra(key);
// ==========分別使用Serializable和Parcelable發送Object===============SerializableUser serializableUser = new SerializableUser("user1", "123456");ParcelableUser parcelableUser = new ParcelableUser("user2","654321");Intent intent = new Intent();Bundle bundle = new Bundle();bundle.putSerializable("serializableUser", serializableUser);bundle.putParcelable("parcelableUser", parcelableUser);intent.setClass(ListDemoActivity.this,ObjectActivity.class);intent.putExtras(bundle);startActivity(intent);// ====================接收Object======================SerializableUser serializableUser = (SerializableUser) getIntent().getSerializableExtra("serializableUser");ParcelableUser parcelableUser = (ParcelableUser) getIntent().getParcelableExtra("parcelableUser");

可能有人注意到,實現Serializable接口就是把對象序列化,然后再傳輸,和Java的常用編程沒什么明顯區別,而且User不需要明顯改變,比較簡單。我也推薦用這種方式。

然而,后一種實現Parcelable接口的類比較復雜,Parcelable是個什么東西呢?

Android提供了一種新的類型:Parcel,被用作封裝數據的容器,封裝后的數據可以通過Intent或IPC傳遞。 除了基本類型以外,只有實現了Parcelable接口的類才能被放入Parcel中。

實現Parcelable接口需要實現三個方法:

1)writeToParcel 方法。該方法將類的數據寫入外部提供的Parcel中。
聲明:writeToParcel (Parcel dest, int flags)。

2)describeContents方法。直接返回0就可以。

3)靜態的Parcelable.Creator<T>接口,本接口有兩個方法:

createFromParcel(Parcel in) 實現從in中創建出類的實例的功能。
newArray(int size) 創建一個類型為T,長度為size的數組, returnnew T[size];即可。本方法是供外部類反序列化本類數組使用。

通過log測試輸出可知程序的運行情況,在bundle.putParcelable("parcelableUser", parcelableUser);時,調用了ParcelableUser類中的publicvoid writeToParcel(Parcel dest, int flags)方法,并向dest寫數據,在 ParcelableUserparcelableUser= (ParcelableUser)getIntent().getParcelableExtra("parcelableUser");的時候,調用了ParcelableUser類中的public ParcelableUsercreateFromParcel(Parcel source) 方法,創建了一個ParcelableUser對象,并給這個對象的屬性賦值,這里的Parcel source和Parcel dest是相同的,然后返回這個ParcelableUser對象。最后就可以打印出parcelableUser的屬性信息了。

三、傳遞List<Object>

如果我們要傳遞的是Object組成的List列表,即List<Object>,該怎么辦呢?首先需要將Object對象實現Serializable接口,然后把list強制類型轉換成Serializable類型,最后通過:

Intent.putExtra(key, (Serializable)objectList);

這樣的語法來傳遞,接收方在接收的時候也需要強制類型轉換成List<Object>,接收 List<Object>使用的語法是:

objectList= (List<Object>) getIntent().getSerializableExtra(key);

以下是一個應用實例,這里使用的SerializableUser類在上一步有給出,這里就不再重復給出。

// ==============發送List<Object>===========SerializableUser user1 = new SerializableUser("user1", "123456");SerializableUser user2 = new SerializableUser("user2", "654321");List<SerializableUser> objectList = new ArrayList<SerializableUser>();objectList.add(user1);objectList.add(user2);Intent intent = new Intent();intent.setClass(ListDemoActivity.this, ObjectListActivity.class);intent.putExtra("ListObject", (Serializable) objectList);startActivity(intent);// ====================接收List<Object>======================List<SerializableUser> objectList = (List<SerializableUser>) getIntent().getSerializableExtra("ListObject");

四、全局變量

如果一些特殊的應用級別的參數,不方便使用intent來傳遞參數,我們很容易想到是不是有全局變量或靜態變量可以使用?Java中的靜態變量在這里是適合的,但其值在Activity調用了System.exit(0)或finish()后就丟失了。

而在android中有個更優雅的方式是使用ApplicationContext。這種全局變量方法相對靜態類更有保障,直到應用的所有Activity全部被destory掉之后才會被釋放掉。

Android的SDK中有說道,Application是用來保存全局變量的,并且是在package創建的時候就存在了。所以當我們需要創建全局變量的時候,不需要再像J2SE那樣需要創建public權限的static變量,而直接在application中去實現。只需要調用Context的 getApplicationContext或者Activity的getApplication方法來獲得一個Application對象,就可以設置或讀取全局變量的值。

啟動Application時,系統會創建一個PID,即進程ID,所有的Activity就會在此進程上運行。那么我們在Application創建的時候初始化全局變量,同一個應用的所有Activity都可以取到這些全局變量的值,換句話說,我們在某一個Activity中改變了這些全局變量的值,那么在同一個應用的其他Activity中值就會改變。

用法:

1. 創建一個屬于你自己的android.app.Application的子類,為想要共享的private全局變量增加setter和getter方法。

public class MyApp extends Application{  private String globalVariable;  public String getGlobalVariable() {    return globalVariable;  }  public void setGlobalVariable(String globalVariable) {    this.globalVariable = globalVariable;  }}

2. 在manifest中申明一下這個類,這時Android就為此建立一個全局可用的實例。

其實就是在原來僅有的一個application標簽上為application制定一個名字為這個全局實例。

 

復制代碼 代碼如下:
<application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name">

 

3. 可以在其他任何地方使用Context.getApplicationContext()方法獲取這個實例,進而獲取其中的狀態(變量)。

// ============使用全局變量傳遞參數==============MyApp myApp = ((MyApp) getApplicationContext());//獲得我們的應用程序MyAppmyApp.setGlobalVariable("全局變量");Intent intent = new Intent();intent.setClass(ListDemoActivity.this, GlobalActivity.class);startActivity(intent);// ============接收全局變量的參數==============MyApp myApp = ((MyApp) getApplicationContext());String globalVariable = myApp.getGlobalVariable();

希望本文所述對大家Android程序設計有所幫助。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一区在线直播| 亚洲激情久久久| 欧美日韩精品在线观看| 色噜噜狠狠色综合网图区| 国产精品久久久久久久久久ktv| 91亚洲午夜在线| 亚洲电影免费观看高清完整版在线| 91成品人片a无限观看| 亚洲精品国产综合久久| 国产亚洲精品久久久久久777| 欧美国产日韩一区二区三区| 欧美日韩日本国产| 国产成人精品一区二区在线| 亚洲一区二区福利| 亚洲精品按摩视频| 日本电影亚洲天堂| 国产综合久久久久久| 亚洲欧洲自拍偷拍| 久久中文字幕视频| 91极品视频在线| 深夜福利亚洲导航| 亚洲欧美日韩高清| 福利一区福利二区微拍刺激| 91av免费观看91av精品在线| 日韩av男人的天堂| 91九色单男在线观看| 永久555www成人免费| 亚洲最大福利网| 国产精品看片资源| 国产精品一区二区久久国产| 欧美亚洲国产日韩2020| 91wwwcom在线观看| 久久99久国产精品黄毛片入口| 亚洲一区av在线播放| 日韩成人在线观看| 欧美体内谢she精2性欧美| 国产97在线|亚洲| 国产成人精品视频| 久久91亚洲人成电影网站| 96精品久久久久中文字幕| 欧美精品成人91久久久久久久| 亚洲精品www久久久| 亚洲第一免费播放区| 中文字幕不卡在线视频极品| 亚洲跨种族黑人xxx| 九九热视频这里只有精品| 欧美中文在线免费| 91亚洲午夜在线| 久久免费观看视频| 91在线精品播放| 亚洲精品国产精品久久清纯直播| 欧亚精品在线观看| 91免费版网站入口| 日韩欧美一区二区三区| 国产精品一区二区三区在线播放| 色一区av在线| 成人网页在线免费观看| 欧美激情网友自拍| 亚洲精品电影在线| 欧美性色19p| 欧美亚洲另类制服自拍| 91av在线网站| 国产亚洲精品日韩| 亚洲成人精品视频在线观看| 欧美亚洲免费电影| 国产91成人在在线播放| 亚洲另类激情图| 日韩在线观看免费高清完整版| 在线播放亚洲激情| 日本精品久久久久影院| 亚洲精品二三区| 黑丝美女久久久| 欧美电影免费播放| 欧美性猛交99久久久久99按摩| 久久人91精品久久久久久不卡| 日本午夜在线亚洲.国产| 国产精品国内视频| 日韩美女视频在线观看| 国产欧洲精品视频| 97超碰蝌蚪网人人做人人爽| 久久久精品在线观看| 亚洲**2019国产| 国产成人综合av| 4438全国亚洲精品在线观看视频| 欧美人成在线视频| 日韩电影中文字幕一区| 国产精品视频不卡| 高清一区二区三区日本久| 中文在线资源观看视频网站免费不卡| 成人xxxx视频| 海角国产乱辈乱精品视频| 久久福利视频导航| 中文字幕欧美国内| 国产一区二区视频在线观看| 亚洲石原莉奈一区二区在线观看| 成人免费在线视频网站| 成人久久18免费网站图片| 岛国视频午夜一区免费在线观看| 国产一区二区三区欧美| 亚洲色图色老头| 欧美日韩激情网| 国语自产精品视频在线看抢先版图片| 国产精品久久久久久久午夜| 久久精品久久久久| 精品国产鲁一鲁一区二区张丽| 日韩一区二区三区国产| 亚洲精品福利资源站| 国产欧美久久一区二区| 久久久久久久久久久免费精品| 91九色单男在线观看| 国产日韩在线亚洲字幕中文| 欧美精品久久久久久久久久| 国产精品久久久久久婷婷天堂| 91精品国产精品| 亚洲第一男人av| 高清日韩电视剧大全免费播放在线观看| 日韩中文字幕视频在线观看| 中文.日本.精品| 欧美激情国产精品| 亲子乱一区二区三区电影| 亚洲bt天天射| 97视频在线观看网址| 欧美日本啪啪无遮挡网站| 国产精品18久久久久久首页狼| 欧美午夜激情视频| 亚洲欧美在线磁力| 亚洲国产另类久久精品| 久久久久国色av免费观看性色| 日韩女优人人人人射在线视频| 欧美成人黄色小视频| 亚洲va久久久噜噜噜| 精品国产依人香蕉在线精品| 精品成人69xx.xyz| 久久人人爽人人爽人人片av高请| 亚洲欧美一区二区精品久久久| 国产精品视频一| 高清在线视频日韩欧美| 日韩va亚洲va欧洲va国产| 久久天天躁狠狠躁老女人| 精品久久久久久久久久| 国产国语刺激对白av不卡| 91精品久久久久久久| 久久亚洲精品中文字幕冲田杏梨| 国产九九精品视频| 国产啪精品视频| 欧美激情欧美狂野欧美精品| 精品中文字幕久久久久久| 亚洲欧美日韩高清| 精品久久久一区| 亚洲网在线观看| 国语自产精品视频在线看抢先版图片| 久久国产精品久久久| 欧美韩国理论所午夜片917电影| 日韩欧美在线视频免费观看| 欧美日韩电影在线观看| 久久免费在线观看| 欧美成人午夜剧场免费观看| 成人免费淫片aa视频免费| 日韩欧美在线免费观看| 国产精品第二页| 欧美激情视频在线| 久久人人爽人人爽人人片av高清| 亚洲r级在线观看| 久久全球大尺度高清视频|