標籤:des android style blog io ar os 使用 sp
過幾天小弟要去面試了,當然免不了要好好複習下功課,其實很多東西也不是特別清楚,今天都當作一個回顧和鞏固,希望我的這篇文章能對即將去找工作的同學有所協助。
1.
Q:什麼是activity?
雖然這個問題現在不流行問了,但是還是做好準備,有備無患嘛。
A:
1).activity是四大組件之一,一般情況下,一個和使用者互動的介面就對應有一個activity。
2).Activity是Context的子類,同時它實現了Window.callback和keyEvent.callback,正因為如此,人們才能夠實現與介面互動。比如我們熟悉的點擊事件Button.setOnClickListener{}
3).我開發常用的activity有listActivity(資料展示的),TabActivity(製作表格),PreferenceActivity(常用來寫設定介面),有時候一些Activity都有一些共同的特點或者相同功能的時候,我會自己定義一個BaseActivity。
2.
Q:請說說Activity的生命週期?(這個問題問得還挺多的)。
A:我們三步走:
第一步,解釋:
生命週期描述的是一個類從建立到消亡中會執行的方法,(注意,市講的時一個個會執行的方法),在這個過程中,會針對不同的生命階段調用不同的方法。其實講白了就是一個個方法的執行過程。
第二步,如何執行:
接下來我們就要說都執行了哪些方法:
Activity從建立到銷毀有多種狀態,從一種狀態到另一種狀態會執行相應的方法,包括Oncreate()—建立,OnDestory—銷毀;OnStart()---可見,OnStop()—不可見;OnResume—擷取焦點,OnPause---失去焦點;這些方法是兩兩對應,有一個執行了肯定有對應的執行。
這裡要注意一點,彈出對話方塊不會執行以上任何方法,理由是對話方塊本身就是Activity的一部分。
最後還有一個方法,OnRestart(),這個方法在Activity被onStop後,但是沒有被onDestroy,在再次啟動此Activity時就調用onRestart(而不再調用onCreate)方法;如果是被銷毀了,那就是調用onCreate()方法。
第三步:用自己做過的項目來闡述以上怎麼用法。比如說:
用戶端每次進入某個介面的時候都要看到最新的資料,這個重新整理列表的操作 就放在onStart()的方法裡面.在onStart()裡面寫填充資料的內容就ok了。
做音樂播放器的時候,需要處理來電情況,那就虛報把播放斷點儲存起來,並把播放聲音置位0,這些工作就可以放在OnStop裡面做,然後要啟動的時候,恢複斷點,設定音量這些可以在OnStart裡面做。
我們在讀文檔的時候,會發現onPostResume()和OnPostCreate()這兩個生命週期的方法,不過開發的時候沒有用到過.
3.
Q:兩個Activity之間跳轉執行哪些方法?
A:
一般情況比如說有兩個activity,分別叫A,B ,當在A裡面啟用B組件的時候, A 會調用 onPause()方法,然後B 調用onCreate() ,onStart(), OnResume() ,如果B覆蓋了A,我們就看不到A了,那A還會調用OnStop方法,但是如果B透明的,還能看到底下的A的話就不會調用OnStop,因為只有不可見才會調用OnStop();
4.
Q說說橫豎屏切換時候Activity的生命週期?
A:這個和配置的資訊清單檔有關係。
1.如果不設定Activity的android:configChanges,切換畫面時候會調用各個生命週期,依次是:
onPause(),onStop(),OnDestory(),onCreate(),OnResume(),onStart();
意思就是你先讓他停止,然後就讓它不可見,這樣就可以銷毀了,然後在重新建立,接著就是回去焦點,擷取到之後就顯示出來。
- 當你設定了Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法,通常作遊戲開發,方向都是寫死了的。
5.
如何把Activity設定成視窗樣式?
我們只需要在資訊清單檔裡面配置,你可以使用Android系統提供的dialog樣式,也可以自己在value檔案夾下的style.xml自己定義一個樣式,然後設定到Activity上。
6.
Q:你背景Activity被系統回收怎麼辦?如果背景Activity由於某原因被系統回收可了,如何在被系統回收之前儲存目前狀態?
A:我們來看下Activity是怎麼存放的:我們很容易看到,越是在棧頂的 不容易被回收,系統會優先回收棧底的activity,要想儲存好資料,我們需要複寫一個方法:onSaveInstanceState(Bundle outState),相信這個方法大家都不陌生,因為我們寫Activity的onCreate()基本都見到了調用這個方法super.onCreate(savedInstanceState);其實這個方法調用就是從儲存的資料裡面取出來:每次執行oncreate方法都會看Bundle是不是空的,不是就把資料取出來,取資料調用的就是super.onCreate(savedInstanceState);這個東西在應用在儲存使用者id上很常見。
Java代碼
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putLong("id", 1234567890);
- }
7.Q:如何退出程式?
A:你看我們要是每次退出程式都是 一個一個頁面摁下來,介面一朵使用者體驗就不好了,我們退出可以有兩種常用的方法:
- 我們通過拋異常,然後把這個異常的線程殺死的方法,也就是在異常捕獲的代碼中寫android.os.Process.killProcess(android.os.Process.myPid());這樣子就能實現介紹程式而不會出現強制退出的介面。
- 第二種就是建立定義一個App類,裡面 整個應用程式的介面,在每一個Activity執行onCreate方法的時候,就把建立的Activity加入到全域的Activity集合裡面,然後在你點擊退出的裡面把Activity一個個從集合裡面移除就行了。具體實現如下:
a) 我們需要寫一個MyApplication.java類
Java代碼
- public class MyApplication extends Application {
- public List<Activity> activities;
- @Override
- public void onCreate() {
- super.onCreate();
- activities = new ArrayList<Activity>();
- }
- }
然後在每一個OnCreate裡面添加activity
Java代碼
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- MyApplication myApplication = new MyApplication();
- myApplication.activities.add(this);
- }
接下來就是在要實現退出的地方移除所有Activity:
Java代碼
- for(Activity activity: lists)
- {
- activity.finish();
- }
今天不早了,總結了幾個訊息,希望能對大家有協助,明天繼續。
安卓面試精華(Activity部分)