本文主要內(nèi)容
Activity的生命周期大年、通信方式、Intent Filter
【Activity】
一個Activity是一個應(yīng)用程序組件玉雾,提供一個屏幕翔试,用戶可以用來交互為了完成某項任務(wù)。每個activity被給予一個窗口复旬,在上面可以繪制用戶接口垦缅。
一個應(yīng)用程序通常由多個Activity組成,他們通常是松耦合關(guān)系驹碍。通常壁涎,一個應(yīng)用程序中的activity被指定為“main activity”。
【Activity生命周期】
在android.app.Activity類中志秃,Android定義了一系列與生命周期相關(guān)的方法怔球,在我們自己的Activity中,只是根據(jù)需要覆寫需要方法浮还,java的多態(tài)性會保證我們自己的方法被虛擬機調(diào)用竟坛。
protected void onCreate(Bundle savedInstanceState);一個Activity的實例被啟動時調(diào)用的第一個方法。一般情況下钧舌,我們都覆蓋該方法作為應(yīng)用程序的一個入口點担汤,在這里做一些初始化數(shù)據(jù),設(shè)置用戶界面等工作洼冻。大多數(shù)情況下漫试,我們都要在這里從XML中加載設(shè)計好的用戶界面。例如:
setContentView(R.layout.main);
當(dāng)然碘赖,也可從savedInstanceState中讀我們保存到存儲設(shè)備中的數(shù)據(jù)驾荣,但是需要判斷savedInstanceState是否為null,因為Activity第一次啟動時并沒有數(shù)據(jù)被存貯在設(shè)備中:
if(savedInstanceState ! = null){
savedInstanceState.get("key");
}
protected void onStart()該方法在onCreate方法之后被調(diào)用普泡,或者在Activity從Stop狀態(tài)轉(zhuǎn)換為Active狀態(tài)時被調(diào)用播掷。
protected void onResume()在Activity從Pause狀態(tài)轉(zhuǎn)換到Active狀態(tài)時被調(diào)用
protected void onPause()在Activity從Active狀態(tài)轉(zhuǎn)換到Pause狀態(tài)時被調(diào)用。
protected void onStop()在Activity從Active狀態(tài)轉(zhuǎn)換到Stop狀態(tài)時被調(diào)用撼班。一般我們在這里保存Activity的狀態(tài)信息歧匈。
protected void onDestroy()在Activity被結(jié)束時調(diào)用,它是被結(jié)束時調(diào)用的最后一個方法砰嘁,這里一般做些釋放資源件炉,清理內(nèi)存等工作勘究。
此外,Android還定義了一些不常用的與生命周期相關(guān)的方法可用:
protected void onPostCreate(Bundle savedInstanceState);
protected void onRestart();
protected void onPostResume();
【Create an Activity】
創(chuàng)建一個activity斟冕,你必須創(chuàng)建一個Activity的子類(或者一個Activity的子類的子類)口糕。編寫一個繼承自 android.app.Activity的 Java 類并在 AndroidManifest.xml聲明即可。在你的子類中磕蛇,你需要實現(xiàn)系統(tǒng)回調(diào)的回調(diào)方法景描。當(dāng)activity在它的生命周期的多種狀態(tài)中轉(zhuǎn)換的時候,例如當(dāng)activity被創(chuàng)建秀撇、停止超棺、恢復(fù)或摧毀。兩個最重要的回調(diào)方法是:
onCreate()
onCreate()函數(shù)是在Activity初始化的時候調(diào)用的呵燕,通常情況下棠绘,我們需要在onCreate()中調(diào)用setContentView(int)函數(shù)填充屏幕的UI,一般通過findViewById(int)返回XML中定義的視圖或組件的ID再扭。子類在重寫onCreate()方法的時候氧苍,必須調(diào)用父類的onCreate()方法,即super.onCreate()霍衫,否則會拋出異常。
onCreate()里面耗時長的話可能導(dǎo)致極差的用戶體驗侯养。需要注意:
(1)在Activity啟動前敦跌,盡量少做。
(2)對于布局比較復(fù)雜的時候逛揩,可以考慮不要一次性全部加載上柠傍,動態(tài)加載是一個好的辦法。
(3)對于及時需要的數(shù)據(jù)辩稽,加載起來耗時的又有異常危險的惧笛,一定記得開辟一個線程來做這些動作,千萬記得不要做阻塞主線程(UI線程)的任何事情逞泄。
(4)對于特殊情況下患整,Activity啟動確實需要大量工作時候,可以考慮先加載一個簡單的布局(或是Activity)來過渡.喷众。
(5)所有的目的都是讓你要啟動的組件盡快上場各谚,而不是以畫好妝為主,這樣的話客人會等不及的到千,顧客就是上帝昌渤。
onPause()
系統(tǒng)調(diào)用這個方法當(dāng)用戶離開你的activity。這通常是你應(yīng)該提交任何變化憔四。
Implementing a user interface
一個activity的用戶接口被一個層次化的視圖提供——繼承于View類的對象膀息。每個View控制activity窗口中的一個特定矩形區(qū)域并且能影響應(yīng)用用戶交互般眉。
Android提供了大量預(yù)定義的view,你可以用來設(shè)計和組建你的布局潜支。你可以子類化View和ViewGroup類來創(chuàng)建自己的widget.
最普通的方法是定義一個布局使用view加上XML布局文件保存在你的程序資源里甸赃。這樣,你可以單獨維護你的用戶接口設(shè)計毁腿,而與定義activity行為的代碼無關(guān)辑奈。你可以設(shè)置布局作為UI使用setContentView(),傳遞資源布局的資源ID已烤○埃可以,你也可以創(chuàng)建新Views在你的activity代碼胯究,并且創(chuàng)建一個view層次通過插入新Views到ViewGroup稍计,然后使用那個布局通過傳遞到根ViewGroup給setContentView().
Declaring the activity in the manifest
你必須聲明你的activity在manifest文件為了它可以被系統(tǒng)訪問。要聲明你的activity裕循,打開你的manifest文件臣嚣,添加一個<activity>元素作為<application>元素的子元素。
【using intent filters】
一個<activity>元素也能指定多種intent filters——使用<intent-filter>元素——為了聲明其它應(yīng)用程序可以激活它剥哑。
當(dāng)你創(chuàng)建一個新的應(yīng)用程序使用Android SDK工具硅则,存根activity自動為你創(chuàng)建,包含一個intent filter,聲明了activity響應(yīng)"main"動作株婴,并且應(yīng)該被放置在“l(fā)auncher”分類怎虫。Intent filter看起來像這個樣子。
<activity android:name=".EX01" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<action>元素指定這是一個"main"入口點對這個應(yīng)用程序困介。<category>元素指定大审,這個activity應(yīng)該被列入系統(tǒng)應(yīng)用程序列表中(為了允許用戶啟動這個activity)。
【啟動另外一個Activity】
Activity.startActivity()方法可以根據(jù)傳入的參數(shù)啟動另外一個Activity:
Intent intent = new Intent(CurrentActivity.this, OtherActivity.class);
startActivity(intent);
當(dāng)然座哩,OtherActivity同樣需要在AndroidManifest.xml中定義
Activity之間的通信
使用Intent通信
在Android中徒扶,不同的Activity實例可能運行在一個進程中,也可能運行在不同的進程中根穷。因此我們需要一種特別的機制幫助我們在Activity之間傳遞消息姜骡。Android中通過Intent對象來表示一條消息,一個Intent對象不僅包含有這個消息的目的地屿良,還可以包含消息的內(nèi)容溶浴。對于一個Intent對象,消息的“目的地”是必須的管引,而內(nèi)容則是可選的士败。
在上面的實例中通過Activity.startActivity(intent)啟動另外一個Activity的時候,我們在Intent類的構(gòu)造器中指定了“目的地”。
如果需要添加消息谅将,可通過如下方式:
Intent intent = new Intent(CurrentActivity.this, OtherActivity.class);
//創(chuàng)建一個帶“收件人地址”的email
Bundle = bundle = new Bundle();//創(chuàng)建email內(nèi)容
bundle.putBoolean("boolean_key",true);//編寫內(nèi)容
bundle.putString("string_key","string_value");
intent.putExtra("key",bundle); //封裝email
startActivity(intent);//啟動新的Activity
那么“收件人”該如何收信呢漾狼?在OtherActivity類的onCreate()或者其它任何地方使用下面的代碼
Intent = intent = getIntent();//收取email
Bundle bundle = intent.getBundleExtra("key");//打開email
bundle.getBoolean("boolean_key");//讀取內(nèi)容
bundle.getString("String_key");
上面我們通過 bundle對象來傳遞信息,bundle維護了一個 HashMap<String, Object>對象饥臂,將我們的數(shù)據(jù)存貯在這個 HashMap 中來進行傳遞焕檬。但是像上面這樣的代碼稍顯復(fù)雜誉简,因為 Intent 內(nèi)部為我們準備好了一個 bundle,所以我們也可以使用這種更為簡便的方法:
Intent intent =new Intent(EX06.this,OtherActivity.class);
intent.putExtra("boolean_key", true);
intent.putExtra("string_key", "string_value");
startActivity(intent);
接收:
Intent intent=getIntent();
intent.getBooleanExtra("boolean_key",false);
intent.getStringExtra("string_key");
使用SharedPreferences
SharedPreferences 使用 xml 格式為 Android 應(yīng)用提供一種永久的數(shù)據(jù)存貯方式。對于一個 Android 應(yīng)用富玷,它存貯在文件系統(tǒng)的 /data/ data/your_app_package_name/shared_prefs/目錄下耘斩,可以被處在同一個應(yīng)用中的所有 Activity 訪問磁携。Android 提供了相關(guān)的 API 來處理這些數(shù)據(jù)而不需要程序員直接操作這些文件或者考慮數(shù)據(jù)同步問題酌摇。
// 寫入 SharedPreferences
SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE);
Editor editor = preferences.edit();
editor.putBoolean("boolean_key", true);
editor.putString("string_key", "string_value");
editor.commit();
// 讀取 SharedPreferences
SharedPreferences preferences = getSharedPreferences("name", MODE_PRIVATE);
preferences.getBoolean("boolean_key", false);
preferences.getString("string_key", "default_value");
其它方式
Android 提供了包括 SharedPreferences 在內(nèi)的很多種數(shù)據(jù)存貯方式,比如 SQLite驰坊,文件等匾二,程序員可以通過這些 API 實現(xiàn) Activity 之間的數(shù)據(jù)交換。如果必要拳芙,我們還可以使用 IPC 方式察藐。
Activity的Intent Filter
Intent Filter描述了一個組件愿意接收什么樣的Intent對象,Android將其抽樣為android.content.IntentFilter類舟扎。在Android的AndrdoiManifest.xml配置文件中可以通過<intent-filter>節(jié)點為一個Activity指定其Intent Filter分飞,以便告訴系統(tǒng)該Activity可以響應(yīng)什么類型的Intent。
當(dāng)程序員使用startActivity(intent)來啟動另外一個Activity時睹限,如果直接指定intent對象的Component屬性譬猫,那么Activity Manager將試圖啟動其Component屬性指定的Activity。否則Android將通過Intent的其他屬性從安裝在系統(tǒng)中的所有Activity中查找與之最匹配的一個啟動邦泄,如果沒有找到合適的Activity删窒,應(yīng)用程序會得到一個系統(tǒng)拋出的異常裂垦。這個匹配的過程如下:
- 加載安裝的所有Intent Filter到一個列表中
- 剔除Action匹配失效的Intent Filter
- 剔除URI數(shù)據(jù)匹配失效的Intent Filter
- 剔除Category匹配失效的Intent Filter
余下的Intent Filter數(shù)量是否為0
如果不為0顺囊,將匹配成功的Intent Filter按優(yōu)先級排序,返回最高優(yōu)先級的Intent Filter蕉拢;否則查找失敗特碳,拋出異常。
Action匹配
Action是一個用戶定義的字符串晕换,用于描述一個Android應(yīng)用程序組件午乓,一個Intent Filter可以包含多個Action。Activity定義時可以在其<intent-filter>節(jié)點指定一個Action列表用于標示Activity所能接受的“動作”闸准,例如:
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<action android:name="com.zy.myaction" />
……
</intent-filter>
如果我們在啟動一個Activity時使用中這樣的Intent對象:
Intent intent = new Intent();
intent.setAction("com.zy.myaction");
那么所有的Action列表中包含了“com.zy.myaction”的Activity都將會匹配成功益愈。
Android 預(yù)定義了一系列的Action分別表示特定的系統(tǒng)動作。這些Action通過常量的方式定義在android.content.Intent中,以“ACTION_”開始蒸其,我們可以在Android提供的文檔中找到他們的詳細說明敏释。
URI匹配
一個Intent可以通過URI攜帶外部數(shù)據(jù)給目標組件。在<intent-filter>節(jié)點中摸袁,通過<data/>節(jié)點匹配外部數(shù)據(jù)钥顽。
mimeType 屬性指定攜帶外部數(shù)據(jù)的數(shù)據(jù)類型,scheme指定協(xié)議靠汁,host,port,path指定數(shù)據(jù)的位置蜂大、端口、和路徑蝶怔。如下:
<data android:mimeType = "mimeType" android:scheme = "scheme"
android:host = "host" android:port = "port" android:path = "path"/>
如果在Intent filter指定了這些屬性奶浦,那么只有所有的屬性都匹配成功時URI數(shù)據(jù)匹配才會成功。
Category 類別匹配
<intent-filter >節(jié)點中可以為組件定義一個 Category 類別列表添谊,當(dāng) Intent 中包含這個列表的所有項目時 Category 類別匹配才會成功财喳。
一些關(guān)于 Activity 的技巧
鎖定 Activity 運行時的屏幕方向
Android 內(nèi)置了方向感應(yīng)器的支持。在 G1 中斩狱,Android 會根據(jù) G1 所處的方向自動在豎屏和橫屏間切換耳高。但是有時我們的應(yīng)用程序僅能在橫屏 / 豎屏?xí)r運行,比如某些游戲所踊,此時我們需要鎖定該 Activity 運行時的屏幕方向泌枪,<activity >節(jié)點的 android:screenOrientation屬性可以完成該項任務(wù),示例代碼如下:
<activity android:name=".EX01" android:label="@string/app_name" android:screenOrientation="portrait">// 豎屏 , 值為 landscape 時為橫屏………… </activity>
全屏的 Activity
要使一個 Activity 全屏運行秕岛,可以在其 onCreate()方法中添加如下代碼實現(xiàn):
// 設(shè)置全屏模式 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // 去除標題欄 requestWindowFeature(Window.FEATURE_NO_TITLE);
在 Activity 的 Title 中加入進度條
為了更友好的用戶體驗碌燕,在處理一些需要花費較長時間的任務(wù)時可以使用一個進度條來提示用戶“不要著急,我們正在努力的完成你交給的任務(wù)”继薛。如下圖:
在 Activity 的標題欄中顯示進度條不失為一個好辦法修壕,下面是實現(xiàn)代碼:
// 不明確進度條 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main); setProgressBarIndeterminateVisibility(true); // 明確進度條 requestWindowFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.main); setProgress(5000);
Android入門-關(guān)于Activity下的onCreate方法
在AndroidManifest.xml文件中的<intent-filter>元素中有這么兩句
<intent-filter>
<action android:name = "android.intent.action.MAIN"/>
<category android:name = "android.intent.category.LAUNCHER"/>
</intent-filter>
1、一個應(yīng)用程序可以有多個Activity遏考,每個Activity是同級別的慈鸠,那么在啟動程序時,最先啟動哪個Activity呢灌具?
有些程序可能需要顯示在程序列表里青团,有些不需要。怎么定義呢咖楣?android.intent.action.MAIN決定應(yīng)用程序最先啟動的Activityandroid.intent.category.LAUNCHER決定應(yīng)用程序是否顯示在程序列表里
2督笆、因為你的程序可能有很多個activity只要xml配置文件中有這么一個intent-filter,而且里面有這個launcher诱贿,那么這個activity就是點擊程序時最先運行的那個activity娃肿。
3、現(xiàn)在只有一個activity,那么加不加就沒有關(guān)系了料扰。用于模擬器啟動時設(shè)置為默認打開為的activity锨阿。
當(dāng)寫好的應(yīng)用發(fā)布到手機上之后,當(dāng)雙擊該應(yīng)用的圖標時记罚,系統(tǒng)會將這個點擊事件包裝成一個Intent墅诡,該Intent包含兩個參數(shù),如上所述的兩個參數(shù)被傳遞給應(yīng)用之后桐智,在應(yīng)用的功能清單文件中尋找與該意圖匹配的意圖過濾器末早,如果匹配成功,找到相匹配的意圖過濾器所在的Activity元素说庭,再根據(jù)<activity>元素的“name”屬性來尋找其對應(yīng)的Activity類然磷。接著Android操作系統(tǒng)創(chuàng)建該Activity類的實例對象,對象創(chuàng)建完成之后刊驴,會執(zhí)行到該類的onCreate()方法姿搜,此onCreate()方法是重寫父類Activity的onCreate方法而實現(xiàn)的。onCreate方法用來初始化Activity實例對象捆憎。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceSate);
setContentView(R.layout.main);
}
其中super.onCreate(savedInstanceState)的作用是調(diào)用其父類Activity的onCreate方法來實現(xiàn)對界面的圖畫繪制工作舅柜。在實現(xiàn)自己定義的Activity子類的onCreate方法時一定要記得調(diào)用該方法,以確保能夠繪制界面躲惰。
setContentView(R.layout.main)的作用是加載一個界面致份。該方法中傳入的參數(shù)是“R.layout.main”,其含義為R.java類中靜態(tài)內(nèi)部類layout的靜態(tài)常量main的值础拨,而該值是一個指向res目錄下的layout子目錄下的main.xml文件的標識符氮块。因此代表著顯示main.xml所定義的畫面。
onCreate(Bundle savedInstanceState)參數(shù)Bundle
onCreate方法是在Activity創(chuàng)建時被系統(tǒng)調(diào)用诡宗,是一個Activity生命周期的開始滔蝉。可是有一點容易被忽視塔沃,就是onCreate方法的參數(shù)savedInstanceState.因為在一般的程序開發(fā)中蝠引,很少用到這個參數(shù)。
onCreate方法的完整定義如下:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
從上面的代碼可以看出芳悲,onCreate方法的參數(shù)是一個Bundle類型的參數(shù)立肘。Bundle類型的數(shù)據(jù)與Map類型的數(shù)據(jù)相似边坤,都是以key-value的形式存儲數(shù)據(jù)的名扛。
從字面上看savedInstanceState,是保存實例狀態(tài)的。實際上茧痒,savedInstanceState也就是保存Activity的狀態(tài)的肮韧。那么,savedInstanceState中的狀態(tài)數(shù)據(jù)從何處而來的呢?下面我們介紹Activity的另一個方法saveInstanceState.
onsaveInstanceState方法是用來保存Activity狀態(tài)的弄企。當(dāng)一個Activity在生命周期結(jié)束前超燃,會調(diào)用該方法保存狀態(tài)。這個方法有一個參數(shù)名稱與onCreate方法參數(shù)名稱相同拘领。如下所示:
public void onSaveInstanceState(Bundle saveInstanceState) {
super.onSaveInstanceState(saveInstanceState);
}
在實際應(yīng)用中意乓,當(dāng)一個Activity結(jié)束前,如果需要保存狀態(tài)约素,就在onsaveInstanceState中届良,將狀態(tài)數(shù)據(jù)以key-value的形式放入到saveInstanceState中。這樣圣猎,當(dāng)一個Activity被創(chuàng)建時士葫,就能從onCreate的參數(shù)saveInstanceState中獲得狀態(tài)數(shù)據(jù)。
可以重寫onSaveInstanceState送悔,以在Activity結(jié)束前保存一些數(shù)據(jù)慢显。
重寫onCreate,然后可以獲得savedInstanceState
可以用于保存一些進度數(shù)據(jù)欠啤。
Android中的Bundle的具體使用
- API文檔說明
用于不同Activity之間的數(shù)據(jù)傳遞;它保存的數(shù)據(jù)荚藻,是以key-value(鍵值對)的形式存在的。
我們經(jīng)常使用Bundle在Activity之間傳遞數(shù)據(jù)洁段,傳遞的數(shù)據(jù)可以是boolean,byte,int,long,float,double,string等基本類型或它們對應(yīng)的數(shù)組鞋喇,也可以是對象或?qū)ο髷?shù)組。當(dāng)Bundle傳遞的是對象或?qū)ο髷?shù)組時眉撵,必須實現(xiàn)Serializable或Parcelable接口侦香。下面分別介紹Activity之間如何傳遞基本數(shù)據(jù)類型、傳遞對象纽疟。
- 實例化Bundle一個對象罐韩,用putString(標記,數(shù)據(jù))來將數(shù)據(jù)導(dǎo)入到Bundle對象中污朽;
- 然后將Bundle對象導(dǎo)入到Intent對象中散吵;
- Intent啟動另一個Activity,從intent中讀出需要的數(shù)據(jù)蟆肆;
- Bundle對象可以從activity.getIntent().getExtras()中返回矾睦。可以炎功,啟動當(dāng)前Activity的Intent對象是由getIntent()來找到的枚冗。
- 通過Bundle的getString()方法,就可以讀出所要的數(shù)據(jù)蛇损。
這就是Bundle的經(jīng)典用法赁温,包裹數(shù)據(jù)放入Intent中坛怪,目的在于傳輸數(shù)據(jù)。
eg.
第一個活動的代碼如下:
package com.ray.test;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
public class TestBundle extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public boolean onTouchEvent(MotionEvent event) {
Intent intent = new Intent();
intent.setClass(TestBundle.this, Target.class);
Bundle mBundle = new Bundle();
mBundle.putString("Data", "ray'blog");//壓入數(shù)據(jù)
intent.putExtras(mBundle);
startActivity(intent);
finish();
return super.onTouchEvent(event);
}
}
將要跳轉(zhuǎn)的活動代碼
package com.ray.test;
import android.app.Activity;
import android.os.Bundle;
public class Target extends Activity{
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Bundle bundle = getIntent().getExtras();
String data=bundle.getString("Data");//讀出數(shù)據(jù)
setTitle(data);
}
}
傳遞Serializable類型的對象股囊。
Serializable是一個對象序列化的接口袜匿。一個類只有實現(xiàn)了Serializable接口,它的對象才是可序列化的稚疹。因此如果要序列化某些類的對象居灯,這些類就必須實現(xiàn)Serializable接口。而實際上内狗,Serializable是一個空接口穆壕,沒有什么具體內(nèi)容,它的目的只是簡單的標識一個類的對象可以被序列化其屏。
Serializable接口的實現(xiàn)方法:很簡單喇勋,只要implements Serializable接口就可以了
Parcelable接口說明
public interface Parcelable{
//內(nèi)容描述接口,基本不用管
public int describeContents();
//寫入接口函數(shù),打包
public void writeToParcel(Parcel dest, int flags);
//讀取接口偎行,目的是要從Parcel中構(gòu)造一個實現(xiàn)了Parcelable的類的實例處理川背。因為實現(xiàn)類在這里還是不可知的,所以需要用到模板的方式蛤袒,繼承類名通過模板參數(shù)傳入熄云。
//為了能夠?qū)崿F(xiàn)模板參數(shù)的傳入,這里定義Creator嵌入接口妙真,內(nèi)含兩個接口函數(shù)分別返回單個和多個繼承類實例缴允。
public interface Creator<T>{
public T createFromParcel(Parcel source);
public T[] newArray(int size);
}
}
Parcelable接口的實現(xiàn)方法
從parcelable接口定義中,我們可以看到珍德,實現(xiàn)parcelable接口练般,需要我們實現(xiàn)下面幾個方法:
- describeContents方法。內(nèi)容接口描述锈候,默認返回0就可以薄料;
- writeToParcel(Parcel dest, int flags)
- 靜態(tài)的Parcelable.Creator接口,本接口有兩個方法:
createFromParcel(Parcel in)從Parcel容器中讀取傳遞數(shù)據(jù)值泵琳,封裝成Parceable對象返回邏輯層摄职。
newArray(int size)創(chuàng)建一個類型為T,長度為size的數(shù)據(jù)获列,僅一句話(return new T[size])即可谷市。方法是供外部類反序列化本類數(shù)組使用。