1. 程式人生 > >Android開發-基本概念小整理(一)為了面試的小夥伴們所準備~~

Android開發-基本概念小整理(一)為了面試的小夥伴們所準備~~

轉載請註明出處:http://blog.csdn.net/iwanghang/

我正在參加CSDN 2016部落格之星評選,希望得到您的寶貴一票~
http://blog.csdn.net/vote/candidate.html?username=iwanghang
請為我投票,謝謝 ~~
如果沒有CSDN賬號 直接使用微信/QQ/微博登陸 就能投票了~~

1.請解釋下在單執行緒模型中Message,Handler,Message Queue,Looper之間的關係。

簡單的說,Handler獲取當前執行緒中的looper物件,looper用來從存放Message的MessageQueue中取出Message,再有Handler進行Message的分發和處理。
Message Queue(訊息佇列):用來存放通過Handler釋出的訊息,通常附屬於某一個建立它的執行緒,可以通過Looper.myQueue()得到當前執行緒的訊息佇列。
Handler:可以釋出或者處理一個訊息或者操作一個Runnable,通過Handler釋出訊息,訊息將只會傳送到與它關聯的訊息佇列,也只能處理該訊息佇列中的訊息。
Looper:是Handler和訊息佇列之間通訊橋樑,程式元件首先通過Handler把訊息傳遞給Looper,Looper把訊息放入佇列。Looper也把訊息佇列裡的訊息廣播給所有的。
Handler:Handler接受到訊息後呼叫handleMessage進行處理。
Message:訊息的型別,在Handler類中的handleMessage方法中得到單個的訊息進行處理。
在單執行緒模型下,為了執行緒通訊問題,Android設計了一個Message Queue(訊息佇列), 執行緒間可以通過該Message Queue並結合Handler和Looper元件進行資訊交換。下面將對它們進行分別介紹:
1. Message 
Message訊息,理解為執行緒間交流的資訊,處理資料後臺執行緒需要更新UI,則傳送Message內含一些資料給UI執行緒。
2. Handler 
Handler處理者,是Message的主要處理者,負責Message的傳送,Message內容的執行處理。後臺執行緒就是通過傳進來的 Handler物件引用來sendMessage(Message)。而使用Handler,需要implement 該類的 handleMessage(Message)方法,它是處理這些Message的操作內容,例如Update UI。通常需要子類化Handler來實現handleMessage方法。
3. Message Queue 
Message Queue訊息佇列,用來存放通過Handler釋出的訊息,按照先進先出執行。
每個message queue都會有一個對應的Handler。Handler會向message queue通過兩種方法傳送訊息:sendMessage或post。這兩種訊息都會插在message queue隊尾並按先進先出執行。但通過這兩種方法傳送的訊息執行的方式略有不同:通過sendMessage傳送的是一個message物件,會被 Handler的handleMessage()函式處理;而通過post方法傳送的是一個runnable物件,則會自己執行。
4. Looper 
Looper是每條執行緒裡的Message Queue的管家。Android沒有Global的Message Queue,而Android會自動替主執行緒(UI執行緒)建立Message Queue,但在子執行緒裡並沒有建立Message Queue。所以呼叫Looper.getMainLooper()得到的主執行緒的Looper不為NULL,但呼叫Looper.myLooper() 得到當前執行緒的Looper就有可能為NULL。對於子執行緒使用Looper,API Doc提供了正確的使用方法:這個Message機制的大概流程:
1. 在Looper.loop()方法執行開始後,迴圈地按照接收順序取出Message Queue裡面的非NULL的Message。
2. 一開始Message Queue裡面的Message都是NULL的。當Handler.sendMessage(Message)到Message Queue,該函式裡面設定了那個Message物件的target屬性是當前的Handler物件。隨後Looper取出了那個Message,則呼叫 該Message的target指向的Hander的dispatchMessage函式對Message進行處理。在dispatchMessage方法裡,如何處理Message則由使用者指定,三個判斷,優先順序從高到低:
1) Message裡面的Callback,一個實現了Runnable介面的物件,其中run函式做處理工作;
2) Handler裡面的mCallback指向的一個實現了Callback介面的物件,由其handleMessage進行處理;
3) 處理訊息Handler物件對應的類繼承並實現了其中handleMessage函式,通過這個實現的handleMessage函式處理訊息。
由此可見,我們實現的handleMessage方法是優先順序最低的!
3. Handler處理完該Message (update UI) 後,Looper則設定該Message為NULL,以便回收!
在網上有很多文章講述主執行緒和其他子執行緒如何互動,傳送資訊,最終誰來執行處理資訊之類的,個人理解是最簡單的方法——判斷Handler物件裡面的Looper物件是屬於哪條執行緒的,則由該執行緒來執行! 
1. 當Handler物件的建構函式的引數為空,則為當前所線上程的Looper; 
2. Looper.getMainLooper()得到的是主執行緒的Looper物件,Looper.myLooper()得到的是當前執行緒的Looper物件。

