[Android 기초] Parcelable 사용 서열 화

6175 단어
image.png
Android 직렬 화 대상 방법:
  • Serializable 인터페이스, 자바 자체 테이프 실현;
  • Parcelable 인 터 페 이 스 를 실현 하고 안 드 로 이 드 특유 의 인터페이스 로 효율 이 Serializable 인터페이스 보다 높 으 며 Intent 데이터 전달 을 지원 하 며 크로스 프로 세 스 통신 (IPC) 에 도 사용 할 수 있 습 니 다.

  • Parcelable 인터페이스 구현 방법 절차:
    자바 실 체 는 Parcelable 인 터 페 이 스 를 실현 하고 다음 과 같은 몇 가지 방법 이 필요 합 니 다.
  • describe Contents 방법.내용 인터페이스 설명, 기본 값 으로 0 을 되 돌려 주면 됩 니 다.
  • writeToParcel 방법.이 방법 은 클래스 의 데 이 터 를 외부 에서 제공 하 는 Parcel 에 기록 합 니 다. 즉, 전달 할 데 이 터 를 Parcel 용기 에 저장 하여 parcel 용기 에서 데 이 터 를 가 져 올 수 있 도록 합 니 다. 이 방법 은 writeToParcel (Parcel dest, int flags)
  • 정적 인 Parcelable. Creator 인터페이스, 이 인 터 페 이 스 는 두 가지 방법 이 있 습 니 다.
  • createFromParcel(Parcel in)  
    // Parcel          ,   Parcelable       。
    
    newArray(int size) 
    //       T,   size   ,    (return new T[size])  。                 。
    

    데모 코드 구현
    1. Parcelable 인터페이스 구현 Person 클래스 구축
    /**
     * Created by JerryLiu on 2016/7/21.
     */
    public class Person implements Parcelable {
    
    
        private static final String TAG = "LiuDongBing";
    
        private String userName;
        private String passWord;
    
    
        public Person() {
            Log.d(TAG, "Person(): ");
        }
    
        public Person(String userName, String passWord) {
            Log.d(TAG, "Person() called with: " + "userName = [" + userName + "], passWord = [" + passWord + "]");
            this.userName = userName;
            this.passWord = passWord;
        }
    
        public String getUserName() {
            Log.d(TAG, "getUserName: = " + userName);
            return userName;
        }
    
        public void setUserName(String userName) {
            Log.d(TAG, "setUserName: = " + userName);
            Log.d(TAG, "setUserName() called with: " + "userName = [" + userName + "]");
            this.userName = userName;
        }
    
        public String getPassWord() {
            Log.d(TAG, "getPassWord: =  " + passWord);
            return passWord;
        }
    
        public void setPassWord(String passWord) {
            Log.d(TAG, "setPassWord: = passWord");
            this.passWord = passWord;
        }
    
        /**
         * Describe the kinds of special objects contained in this Parcelable's
         * marshalled representation.
         *
         * @return a bitmask indicating the set of special object types marshalled
         * by the Parcelable.
         */
        @Override
        public int describeContents() {
            Log.d(TAG, "describeContents: ");
            return 0;
        }
    
        /**
         * Flatten this object in to a Parcel.
         *
         * @param dest  The Parcel in which the object should be written.
         * @param flags Additional flags about how the object should be written.
         *              May be 0 or {@link #PARCELABLE_WRITE_RETURN_VALUE}.
         */
        @Override
        public void writeToParcel(Parcel dest, int flags) {
    
            Log.d(TAG, "writeToParcel: = " + flags);
            dest.writeString(userName);
            dest.writeString(passWord);
    
        }
    
        public static final Parcelable.Creator CREATOR = new Creator() {
            @Override
            public Person createFromParcel(Parcel source) {
                Log.d(TAG, "createFromParcel: ");
                Person person = new Person();
                person.userName = source.readString();
                person.passWord = source.readString();
                Log.d(TAG, "createFromParcel: " + "person.userName = " + person.userName
                        + "
    person.passWord" + person.passWord); LogUtils.d(person); return person; } @Override public Person[] newArray(int size) { Log.d(TAG, "newArray: size = " + size); return new Person[size]; } }; }

    2. MainActivity 에서 직렬 화
     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            bundle_btn = (Button) findViewById(R.id.button);
    
            bundle_btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent();
                    intent.setClass(MainActivity.this, SecondActivity.class);
                    Person person = new Person("LiuDongBing", "abc.1234");
                    Bundle bundle = new Bundle();
                    //Parcelable    
                    bundle.putParcelable("person", person);
                    intent.putExtras(bundle);
                    Log.d(TAG, "onClick: startActivity(intent)");
                    startActivity(intent);
                }
            });
        }
    

    3. SecondActivity 에서 역 직렬 화
     protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
    
            Intent intent = getIntent();
            Bundle extras = intent.getExtras();
            //Parcelable     
            Person person = extras.getParcelable("person");
            Log.d(TAG, "onCreate: " + "person.getUserName()" + person.getUserName()
                    + "
    person.getPassWord()" + person.getPassWord()); }

    4. 결과 인쇄
     D/LiuDongBing: Person() called with: userName = [LiuDongBing], passWord = [abc.1234]
     D/LiuDongBing: onClick: startActivity(intent)
     D/LiuDongBing: writeToParcel: = 0
     D/LiuDongBing: createFromParcel: 
     D/LiuDongBing: Person(): 
     D/LiuDongBing: createFromParcel: person.userName = LiuDongBing
                                      person.passWord = abc.1234
     D/LogUtils-/Person$1.createFromParcel(Person.java:90): Person {CREATOR =  {}, TAG = "LiuDongBing", passWord = "abc.1234", userName = "LiuDongBing"} 
     D/LiuDongBing: getUserName: = LiuDongBing
     D/LiuDongBing: getPassWord: =  abc.1234
     D/LiuDongBing: onCreate: person.getUserName()LiuDongBing
                                                                        person.getPassWord()abc.1234
    

    원본 코드 연결:https://github.com/JerrryLiu/ParceleableTest

    좋은 웹페이지 즐겨찾기