編輯:關於Android編程
Android中的傳遞有兩個方法,一個是Serializable,另一個是Parcelable。
Serializable是J2SE本身就支持的。而Parcelable是Android所特有的。
二者的使用場景和區別:
1)在使用內存的時候,Parcelable比Serializable性能高,所以推薦使用Parcelable。
2)Serializable在序列化的時候會產生大量的臨時變量,從而引起頻繁的GC。
3)Parcelable不能使用在要將數據存儲在磁盤上的情況,因為Parcelable不能很好的保證數據的持續性在外界有變化的情況下。盡管Serializable效率低點,但此時還是建議使用Serializable 。
Serializable接口實現比較簡單,只要實現setter和getter,就可以了。
而Parcelable實現比較麻煩些。用一個小的demo來說明:
1.新建android項目ObjectTranDemo
2.創建一個entity的javaBean:Person.java.實現Serializable接口
package com.example.objecttrandemo; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = -7060210544600464481L; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
3.創建主界面activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="android object trance" /> <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Serializable" /> <Button android:id="@+id/button2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Parcelable" /> </LinearLayout>
4.創建主activity。這個activity主要用來響應點擊事件,和傳遞數據。ObjecttranDemo.java:
package com.example.objecttrandemo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class ObjectTranDemo extends Activity implements OnClickListener{ private Button sButton,pButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setupViews(); } //initial the views public void setupViews(){ sButton = (Button)findViewById(R.id.button1); pButton = (Button)findViewById(R.id.button2); sButton.setOnClickListener(this); pButton.setOnClickListener(this); } //Serializeable object trance public void SerializeMethod(){ Person mPerson = new Person(); mPerson.setName("durant"); mPerson.setAge(25); Intent mIntent = new Intent(this,ObjectTranDemo1.class); Bundle mBundle = new Bundle(); mBundle.putSerializable("mPerson",mPerson); mIntent.putExtras(mBundle); startActivity(mIntent); } //Pacelable object trance public void PacelableMethod(){ Book mBook = new Book(); mBook.setBookName("a man from mars"); mBook.setAuthor("james"); mBook.setPublishTime(2014); Intent mIntent = new Intent(this,ObjectTranDemo2.class); Bundle mBundle = new Bundle(); mBundle.putParcelable("mBook", mBook); mIntent.putExtras(mBundle); startActivity(mIntent); } @Override public void onClick(View v) { if(v == sButton){ SerializeMethod(); }else{ PacelableMethod(); } } }
5.新建activity ObjectTranDemo1.java用來顯示Serializable接口傳遞過來的數據
package com.example.objecttrandemo; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class ObjectTranDemo1 extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView mTextView = new TextView(this); Person mPerson = (Person)getIntent().getSerializableExtra("mPerson"); mTextView.setText("You name is: " + mPerson.getName() + "\n"+ "You age is: " + mPerson.getAge()); setContentView(mTextView); } }
至此,Serializable接口傳遞數據完畢,對了,別忘了,在Mainfest.xml文件中聲明新的activity
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.objecttrandemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.objecttrandemo.ObjectTranDemo" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ObjectTranDemo1"></activity> <activity android:name=".ObjectTranDemo2"></activity> </application> </manifest>
下面看Parcelable的傳遞:
實現Parcelable一般需要4個步驟:
1)implements Parcelable
2)重寫writeToParcel方法,將你的對象序列化為一個Parcel對象,即:將類的數據寫入外部提供的Parcel中,打包需要傳遞的數據到Parcel容器保存,以便從 Parcel容器獲取數據
3)重寫describeContents方法,內容接口描述,默認返回0就可以
4)實例化靜態內部對象CREATOR實現接口Parcelable.Creator
public static final Parcelable.Creator<T> CREATOR
注:其中public static final一個都不能少,內部對象CREATOR的名稱也不能改變,必須全部大寫。需重寫本接口中的兩個方法:createFromParcel(Parcel in) 實現從Parcel容器中讀取傳遞數據值,封裝成Parcelable對象返回邏輯層,newArray(int size) 創建一個類型為T,長度為size的數組,僅一句話即可(return new T[size]),供外部類反序列化本類數組使用。
簡而言之:通過writeToParcel將你的對象映射成Parcel對象,再通過createFromParcel將Parcel對象映射成你的對象。也可以將Parcel看成是一個流,通過writeToParcel把對象寫到流裡面,在通過createFromParcel從流裡讀取對象,只不過這個過程需要你來實現,因此寫的順序和讀的順序必須一致。
具體:
1.新建Book的實體類:
Book.java:
package com.example.objecttrandemo; import android.os.Parcel; import android.os.Parcelable; public class Book implements Parcelable{ private String bookName; private String author; private int publishTime; public String getBookName() { return bookName; } public void setBookName(String bookName) { this.bookName = bookName; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getPublishTime() { return publishTime; } public void setPublishTime(int publishTime) { this.publishTime = publishTime; } //Internal Description Interface,You do not need to manage @Override public int describeContents() { return 0; } //give some attention to the oder betwwen writeToParcel and createFromParcel @Override public void writeToParcel(Parcel parcel, int flags){ parcel.writeString(bookName); parcel.writeString(author); parcel.writeInt(publishTime); } public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { @Override public Book[] newArray(int size) { return new Book[size]; } @Override public Book createFromParcel(Parcel source) { Book mBook = new Book(); mBook.bookName = source.readString(); mBook.author = source.readString(); mBook.publishTime = source.readInt(); return mBook; } }; }
2.新建activity :ObjectTranDemo2.java.用來顯示parcelable的數據:
package com.example.objecttrandemo; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class ObjectTranDemo2 extends Activity{ public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView mTextView = new TextView(this); Book mBook = (Book)getIntent().getParcelableExtra("mBook"); mTextView.setText("Book name is: " + mBook.getBookName()+"\n"+ "Author is: " + mBook.getAuthor() + "\n" + "PublishTime is: " + mBook.getPublishTime()); setContentView(mTextView); } }
在上篇文章給大家介紹了,Intent傳遞對象之Serializable和Parcelable的區別,感興趣的朋友可以點擊了解詳情。
近來回顧了一下關於Activity的生命周期,參看了相關書籍和官方文檔,也有了不小的收獲,對於以前的認知有了很大程度上的改善,在這裡和大家分享一下。熟悉javaEE的朋友
前言在Android中使用 MVP 來開發已經出來很久了,剛好Google又出了一系列的architecture samples,在此就整理一下對於MVP的認知和實踐總結
先給大家展示下效果圖,大家覺效果滿意,請參考實現代碼。直接上代碼:private void setDialog(){View view = getLayoutInflat
最近項目上有需求 ,要求狀態欄透明化 。還有需求是拖動狀態欄標題一下的內容,標題欄的顏色要變化 。這裡所謂的既是狀態欄著色,也是我們經常聽到的沉浸式狀態欄,關於沉浸式的稱