2.如果有個100M大的檔案,需要上傳至伺服器中,而伺服器form表單最大隻能上傳2M,可以用什麼方法。

使用Http協議上傳資料,特別是在android下,跟form沒什麼關係。傳統的在web中,在form中寫檔案上傳,其實瀏覽器所做的就是將我們的資料進行解析組拼成字串,以流的方式傳送到伺服器,且上傳檔案用的都是POST方式,POST方式對大小沒什麼限制。

3、記憶體溢位和記憶體洩漏有什麼區別?何時會產生記憶體洩漏?記憶體優化有哪些方法?

記憶體溢位通俗理解就是軟體(應用)執行需要的記憶體,超出了它可用的最大記憶體。
記憶體洩漏就是我們對某一記憶體空間的使用,使用完成後沒有釋放。
記憶體優化:Android中容易記憶體溢位的部分,就是圖片的載入,我們可以使用圖片的壓縮加上使用LruCache快取的目的
來控制圖片所能夠使用的記憶體。還有對於比較耗資源的物件及時的關閉,例如Database Conn,各種感測器,Service等等。

4.AsyncTask使用在哪些場景?它的缺陷是什麼?如何解決?

AsyncTask 運用的場景就是我們需要進行一些耗時的操作,耗時操作完成後更新主執行緒,或者在操作過程中對主執行緒的UI進行更新。
缺陷:AsyncTask中維護著一個長度為128的執行緒池,同時可以執行5個工作執行緒,還有一個緩衝佇列,當執行緒池中已有128個執行緒,緩衝佇列已滿時,如果此時向執行緒提交任務,將會丟擲RejectedExecutionException。
解決的方法:由一個控制執行緒來處理AsyncTask的呼叫判斷執行緒池是否滿了,如果滿了則執行緒睡眠否則請求AsyncTask繼續處理。

5.assest資料夾裡放檔案,對於檔案的大小有沒有限制?

assets目錄更像一個附錄型別的目錄,Android不會為這個目錄中的檔案生成ID並儲存在R類當中,因此它與Android中的一些類和方法相容度更低。同時,由於你需要一個字串路徑來獲取這個目錄下的檔案描述符,訪問的速度會更慢。但是把一些檔案放在這個目錄下會使一些操作更加方便,比方說拷貝一個數據庫檔案到系統記憶體中。要注意的是,你無法在Android XML檔案中引用到assets目錄下的檔案,只能通過AssetManager來訪問這些檔案。資料庫檔案和遊戲資料等放在這個目錄下是比較合適的。這兩者中單個檔案大小不能超過1M的錯誤描述也在傳播,即如果讀取超過1M的檔案會報IOException,還引申出種種解決方案。不應該有這樣的限制,為了驗證這個說法寫了個Demo,發現將近5M的壓縮包在assets和raw中都能正常訪問,在這裡糾正一下,理論上只要打包不超過Android APK 50M大小的限制都是沒有問題的。當然了,不排除是Android很早期的時候因為裝置硬體原因aapt在編譯的時候對這兩個資料夾大小做出了限制,如果是這樣,較新版的ADT應該不會出現這種情況。

6.啟動一個程式,可以主介面點選圖示進入,也可以從一個程式中跳轉過去,二者有什麼區別?

