38. 請描述下 Activity 的生命週期。 必調用的三個方法:
onCreate() --> onStart() --> onResume(),
用 AAA 表示
(1)父 Activity 啟動子 Activity,子 Actvity 退出,父 Activity 調用順序如下 AAA --> onFreeze() --> onPause() --> onStop() --> onRestart() --> onStart(),onResume() …
(2)使用者點擊 Home,Actvity 調用順序如下 AAA --> onFreeze() --> onPause() --> onStop() -- Maybe --> onDestroy() – Maybe
(3)調用 finish(), Activity 調用順序如下 AAA --> onPause() --> onStop() --> onDestroy()
(4)在 Activity 上顯示 dialog, Activity 調用順序如下 AAA
(5)在父 Activity 上顯示透明的或非全屏的 activity,Activity 調用順序如下 AAA --> onFreeze() --> onPause()
(6)裝置進入睡眠狀態,Activity 調用順序如下 AAA --> onFreeze() --> onPause()
41. 如何退出 Activity?如何安全退出已調用多個 Activity 的 Application?
對於單一 Activity 的應用來說,退出很簡單,直接 finish()即可。 當然,也可以用 killProcess()和 System.exit()這樣的方法。 但是,對於多 Activity 的應用來說,在開啟多個 Activity 後,如果想在最後開啟的 Activity 直接退出,上邊的方法都是沒有用的,因為上邊的方法都是結束一個 Activity 而已。 當然,網上也有人說可以。 就好像有人問, 在應用裡如何捕獲 Home 鍵, 有人就會說用 keyCode 比較 KEYCODE_HOME 即可,而事實上如果不修改 framework,根本不可能做到這一點一樣。 所以,最好還是自己親自試一下。 那麼,有沒有辦法直接退出整個應用呢? 在 2.1 之前,可以使用 ActivityManager 的 restartPackage 方法。 它可以直接結束整個應用。在使用時需要許可權 ndroid.permission.RESTART_PACKAGES。 注意不要被它的名字迷惑。
可是,在 2.2,這個方法失效了。 在 2.2 添加了一個新的方法,killBackgroundProcesses(),需要許可權 android.permission.KILL_BACKGROUND_PROCESSES。 可惜的是,它和 2.2 的 restartPackage 一樣,根本起不到應有的效果。 另外還有一個方法,就是系統內建的應用程式管理裡,強制結束程式的方法, forceStopPackage()。 它需要許可權 android.permission.FORCE_STOP_PACKAGES。 並且需要添加 android:sharedUserId="android.uid.system"屬性 同樣可惜的是,該方法是非公開的,他只能運行在系統進程,第三方程式無法調用。 因為需要在 Android.mk 中添加 LOCAL_CERTIFICATE := platform。 而 Android.mk 是用於在 Android 源碼下編譯器用的。 從以上可以看出,在 2.2,沒有辦法直接結束一個應用,而只能用自己的辦法間接辦到。
現提供幾個方法,供參考:
1、拋異常強制退出: 該方法通過拋異常,使程式 Force Close。 驗證可以,但是,需要解決的問題是,如何使程式結束掉,而不彈出 Force Close 的視窗。
2、記錄開啟的 Activity: 每開啟一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity 即可。
3、發送特定廣播: 在需要結束應用時,發送一個特定的廣播,每個 Activity 收到廣播後,關閉即可。
4、遞迴退出 在開啟新的 Activity 時使用 startActivityForResult,然後自己加標誌,在 onActivityResult 中 處理,遞迴關閉。
除了第一個,都是想辦法把每一個 Activity 都結束掉,間接達到目的。 但是這樣做同樣不完美。 你會發現,如果自己的應用程式對每一個 Activity 都設定了 nosensor,在兩個 Activity 結束 的間隙,sensor 可能有效了。 但至少,我們的目的達到了,而且沒有影響使用者使用。
為了編程方便,最好定義一個 Activity 基類,處理這些共通問題。
42. 請介紹下 Android 中常用的五種布局。
FrameLayout(架構布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局), RelativeLayout(相對布局),TableLayout(表格版面配置)
43. 請介紹下 Android 的資料存放區方式。
一.SharedPreferences 方式
二.檔案儲存體方式
三.SQLite 資料庫方式
四.內容提供器(Content provider)方式
五. 網路儲存方式
44. 請介紹下 ContentProvider 是如何?資料共用的。
建立一個屬於你自己的 Content provider 或者將你的資料添加到一個已經存在的 Content provider 中,前提是有相同資料類型並且有寫入 Content provider 的許可權。
45. 如何啟用 Service,如何停用 Service。 Android 中的 service 類似於 windows 中的 service,service 一般沒有使用者操作介面,它運行 於系統中不容易被使用者發覺, 可以使用它開發如監控之類的程式。
一。步驟 第一步:繼承 Service 類 public class SMSService extends Service { }
第二步:在 AndroidManifest.xml 檔案中的<application>節點裡對服務進行配置: <service android:name=".DemoService" />
二。Context.startService()和 Context.bindService 服務不能自己運行,需要通過調用 Context.startService()或 Context.bindService()方法啟動服 務。這兩個方法都可 以啟動 Service,但是它們的使用場合有所不同。
1.使用 startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務 仍然運行。 使用 bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就 終止。
2.採用 Context.startService()方法啟動服務,在服務未被建立時,系統會先調用服務的 onCreate()方法, 接著調用 onStart()方法。 如果調用 startService()方法前服務已經被建立, 多次調用 startService() 方法並 不會導致多次建立服務,但會導致多次調用 onStart()方法。 採用 startService()方法啟動的服務,只能調用 Context.stopService()方法結束服務,服務結束 時會調用 onDestroy()方法。
3.採用 Context.bindService()方法啟動服務,在服務未被建立時,系統會先調用服務的 onCreate()方法, 接著調用 onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調 用服務的 onUnbind()方法, 。接著調用 onDestroy()方法。如果調用 bindService()方法前服務已經被綁定,多次調用 bindService()方法並不會 導致多次建立服務及綁定(也就是說 onCreate()和 onBind()方法並不會被多次調用)。 如果調用 者希望與正在綁定的服務 解除綁定,可以調用 unbindService()方法,調用該方法也會導致系統調用服務的 onUnbind()-->onDestroy()方法。
三。Service 的生命週期 1.Service 常用生命週期回調方法如下: onCreate() 該方法在服務被建立時調用,該方法只會被調用一次,無論調用多少次 startService()或 bindService()方法, 服務也只被建立一次。 onDestroy()該方法在服務被終止時調用。 2. Context.startService()啟動 Service 有關的生命週期方法 onStart() 只有採用 Context.startService()方法啟動服務時才會回調該方法。該方法在服務開 始運行時被調用。 多次調用 startService()方法儘管不會多次建立服務,但 onStart() 方法會被多次調用。 3. Context.bindService()啟動 Service 有關的生命週期方法 onBind()只有採用 Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與 服務綁定時被調用, 當調用者與服務已經綁定,多次調用 Context.bindService()方法並不會導致該方法被多次調 用。 onUnbind()只有採用 Context.bindService()方法啟動服務時才會回調該方法。 該方法在調用者 與服務解除綁定時被調用。 備忘: 1. 採用 startService()啟動服務 Intent intent = new Intent(DemoActivity.this, DemoService.class); startService(intent); 2.Context.bindService()啟動 Intent intent = new Intent(DemoActivity.this, DemoService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); //unbindService(conn);//解除綁定