1. 程式人生 > >/Android面試之---講一下你對Activity的瞭解(面試必問的).

/Android面試之---講一下你對Activity的瞭解(面試必問的).

這篇文章會涉及到以下幾個內容

一 Activity的生命週期
二 讓Activity變成一個視窗:Activity屬性設定
三 你後臺的Activity被系統 回收怎麼辦:onSaveInstanceState
四 呼叫與被呼叫:我們的通訊使者 - Intent

一 Activity的生命週期


   和其他手機 平臺 的應用 程式 一樣,Android的應用程式 的生命週期是被統一掌控 的,也
   就是說我們寫的應用程式命運掌握在別人(系統)的手裡,我們不能改變它,只能學習 並
   適應它。

簡單地說一下為什麼是這樣:我們手機在執行 一個應用程式的時候,有可能打進來電話
   發進來簡訊 ,或者沒有電了,這時候程式都會被中斷,優先去服務電話的基本功能 ,另
   外系統也不允許你佔用太多資源 ,至少要保證電話功能吧,所以資源不足的時候也就有可 
   能被幹掉。

   言歸正傳,Activity的基本生命週期如下程式碼 所示:

Java 程式碼


public
class MyActivity extends Activity {  
    protected
void onCreate(Bundle savedInstanceState);  

    protected
void onStart();  

    protected
void onResume();  

    protected
void onPause();  

    protected
void onStop();  

    protected
void onDestroy();  
  }   

public class MyActivity extends Activity {     protected void onCreate(Bundle savedInstanceState);     protected void onStart();     protected void onResume();     protected void onPause();     protected void onStop();     protected void onDestroy();   }

   你自己寫的Activity會按需要 過載這些方法,onCreate是免不了的,在一個Activity正常啟動的過程中,他們被呼叫的順序是 onCreate -> onStart -> onResume, 在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命週期,但是有人問了 ,程式正執行著呢來電話了,這個程式咋辦?中止了唄,如果中止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢復的時候onStart->onResume ,如果打斷  這個應用程式的是一個Theme為Translucent 或者Dialog 的Activity那麼只是onPause ,恢復 的時候onResume 。

   詳細介紹一下這幾個方法中系統在做什麼以及我們應該做什麼:

   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]來處理多執行緒和介面互動的問題。這個我後面會講一些,最近因為這些東西頭已經很大了,等我理清思緒再跟大家分享。

二 讓Activity變成一個視窗:Activity屬性設定
   
   講點輕鬆的吧,可能有人希望做出來的應用程式是一個漂浮在手機主介面的東西,那麼很
簡單你只需要設定 一下Activity的主題就可以了在AndroidManifest.xml 中定義 Activity的
地方一句話:


Xml程式碼


android :theme="@android:style/Theme.Dialog"

android:theme="@android:style/Theme.Dialog"


這就使你的應用程式變成對話方塊的形式彈出來了,或者


Xml程式碼


android:theme="@android:style/Theme.Translucent"

android:theme="@android:style/Theme.Translucent"

就變成半透明的,[友情提示-.-]類似的這種activity的屬性可以在android.R.styleable 類的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的屬性的介紹都可以參考這個類android.R.styleable

上面說的是屬性名稱,具體有什麼值是在android.R.style中 可以看到,比如這個"@android:style/Theme.Dialog" 就對應於android.R.style.Theme_Dialog ,('_'換成'.' <--注意:這個是文章內容不是笑臉)就可以用在描述檔案 中了,找找類定義和描述檔案中的對應關係就都明白了。


三 你後臺的Activity被系統回收怎麼辦:onSaveInstanceState
  
   當你的程式中某一個Activity A 在執行時中,主動或被動地執行另一個新的Activity B
這個時候A會執行

Java程式碼


public
void onSaveInstanceState(Bundle outState) {  
    super.onSaveInstanceState(outState);  
    outState.putLong("id", 1234567890);  
}  

public void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    outState.putLong("id", 1234567890);}