是因為啟動程式(主介面也是一個app),發現了在這個程式中存在一個設定為<category android:name="android.intent.category.LAUNCHER" />的activity,所以這個launcher會把icon提出來,放在主介面上。當用戶點選icon的時候,發出一個Intent:Intent intent = mActivity.getPackageManager().getLaunchIntentForPackage(packageName);
mActivity.startActivity(intent);跳過去可以跳到任意允許的頁面,如一個程式可以下載,那麼真正下載的頁面可能不是首頁(也有可能是首頁),這時還是構造一個Intent,startActivity。
這個intent中的action可能有多種view,download都有可能。系統會根據第三方程式向系統註冊的功能,為你的Intent選擇可以開啟的程式或者頁面。所以唯一的一點不同的是從icon的點選啟動的intent的action是相對單一的,從程式中跳轉或者啟動可能樣式更多一些。本質是相同的。

7.程式之間的親和性的理解。

1、預設情況下一個應用的所有Activity都是具有相同的affinity,都是從application中繼承,application的affinity
預設就是manifest的包名。
2、affinity對Activity來說,就像是身份證一樣,可以告訴所在的Task,自己屬於其中的一員。
3、應用場合:
a:根據affinity重新為Activity選擇合適的宿主Task;
b:與allowTaskReparenting屬性配合;
c:啟動Activity使用Intent設定了FLAG_ACTIVITY_NEW_TASK標記。


8.同一個程式,但不同的Activity是否可以放在不同的Task任務棧中?

可以放在不同的Task中。需要為不同的activity設定不同的affinity屬性,啟動activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK標記。


9.橫豎屏切換時候Activity的生命週期。

1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次。
3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法。


10.AIDL的全稱是什麼?如何工作?

全稱是:Android Interface Define Language(Android介面定義語言)
在Android中, 每個應用程式都可以有自己的程序. 在寫UI應用的時候, 經常要用到Service. 在不同的程序中, 怎樣傳遞物件呢? 顯然, Java中不允許跨程序記憶體共享。
因此傳遞物件, 只能把物件拆分成作業系統能理解的簡單形式, 以達到跨界物件訪問的目的. 在J2EE中,採用RMI的方式, 可以通過序列化傳遞物件. 在Android中, 則採用AIDL的方式. 理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩。
AIDL(AndRoid介面描述語言)是一種藉口描述語言; 編譯器可以通過aidl檔案生成一段程式碼,通過預先定義的介面達到兩個程序內部通訊程序的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個物件, 需要先將物件轉化成AIDL可識別的引數(可能是多個引數), 然後使用AIDL來傳遞這些引數, 在訊息的接收端, 使用這些引數組裝成自己需要的物件.AIDL的IPC的機制和COM或CORBA類似, 是基於介面的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值. 如果要使用AIDL,需要完成2件事情: 1. 引入AIDL的相關類.; 2. 呼叫aidl產生的class。
AIDL的建立方法:
AIDL語法很簡單,可以用來宣告一個帶一個或多個方法的介面,也可以傳遞引數和返回值。 由於遠端呼叫的需要, 這些引數和返回值並不是任何型別。
下面是些AIDL支援的資料型別:
1. 不需要import宣告的簡單Java程式語言型別(int,boolean等)
2. String, CharSequence不需要特殊宣告

3. List, Map和Parcelables型別, 這些型別內所包含的資料成員也只能是簡單資料型別, String等其他比支援的型別

11.dvm的程序和Linux的程序, 應用程式的程序是否為同一個概念?

DVM指dalivk的虛擬機器。每一個Android應用程式都在它自己的程序中執行,都擁有一個獨立的Dalvik虛擬機器例項。而每一個DVM都是在Linux 中的一個程序,所以說可以認為是同一個概念。Dalvik是Google公司自己設計用於Android平臺的Java虛擬機器,每一個Dalvik 應用作為一個獨立的Linux 程序執行。獨立的程序可以防止在虛擬機器崩潰的時候所有程式都被關閉。

12. 什麼是Activity?

四大元件之一,一般的,一個使用者互動介面對應一個activity, activity 是Context的子類,同時實現了window.callback和keyevent.callback, 可以處理與窗體使用者互動的事件. 我開發常用的的有ListActivity,PreferenceActivity 等…如果介面有共同的特點或者功能的時候,還會自己定義一個BaseActivity.


