Статьи

Android Tutorial: два метода передачи объекта по Intent (Serializable, Parcelable)

В этом посте я покажу вам простой пример того, как передать объект по назначению в приложении Android. Parcelable и Serialization используются для маршалинга и демаршалирования объектов Java. В Parcelable разработчики пишут собственный код для маршалинга и демаршалинга, поэтому он создает меньше мусорных объектов по сравнению с сериализацией. Благодаря этой пользовательской реализации производительность Parcelable по сравнению с сериализацией значительно улучшается (примерно в два раза быстрее).

Сериализация — это маркерный интерфейс, который подразумевает, что пользователь не может упорядочить данные в соответствии со своими требованиями. При сериализации операция маршалинга выполняется на виртуальной машине Java (JVM) с использованием API отражения Java. Это помогает идентифицировать элемент и поведение объектов Java, но также приводит к созданию большого количества мусорных объектов. Из-за этого процесс сериализации идет медленно по сравнению с Parcelable.

Шаг 1: main.xml для макета

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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="Hello Welcome to EasyInfoGeek." 
     /> 
 <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>

Шаг 2: Создайте Person.java, который реализует сериализуемый

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package com.easyinfogeek.objectPass; 
 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: Создайте Book.java, который реализует Parcelable

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package  com.easyinfogeek.objectPass; 
 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; 
     
 
     public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() { 
  public Book createFromParcel(Parcel source) { 
      Book mBook = new Book(); 
      mBook.bookName = source.readString(); 
      mBook.author = source.readString(); 
      mBook.publishTime = source.readInt(); 
      return mBook; 
  
  public Book[] newArray(int size) { 
      return new Book[size]; 
  
     }; 
 
     public int describeContents() { 
  return 0
     
     public void writeToParcel(Parcel parcel, int flags) { 
  parcel.writeString(bookName); 
  parcel.writeString(author); 
  parcel.writeInt(publishTime); 
     
 }

Шаг 4: Создайте ObjectPassDemo.java, который является основным классом Activity.

Еще 2 класса активности: ObjectPassDemo1.java использовать для отображения лица ObjectPassDemo2.java использовать для отображения книги

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package com.easyinfogeek.objectPass; 
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; 
    public  final static String SER_KEY = "com.easyinfogeek.objectPass.ser"
    public  final static String PAR_KEY = "com.easyinfogeek.objectPass.par"
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main);    
        setupViews(); 
 
    
 
    public void setupViews(){ 
        sButton = (Button)findViewById(R.id.button1); 
        pButton = (Button)findViewById(R.id.button2); 
        sButton.setOnClickListener(this); 
        pButton.setOnClickListener(this); 
    
 
    public void SerializeMethod(){ 
        Person mPerson = new Person(); 
        mPerson.setName("Leon"); 
        mPerson.setAge(25); 
        Intent mIntent = new Intent(this,ObjectTranDemo1.class); 
        Bundle mBundle = new Bundle(); 
        mBundle.putSerializable(SER_KEY,mPerson); 
        mIntent.putExtras(mBundle); 
 
        startActivity(mIntent); 
    
 
    public void PacelableMethod(){ 
        Book mBook = new Book(); 
        mBook.setBookName("Android Developer Guide"); 
        mBook.setAuthor("Leon"); 
        mBook.setPublishTime(2014); 
        Intent mIntent = new Intent(this,ObjectTranDemo2.class); 
        Bundle mBundle = new Bundle(); 
        mBundle.putParcelable(PAR_KEY, mBook); 
        mIntent.putExtras(mBundle); 
 
        startActivity(mIntent); 
    
 
    public void onClick(View v) { 
        if(v == sButton){ 
            SerializeMethod(); 
        }else
            PacelableMethod(); 
        
    
}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
package com.easyinfogeek.objectPass; 
 import android.app.Activity; 
 import android.os.Bundle; 
 import android.widget.TextView; 
 public class ObjectPassDemo1 extends Activity { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
 
  TextView mTextView = new TextView(this); 
  Person mPerson = (Person)getIntent().getSerializableExtra(ObjectPassDemo.SER_KEY); 
  mTextView.setText("You name is: " + mPerson.getName() + "/n"
   "You age is: " + mPerson.getAge()); 
 
  setContentView(mTextView); 
     
 }
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.easyinfogeek.objectPass; 
 import android.app.Activity; 
 import android.os.Bundle; 
 import android.widget.TextView; 
 public class ObjectPassDemo2 extends Activity { 
 
     public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  TextView mTextView = new TextView(this); 
  Book mBook = (Book)getIntent().getParcelableExtra(ObjectPassDemo.PAR_KEY); 
  mTextView.setText("Book name is: " + mBook.getBookName()+"/n"
      "Author is: " + mBook.getAuthor() + "/n"
      "PublishTime is: " + mBook.getPublishTime()); 
  setContentView(mTextView); 
     
 }

Шаг 5. Измените AndroidManifest.xml и добавьте две функции.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?> 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
       package="com.tutor.objecttran" 
       android:versionCode="1" 
       android:versionName="1.0"
     <application android:icon="@drawable/icon" android:label="@string/app_name"
  <activity android:name=".ObjectPassDemo" 
     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=".ObjectPassDemo1"></activity
  <activity android:name=".ObjectPassDemo2"></activity
     </application
     <uses-sdk android:minSdkVersion="7" /> 
 </manifest>