B 完成以後又會來找A, 這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回
收的A就要重新呼叫onCreate()方法,不同於直接啟動的是這回onCreate()裡是帶上引數
savedInstanceState,沒被收回的就還是onResume就好了。

savedInstanceState是一個Bundle物件,你基本上可以把他理解為系統幫你維護的一個Map物件。在onCreate()裡你可能會用到它,如果正常啟動onCreate就不會有它,所以用的時候要判斷一下是否為空。

Java程式碼


if(savedInstanceState != null){  
     long id = savedInstanceState.getLong("id");  
}  

if(savedInstanceState != null){     long id = savedInstanceState.getLong("id");}


就像官方的Notepad教程 裡的情況,你正在編輯某一個note,突然被中斷,那麼就把這個note的id記住,再起來的時候就可以根據這個id去把那個note取出來,程式就完整一些。這也是看你的應用需不需要儲存什麼,比如你的介面就是讀取一個列表,那就不需要特殊記住什麼,哦, 沒準你需要記住滾動條的位置...

四 呼叫與被呼叫:我們的通訊使者Intent

要說Intent了,Intent就是這個這個意圖 ,應用程式間Intent進行交流,打個電話啦,來個
電話啦都會發Intent, 這個是Android架構的鬆耦合的精髓部分,大大提高了元件的複用性,比如你要在你的應用程式中點選按鈕,給某人打電話,很簡單啊,看下程式碼先:

Java程式碼


Intent intent = new Intent();  
intent.setAction(Intent.ACTION_CALL);  
intent.setData(Uri.parse("tel:" + number));  
startActivity(intent);  

Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + number)); startActivity(intent);

扔出這樣一個意圖,系統看到了你的意圖就喚醒了電話撥號程式,打出來電話。什麼讀聯絡人,發簡訊啊,郵件啊,統統只需要扔出intent就好了,這個部分設計 地確實很好啊。

那Intent通過什麼來告訴系統需要誰來接受他呢?
通常使用Intent有兩種方法,第一種是直接說明需要哪一個類來接收程式碼如下:

Java程式碼


Intent intent = new Intent(this, MyActivity.class);  
intent.getExtras().putString("id", "1");  
tartActivity(intent);  

Intent intent = new Intent(this, MyActivity.class);intent.getExtras().putString("id", "1");tartActivity(intent);


第一種方式很明顯,直接指定了MyActivity為接受者,並且傳了一些資料給MyActivity,在MyActivity裡可以用getIntent()來的到這個intent和資料。

第二種就需要先看一下AndroidMenifest中的intentfilter的配置了

Xml程式碼


<intent-filter>
    <action
android:name="android.intent.action.VIEW"
/>
    <action
android:value="android.intent.action.EDIT"
/>
    <action
android:value="android.intent.action.PICK"
/>
    <category
android:name="android.intent.category.DEFAULT"
/>
    <data
android:mimeType="vnd.android.cursor.dir/vnd.google.note"
/>
</intent-filter>

<intent-filter>    <action android:name="android.intent.action.VIEW" />    <action android:value="android.intent.action.EDIT" />    <action android:value="android.intent.action.PICK" />    <category android:name="android.intent.category.DEFAULT" />    <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /></intent-filter> 這裡面配置用到了action, data, category這些東西,那麼聰明的你一定想到intent裡也會有這些東西,然後一匹配不就找到接收者了嗎?

action其實就是一個意圖的字串名稱。
上面這段intent-filter的配置檔案說明了這個Activity可以接受不同的Action,當然相應的程式邏輯也不一樣咯,提一下那個 mimeType,他是在ContentProvider裡定義的,你要是自己實現一個ContentProvider就知道了,必須指定 mimeType才能讓資料被別人使用。

不知道原理說明白沒,總結一句,就是你呼叫別的介面不是直接new那個介面,而是通過扔出一個intent,讓系統幫你去呼叫那個介面,這樣就多麼鬆藕合啊,而且符合了生命週期被系統管理的原則。