13. 請描述一下Activity生命週期。

    onCreate:   在這裡建立介面 ,做一些資料 的初始化工作
    onStart:    到這一步變成使用者可見不可互動的
    onResume:   變成和使用者可互動的,(在activity 棧系統通過棧的方式管理這些個Activity的最上面,執行完彈出棧,
則回到上一個Activity)
    onPause:    到這一步是可見但不可互動 的,系統會停止動畫 等消耗CPU 的事情從上文的描述已經知道,應該在這裡儲存你的一些資料,因為這個時候你的程式的優先順序降低,有可能被系統收回。在這裡儲存的資料,應該在onResume裡讀出來,注意:這個方法裡做的事情時間要短,因為下一個activity不會等到這個方法完成才啟動
    onstop:     變得不可見 ,被下一個activity覆蓋了
    onDestroy:  這是activity被幹掉前最後一個被呼叫方法了,可能是外面類呼叫finish方法或者是系統為了節省空間將它暫時性的幹掉,可以用isFinishing()來判斷它,如果你有一個Progress Dialog線上程中轉動,請在onDestroy裡把他cancel掉,不然等執行緒結束的時候,呼叫Dialog的cancel方法會拋 異常的。
onPause,onstop, onDestroy,三種狀態下,activity都有可能被系統幹掉為了保證程式的正確性,你要在onPause()裡寫上持久層操作的程式碼,將使用者編輯的內容都儲存到儲存介質上(一般都是資料庫 )。實際工作中因為生命週期的變化而帶來的問題也很多,比如你的應用程式起了新的執行緒在跑,這時候中斷了,你還要去維護那個執行緒,是暫停還是殺掉還是資料回滾,是吧?因為Activity可能被殺掉,所以執行緒中使用的變數和一些介面元素就千萬要注意了,一般我都是採用Android的訊息機制
[Handler,Message]來處理多執行緒和介面互動的問題。
其實這些方法都是兩兩對應的,onCreate建立與onDestroy銷燬;onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause;這6個方法是相對應的,那麼就只剩下一個onRestart方法了,這個方法在Activity被onStop後,但是沒有被onDestroy,在再次啟動此Activity時就呼叫onRestart(而不再呼叫onCreate)方法;如果被onDestroy了,則是呼叫onCreate方法。


14. 兩個Activity之間跳轉時必然會執行的是哪幾個方法。

一般情況比如說有兩個activity,分別叫A,B ,當在A裡面啟用B元件的時候, A會呼叫onPause()方法,然後B呼叫onCreate(),onStart(),OnResume(),這個時候B覆蓋了窗體,A會呼叫onStop()方法。如果B是透明的,或者是對話方塊的樣式, 就不會呼叫onStop()方法。


15.橫豎屏切換時候Activity的生命週期。

1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。
2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次。
3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法。


16. 如何將一個Activity設定成視窗的樣式。

在AndroidManifest.xml檔案當中設定當前activity的一個屬性:android:theme="@android:style/Theme.Dialog"
 

17. 你後臺的Activity被系統 回收怎麼辦?如果後臺的Activity由於某原因被系統回收可了,如何在被系統回收之前儲存當前狀態?

除了在棧頂的activity,其他的activity都有可能在記憶體不足的時候被系統回收,一個activity越處於棧底,被回收的可能性越大.
protected void onSaveInstanceState(Bundle outState) {
       super.onSaveInstanceState(outState);
       outState.putLong("id", 1234567890);
}
public void onCreate(Bundle savedInstanceState) {
//判斷 savedInstanceState是不是空.
//如果不為空就取出來
        super.onCreate(savedInstanceState);
}


18. 如何退出Activity?如何安全退出已呼叫多個Activity的Application?

1、拋異常強制退出:
該方法通過拋異常,使程式Force Close。
驗證可以,但是,需要解決的問題是,如何使程式結束掉,而不彈出Force Close的視窗。
2、記錄開啟的Activity:
每開啟一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。
3、傳送特定廣播:
在需要結束應用時,傳送一個特定的廣播,每個Activity收到廣播後,關閉即可。
4、遞迴退出
在開啟新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞迴關閉。
上面是網上的一些做法.
其實,可以通過intent的flag來實現。intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)啟用一個新的activity,然後在新的activity的oncreate方法裡面 finish掉.
 

19. service是否在main thread中執行, service裡面是否能執行耗時的操作?

預設情況,如果沒有顯示的指定service所執行的程序, Service和activity是執行在當前app所在程序的main thread(UI主執行緒)裡面


