Android 面試題--Activity

来源:http://www.cnblogs.com/wuyudong/archive/2016/10/14/5959056.html
-Advertisement-
Play Games

1、什麼是 Activity?Activity是Android組件中最基本也是最為常見用的四大組件(Activity,Service服務,Content Provider內容提供,BroadcastReceiver廣播接收器)之一。 Activity是一個應用程式組件,提供一個屏幕,用戶可以用來交互 ...


1、什麼是 Activity?
Activity是Android組件中最基本也是最為常見用的四大組件(Activity,Service服務,Content Provider內容提供,BroadcastReceiver廣播接收器)之一。

Activity是一個應用程式組件,提供一個屏幕,用戶可以用來交互為了完成某項任務。 Activity中所有操作都與用戶密切相關,是一個負責與用戶交互的組件,可以通過setContentView(View)來顯示指定控制項。 在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控制項也可以監聽並處理用戶的事件做出響應。Activity之間通過Intent進行通信。 我開發常用的的有 FragmentActivitiyListActivity ,PreferenceActivity ,TabAcitivty 等… 本文地址:http://www.cnblogs.com/wuyudong/p/5959056.html,轉載請註明出處。

2、請描述一下 Activity 生命周期

我們就來說一說這幾個過程。

1.啟動Activity:系統會先調用onCreate方法,然後調用onStart方法,最後調用onResume,Activity進入運行狀態。

2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。

3.當前Activity由被覆蓋狀態回到前臺或解鎖屏:系統會調用onResume方法,再次進入運行狀態。

4.當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居後臺:系統會先調用onPause方法,然後調用onStop方法,進入停滯狀態。

5.用戶後退回到此Activity:系統會先調用onRestart方法,然後調用onStart方法,最後調用onResume方法,再次進入運行狀態。

6.當前Activity處於被覆蓋狀態或者後臺不可見狀態,即第2步和第4步,系統記憶體不足,殺死當前Activity,而後用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。

7.用戶退出當前Activity:系統先調用onPause方法,然後調用onStop方法,最後調用onDestory方法,結束當前Activity。

Activity 從創建到銷毀有多種狀態,從一種狀態到另一種狀態時會激發相應的回調方法,這些回調方法包括:onCreate onStart onResume onPause onStop onDestroy其實這些方法都是兩兩對應的,onCreate 創建與 onDestroy 銷毀;onStart 可見與 onStop 不可見;onResume 可編輯(即焦點)與 onPause;常 見 的 Activity 類 型 有 FragmentActivitiy,ListActivity ,TabAcitivty 等。

4、如何保存 Activity 的狀態?

Activity 的狀態通常情況下系統會自動保存的,只有當我們需要保存額外的數據時才需要使用到這樣的功能。一般來說, 調用 onPause()和 onStop()方法後的 activity 實例仍然存在於記憶體中, activity 的所有信息和狀態數據不會消失, 當 activity 重新回到前臺之後, 所有的改變都會得到保留。但是當系統記憶體不足時, 調用 onPause()和 onStop()方法後的 activity 可能會被系統摧毀, 此時記憶體中就不會存有該 activity 的實例對象了。如果之後這個 activity 重新回到前臺, 之前所作的改變就會消失。為了避免此種情況發生 , 我 們 可 以 覆 寫 onSaveInstanceState() 方 法 。onSaveInstanceState()方法接受一個 Bundle 類型的參數, 開發者可以將狀態數據存儲到這個Bundle 對象中, 這樣即使 activity 被系統摧毀, 當用戶重新啟動這個 activity 而調用它的 onCreate()方法時, 上述的 Bundle 對象會作為實參傳遞給 onCreate()方法, 開發者可以從 Bundle 對象中取出保存的數據, 然後利用這些數據將 activity 恢復到被摧毀之前的狀態。需要註意的是, onSaveInstanceState()方法並不是一定會被調用的, 因為有些場景是不需要保存狀態數據的. 比如用戶按下 BACK 鍵退出 activity 時, 用戶顯然想要關閉這個 activity, 此時是沒有必要 保 存 數 據 以 供 下 次 恢 復 的 , 也 就 是 onSaveInstanceState() 方 法 不 會 被 調 用 . 如 果 調 用onSaveInstanceState()方法, 調用將發生在 onPause()或 onStop()方法之前。

@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
}

5、兩個 Activity 之間跳轉時必然會執行的是哪幾個方法?

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

6、橫豎屏切換時 Activity 的生命周期
此時的生命周期跟清單文件里的配置有關係。
1.不設置 Activity 的 android:configChanges 時,切屏會重新調用各個生命周期預設首先銷毀當前 activity,然後重新載入。
2.設置 Activity android:configChanges="orientation|keyboardHidden|screenSize"時,切屏不會重新調用各個生命周期,只會執行 onConfigurationChanged 方法。通常在游戲開發, 屏幕的朝向都是寫死的。

7、如何將一個 Activity 設置成視窗的樣式
只需要給我們的 Activity 配置如下屬性即可。android:theme="@android:style/Theme.Dialog"

8、如何退出Activity?如何安全退出已調用多個Activity 的Application?

(1)通常情況用戶退出一個 Activity 只需按返回鍵,我們寫代碼想退出 activity 直接調用 finish()方法就行。

(2)記錄打開的 Activity:每打開一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity 即可。

//偽代碼
List<Activity> lists ;// 在 application 全局的變數裡面
lists = new ArrayList<Activity>();
lists.add(this);
for(Activity activity: lists)
{
activity.finish();
}
lists.remove(this);

(3)發送特定廣播:

在需要結束應用時,發送一個特定的廣播,每個 Activity 收到廣播後,關閉即可。

//給某個 activity 註冊接受接受廣播的意圖
registerReceiver(receiver, filter)
//如果過接受到的是 關閉 activity 的廣播 就調用 finish()方法 把當前的 activity finish()掉

(4)遞歸退出

在打開新的 Activity 時使用 startActivityForResult,然後自己加標誌,在 onActivityResult 中處理,遞歸關閉。

(5)其實也可以通過 intent 的 flag 來實現 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的 activity。此時如果該任務棧中已經有該 Activity,那麼系統會把這個 Activity 上面的所有 Activity 幹掉。其實相當於給 Activity 配置的啟動模式為 SingleTop。

9、Activity 的四種啟動模式,singletop 和 singletask 區別是什麼?一般書簽的使用模式是 singletop,那為什麼不使用 singletask?

singleTop 跟 standard 模式比較類似。唯一的區別就是,當跳轉的對象是位於棧頂的 activity(應該可以理解為用戶眼前所 看到的 activity)時,程式將不會生成一個新的 activity 實例,而是直接跳到現存於棧頂的那個 activity 實例。拿上面的例子來說,當 Act1 為 singleTop 模式時,執行跳轉

後棧裡面依舊只有一個實例,如果現在按返回鍵程式將直接退出。singleTask 模式和 singleInstance 模式都是只創建一個實例的。在這種模式下,無論跳轉的對
象是不是位於棧頂的 activity,程式都不會生成一個新的實例(當然前提是棧裡面已經有這個實例)。這種模式相當有用,在以後的多 activity 開發中,常會因為跳轉的關係導致同個頁面生成多個實例,這個在用戶體驗上始終有點不好,而如果你將對應的 activity 聲明為 singleTask 模式,這種問題將不復存在。在主頁的 Activity 很常用

10、Android 中的 Context, Activity,Appliction 有什麼區別?
相同:Activity 和 Application 都是 Context 的子類。Context 從字面上理解就是上下文的意思, 在實際應用中它也確實是起到了管理上下文環境中各個參
數和變數的總用,方便我們可以簡單的訪問到各種資源。不同:維護的生命周期不同。 Context 維護的是當前的 Activity 的生命周期,Application 維護
的是整個項目的生命周期。使用 context 的時候,小心記憶體泄露,防止記憶體泄露,註意一下幾個方面:
1. 不要讓生命周期長的對象引用 activity context,即保證引用 activity 的對象要與 activity 本身生命周期是一樣的。
2. 對於生命周期長的對象,可以使用 application,context。
3. 避免非靜態的內部類,儘量使用靜態類,避免生命周期問題,註意內部類對外部對象引用導致的生命周期變化。

11、兩個 Activity 之間傳遞數據,除了 intent,廣播接收者,contentprovider 還有啥?
1)利用 static 靜態數據,public static 成員變數
2)利用外部存儲的傳輸,
例如 File 文件存儲
SharedPreferences 首選項
Sqlite 資料庫

12、Context 是什麼?
1、它描述的是一個應用程式環境的信息,即上下文。
2、該類是一個抽象(abstract class)類,Android 提供了該抽象類的具體實現類(ContextIml)。
3、 通過它我們可以獲取應用程式的資源和類, 也包括一些應用級別操作, 例如: 啟動一個 Activity,發送廣播,接受 Intent,信息,等。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android系統下的基本數據存儲形式,文件存儲、sp存儲、資料庫存儲、網路存儲、Content Provider記憶體提供者 ...
  • 一.使用HttpURLConnection提交數據 "get"請求 代碼: String path = "http://地址?數據1名字=" + URLEncoder.encode(數據1,"utf-8") + "&數據2名字=" +URLEncoder.encode(數據2,"utf-8"); U ...
  • 記憶體錯誤crash現場: Thread堆棧: 有可能是訪問被釋放對象造成,根據現場並不能找到具體哪個對象出現記憶體錯誤。 1.開啟僵屍對象調試 Edit Scheme->Debug->Diagnostics->Enable Zombie Objects 2.閃退後查看控制台,看輸出應該是某個Butto ...
  • 1、Handler 機制 Android 中主線程也叫 UI 線程,那麼從名字上我們也知道主線程主要是用來創建、更新 UI 的,而其他耗時操作,比如網路訪問,或者文件處理,多媒體處理等都需要在子線程中操作,之所以在子線程中操作是為了保證 UI 的流暢程度,手機顯示的刷新頻率是 60Hz,也就是一秒鐘 ...
  • 試試這個,能解決國內訪問Google伺服器的困難啟動 Android SDK Manager ,打開主界面,依次選擇「Tools」、「Options...」,彈出『Android SDK Manager - Settings』視窗;在『Android SDK Manager - Settings』窗 ...
  • 在項目中日期的顯示經常會當天的顯示時分,當月的顯示日時和分,以此類推,難免會涉及到日期的比較,下麵介紹一下日期比較的兩種方法 比較日期有兩種方法 一種是通過系統的NSCalendar類實現 NSString * date = @"2016-10-12 13:12:12"; //創建日期格式 NSDa ...
  • // 1. 實現一個函數,在一個有序整型數組中二分查找出指定的值,找到則返回該值的位置,找不到返回 -1。 package demo; public class Mytest { public static void main(String[] args) { int[] arr={1,2,5,9, ...
  • 1、Service 是否在 main thread 中執行, service 裡面是否能執行耗時的操作?預設情況,如果沒有顯示的指 servic 所運行的進程, Service 和 activity 是運行在當前 app 所在進程的 main thread(UI 主線程)裡面。service 裡面不 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...