想知道category都有啥,Android為你預先定製好的action都有啥等等,請親自訪問官方連結Intent

ps:想知道怎麼呼叫系統應用程式的同學,可以仔細看一下你的logcat,每次執行一個程式的時候是不是有一些資訊比如:
Starting activity: Intent { action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER} flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} }
再對照一下Intent的一些set方法,就知道怎麼呼叫咯,希望你喜歡:)

相關推薦

/Android面試---一下Activity瞭解(面試的).

這篇文章會涉及到以下幾個內容 一 Activity的生命週期二 讓Activity變成一個視窗:Activity屬性設定三 你後臺的Activity被系統 回收怎麼辦:onSaveInstanceState四 呼叫與被呼叫:我們的通訊使者 - Intent 一 Activi

面試官:要不簡單聊一下MySQL索引的理解?

MySQL索引?這玩意兒還能簡單聊?明顯是在挖坑,幸好老夫早有準備,切聽我一一道來。  一、索引是什麼? 索引是幫

面試官:談一下DDD的理解?我:馬什麼梅?

領域模型(domain model)是對領域內的概念類或現實世界中物件的視覺化表示。領域模型也稱為概念模型、領域物件模型和分析物件模型。 ——《UML和模式應用》 我們在日常開發中,經常針對一些功能點爭論“這個功能不應該我改,應該是你那邊改”,最終被妥協改了之後都改不明白為什麼這個功能要在自己這邊改。區別於傳

Android逆向路---Android逆向路---讓的微信地區來自火星

前言 今天看到網友的微信地區是一個魔法學院,微信的地區怎麼可能是魔法學院呢,肯定是這位網友自己搞了一些黑科技,然後改的。他能改,我們也能改,二話不說就開幹。 先來看看我的成果 需要執行環境 xposed環境 root過的android手機 微信最新版,我用的是6.7.3 開始逆向,

android 自定義Button,滿足Button呈現樣式的一系列要求

我們平時自定義的一些Button通常是改改顏色啊,文字啊,圓角啊之類的。如果要做到再高階點就需要用一個大布局還拼接了,如果一個頁面有很多樣式不同的這樣的按鈕,還真不怎麼好操作。 今天給大家上一個FancyButton能很好的幫助我們簡化這些操作 專案結構

面試問題1:談談加班的看法

論壇討論地址:http://topic.csdn.net/u/20081015/12/905bf13e-5338-4a3c-ad7f-20771552a153.html加班是每個公司,每個員工都必須面對的問題,我們對這個問題進行討論,希望能給大家一個參考。討論題目:大家說一下

Android開發手把手教寫ButterKnife框架(一)

系列文章目錄導讀: 一、概述 JakeWharton我想在Android界無人不知,無人不曉的吧, ButterKnife這個框架就是出自他隻手。這個框架我相信很多人都用過,本系列部落格就是帶大家更加深入的認識這個框架,ButterKnife截至目前

Android 通訊EventBus實現廣播與Activity通訊

本章節講述 如何利用EventBus 實現Android廣播與Activity通訊  根據廣播接收到的內容更新Activity資料本章節中的廣播是極光推送操作別名和標籤的廣播程式碼1:@Override

Android開發手把手教寫ButterKnife框架(三)