20. 兩個Activity之間怎麼傳遞資料?
基本資料型別可以通過Intent傳遞資料 extras.putDouble(key, value) ;intent.putExtras(extras)
Application全局裡面存放物件,自己去實現自己的application的這個類,基礎系統的application , 每個activity都可以取到。
讓物件實現implements Serializable 介面把物件存放到檔案上。
讓類實現Serializable 介面,然後可以通過 ObjectOutputStream ObjectInputStream
       //ObjectInputStream
       //ObjectOutputStream
           FileOutputStream fos = new FileOutputStream(new File("/sdcard/studnet.obj"));
           ObjectOutputStream oos = new ObjectOutputStream(fos);
           oos.writeObject(new Student());
 

21. 怎麼讓在啟動一個Activity是就啟動一個service?

在activity的onCreate()方法裡面startService();


22. 同一個程式,但不同的Activity是否可以放在不同的Task任務棧中?

可以放在不同的Task中。需要為不同的activity設定不同的affinity屬性,啟動activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK標記。


23. Activity怎麼和service繫結,怎麼在activity中啟動自己對應的service?

bindService().  讓activity能夠訪問到 service裡面的方法構建一個intent物件,
Intent service = new Intent(this,MyService.class);
通過bindService的方法去啟動一個服務,ServiceConnection 物件(重寫onServiceConnected
和OnServiceDisconnected方法)和BIND_AUTO_CREATE.
       private class myconn implements ServiceConnection
       {
              public void onServiceConnected(ComponentName name, IBinder service) {
                     // TODO Auto-generated method stub
                     //可以通過IBinder的物件 去使用service裡面的方法
              }
              public void onServiceDisconnected(ComponentName name) {
                     // TODO Auto-generated method stub
              }
       }


24. 什麼是Service以及描述下它的生命週期。Service有哪些啟動方法,有什麼區別,怎樣停用Service?
在Service的生命週期中,被回撥的方法比Activity少一些,只有onCreate, onStart, onDestroy,onBind和onUnbind。
通常有兩種方式啟動一個Service,他們對Service生命週期的影響是不一樣的。
1、通過startService
    Service會經歷 onCreate 到onStart,然後處於執行狀態,stopService的時候呼叫onDestroy方法。
    如果是呼叫者自己直接退出而沒有呼叫stopService的話,Service會一直在後臺執行。
2、通過bindService  
    Service會執行onCreate,然後是呼叫onBind, 這個時候呼叫者和Service繫結在一起。呼叫者退出了,Srevice就會呼叫onUnbind->onDestroyed方法。
    所謂繫結在一起就共存亡了。呼叫者也可以通過呼叫unbindService方法來停止服務,這時候Srevice就會呼叫
onUnbind->onDestroyed方法。
需要注意的是如果這幾個方法交織在一起的話,會出現什麼情況呢?
一個原則是Service的onCreate的方法只會被呼叫一次,就是你無論多少次的startService又bindService,Service只被建立一次。
如果先是bind了,那麼start的時候就直接執行Service的onStart方法,如果先是start,那麼bind的時候就直接執行onBind方法。
如果service執行期間呼叫了bindService,這時候再呼叫stopService的話,service是不會呼叫onDestroy方法的,service就stop不掉了,只能先UnbindService, 再StopService。

如果一個service通過startService 被start之後,多次呼叫startService 的話,service會多次呼叫onStart方法。多次呼叫stopService的話,service只會呼叫一次onDestroyed方法。

如果一個service通過bindService被start之後,多次呼叫bindService的話,service只會呼叫一次onBind方法。
多次呼叫unbindService的話會丟擲異常。


25. 不用service,B頁面為音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放?

這個問題問的很山寨.預設不做任何處理,B裡面的音樂都能播放。遇到問題, 可以隨機應變,靈活發揮,多考慮些細節,比如說這個題就可以這樣說,說說你對startActivityForResult的理解(),A開啟B的時候,用startActivityForResult()方法, B返回的時候把播放的狀態資訊返回給A ,A繼續播放音樂。


26. 什麼是IntentService?有何優點?

非同步處理服務。優點是Acitivity的程序,當處理Intent的時候,會產生一個對應的Service。Android的程序處理器現在會盡可能的不kill掉你。非常容易使用。
 
27. 什麼時候使用Service?
擁有service的程序具有較高的優先順序。官方文件告訴我們,Android系統會盡量保持擁有service的程序執行,只要在該service已經被啟動(start)或者客戶端連線(bindService)到它。當記憶體不足時,需要保持,擁有service的程序具有較高的優先順序。
1.如果service正在呼叫onCreate,  onStartCommand或者onDestory方法,那麼用於當前service的程序相當於前臺程序以避免被killed。
2.如果當前service已經被啟動(start),擁有它的程序則比那些使用者可見的程序優先順序低一些,但是比那些不可見的程序更重要,這就意味著service一般不會被killed.
3.如果客戶端已經連線到service (bindService),那麼擁有Service的程序則擁有最高的優先順序,可以認為service是可見的。
4.如果service可以使用startForeground(int, Notification)方法來將service設定為前臺狀態,那麼系統就認為是對使用者可見的,並不會在記憶體不足時killed。
如果有其他的應用元件作為Service,Activity等執行在相同的程序中,那麼將會增加該程序的重要性。
       1.Service的特點可以讓他在後臺一直執行,可以在service裡面建立執行緒去完成耗時的操作.
       2.Broadcast receiver捕獲到一個事件之後,可以起一個service來完成一個耗時的操作.
       3.遠端的service如果被啟動起來,可以被多次bind, 但不會重新create.  索愛手機X10i的人臉識別的service可以被相簿使用,可以被攝像機,照相機等程式使用.
 
28. 請描述一下Intent 和 Intent Filter。
Intent在Android中被翻譯為"意圖",熟語來講就是目的,他們是三種應用程式基本元件—activity,service和broadcast receiver之間互相啟用的手段。 在呼叫Intent名稱時使用ComponentName也就是類的全名時為顯示呼叫。
這種方式一般用於應用程式的內部呼叫,因為你不一定會知道別人寫的類的全名。我們來看看隱式Intent怎麼用? 
首先我們先配置我們的Activity的Intent Filter  
<intent-filter>      
<action android:name="com.example.project.SHOW_CURRENT" /> 
</intent-filter>  
這樣在呼叫的時候指定Intent的action,系統就是自動的去對比是哪個intent-filter符合我們的Activity,找到後就會啟動Activity。  一個intent filter是IntentFilter類的例項, 但是它一般不出現在程式碼中,而是出現在android Manifest檔案中, 以<intent-filter>的形式. (有一個例外是broadcast receiver的intent filter是使用Context.registerReceiver()來動態設定的, 其intent filter也是在程式碼中建立的.) 一個filter有action, data,category等欄位. 一個隱式intent為了能被某個intent filter接受, 必須通過3個測試. 一個intent為了被某個元件接受, 則必須通過它所有的intent filter中的一個. 
 
29. Intent傳遞資料時,可以傳遞哪些型別資料?
基本型別可以傳的,還有類是可以的,不過要繼承Serializable這個介面。
Intent間傳送資料一般有兩種常用的辦法:
1.extra
2.data. 
extra可以用Intent.putExtra放入資料。新啟動的Activity可用Intent.getExtras取出來Bundle, 然後用Bundles.getLong, getInt, getBoolean, getString等函式來取放進入的值。
而data則是傳輸url。url可以是指我們熟悉的http, ftp 等網路地址,也可以指content來指向ContentProvider提供的資源。Intent.setData可以放入資料,Intent.getData可以取出資料。


30. 說說Activity,Intent,Service是什麼關係。
一個Activity通常是一個單獨的螢幕,每一個Activity都被實現為一個單獨的類,這些類都是從Activity基類中繼承來的,Activity類會顯示由檢視控制元件組成的使用者介面,並對檢視控制元件的事件做出響應。
Intent的呼叫是用來進行架構螢幕之間的切換的。Intent是描述應用想要做什麼。Intent資料結構中兩個最重要的部分是動作和動作對應的資料,一個動作對應一個動作資料。
Android Service是執行在後臺的程式碼,不能與使用者互動,可以執行在自己的程序,也可以執行在其他應用程式程序的上下文裡。需要通過某一個Activity或者其他Context物件來呼叫。
Activity跳轉到Activity,Activity啟動Service,Service開啟Activity都需要Intent表明跳轉的意圖,以及傳遞引數,Intent是這些元件間訊號傳遞的承載者。


轉載請註明出處:http://blog.csdn.net/iwanghang/



歡迎移動開發愛好者交流
瀋陽或周邊城市公司有意開發Android,請與我聯絡
聯絡方式

微信:iwanghang
QQ:413711276
郵箱:[email protected]