系列文章目錄導讀: 一、概述 然後在Processor裡生成自己的程式碼,把要輸出的類,通過StringBuilder拼接字串,然後輸出。 try { // write the file JavaFileObject

面試系列 | 簡單談談多執行緒併發鎖使用時的一些優化經驗?

首先加鎖會帶來效能上的損壞,但是加鎖本身不會帶來多少效能消耗,效能消耗主要是在獲取鎖的過程。如果只有一個執行緒競爭鎖,此時並不存在多執行緒競爭的情況,那麼 JVM 會進行優化,這時加鎖帶來的效能消耗基本可以忽略。因此,優化鎖的使用可以避免不必要的執行緒競爭,不僅

面試官:說說css效率的理解

大家好,我是小雨小雨,致力於分享有趣的、實用的技術文章。 內容分為翻譯和原創,如果有問題,歡迎隨時評論或私信,希望和大家一起進步。 大家的支援是我創作的動力。 選擇器的優先順序 眾所周知,選擇器是有權重的,優先順序從低到高,如下所示: 型別選擇器(例如,h1)和偽元素(例如,::before) 類選擇器

面試刷題32:tomcat做了哪些效能調優?

背景 java程式設計師的開發的java應用程式,一般都會選擇使用tomcat釋出,但是: 如何充分的掌控tomcat,並讓它發揮最優效能呢? 這也是面試的熱點問題,結合多年的工作實踐,我是李福春,今天總結一下。 tomcat的使用 下載 現在最新的穩定版本是tomcat9, 下載頁面:https://t

也許 Fetch 瞭解得不是那麼多(上)

編者按:除創宇前端與作者部落格外,本文還在語雀釋出。 編者還要按:作者也在掘金哦,歡迎關注:@GoDotDotDot 前言 本篇主要講述 Fetch 的一些基本知識點以及我們在生產開發中怎麼去使用。為了能夠更好的瞭解 Fetch,我們希望你對以下知識點有所瞭解,如果有相關的開發經驗,

也許 Fetch 瞭解得不是那麼多(下)

上文連結:也許你對 Fetch 瞭解得不是那麼多(上) 編者按:除創宇前端與作者部落格外,本文還在語雀釋出。 編者還要按:作者也在掘金哦,歡迎關注:@GoDotDotDot Fetch 與 XHR 比較 Fetch 相對 XHR 來說具有簡潔、易用、宣告式、天生基於 Promi

Web前端開發“常見模組真的很瞭解嗎?”

3.4 常見模組你真的很瞭解嗎 3.4.1 標題和內容 標題和內容模組如圖3-13 所示。 圖3-13 標題和內容模組 這種標題配內容的模組,我們可以用如下幾種方案來實現同樣的效果。 方案一 實現方法如程式碼清單3-3 所示。 程式碼清單3-3 標題和內容模組實現方案一

面試官說 “還有什麽問題想的” ,該如何回答?

適合 rdquo 其他人 handler -a 如果 線下 江湖 pst 閱讀本文大概需要 4 分鐘。作者:黃小斜來源:程序員江湖程序員面試時經常會聽到面試官說一些套話,比如“今天的面試就到這裏了,回去等通知吧”,“你還有什麽問題想問我的嗎”,“如果這道題不會做,那麽我們也

大白話聊聊Java併發面試問題談談AQS的理解?【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至週五早8點半!精品技術文章準時送上! 一、寫在前面 上一篇文章聊了一下java併發中常用的原子類的原理和Java 8的優化,具體請參見文章:大白話聊聊Java併發面試問題之Java 8如何優化CAS效能?。 這篇文章,我們來聊聊面試的時

Android面試Activity

Activity是什麼?   Activity實際上只是一個與使用者互動的介面而已。 1.Activity生命週期 1.1 Activity的4種狀態   Active/Paused/Stopped/Killed   Activie:當前Activity正處

面試總結談談面向物件的理解

對面向物件的理解 在我理解,面向物件是向現實世界模型的自然延伸,這是一種“萬物皆物件”的程式設計思想。在現實生活中的任何物體都可以歸為一類事物,而每一個個體都是一類事物的例項。面向物件的程式設計是以物件為中心,以訊息為驅動,所以程式=物件+訊息。 面向物件有三大特性,封裝、

面試總結談談面向象的理解

基於 重用 理解 一個個 weixin 好的 設計模式 sdn 實例 對面向對象的理解 在我理解,面向對象是向現實世界模型的自然延伸,這是一種“萬物皆對象”的編程思想。在現實生活中的任何物體都可以歸為一類事物,而每一個個體都是一類事物的實例。面向對