Android面試題(3)

来源:http://www.cnblogs.com/panhouye/archive/2017/02/24/6440492.html
-Advertisement-
Play Games

1、 請描述下Activity的生命周期。 activity的生命周期方法有: onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、on Destory(); 可見生命周期:從onStart()直到系統調用onStop() 前 ...


1、  請描述下Activity的生命周期。

activity的生命周期方法有:

onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、on

Destory();

可見生命周期:從onStart()直到系統調用onStop()

前臺生命周期:從onResume()直到系統調用onPause()

 

2、  如何啟用Service,如何停用Service。

服務的開發比較簡單,如下:

第一步:繼承Service類

public class SMSService extends Service {}

第二步:在AndroidManifest.xml文件中的<application>節點里對服務進

行配置:<service android:name=".SMSService" />

服務不能自己運行,需要通過調用Context.startService()或

Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是

它們的使用場合有所不同。使用startService()方法啟用服務,調用者與服務

之間沒有關連,即使調用者退出了,服務仍然運行。使用bindService()方法

啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,

大有“不求同時生,必須同時死”的特點。

如果打算採用Context.startService()方法啟動服務,在服務未被創建時,

系統會先調用服務的onCreate()方法,接著調用onStart()方法。如果調用

startService()方法前服務已經被創建,多次調用startService()方法並不會

導致多次創建服務,但會導致多次調用onStart()方法。採用startService()方

法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時

會調用onDestroy()方法。

如果打算採用Context.bindService()方法啟動服務,在服務未被創建時,

系統會先調用服務的onCreate()方法,接著調用onBind()方法。這個時候調

用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind()

方法,接著調用onDestroy()方法。如果調用bindService()方法前服務已經

被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就

是說onCreate()和onBind()方法並不會被多次調用)。如果調用者希望與正在

綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致

系統調用服務的onUnbind()-->onDestroy()方法。

服務常用生命周期回調方法如下:

onCreate() 該方法在服務被創建時調用,該方法只會被調用一次,無論調用

多少次startService()或bindService()方法,服務也只被創建一次。

onDestroy()該方法在服務被終止時調用。

與採用Context.startService()方法啟動服務有關的生命周期方法

onStart() 只有採用Context.startService()方法啟動服務時才會回調該方法。

該方法在服務開始運行時被調用。多次調用startService()方法儘管不會多次

創建服務,但onStart() 方法會被多次調用。

與採用Context.bindService()方法啟動服務有關的生命周期方法

onBind()只有採用Context.bindService()方法啟動服務時才會回調該方法。

該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用

Context.bindService()方法並不會導致該方法被多次調用。

onUnbind()只有採用Context.bindService()方法啟動服務時才會回調該方

法。該方法在調用者與服務解除綁定時被調用

 

3、  作用域public,private,protected,以及不寫時的區別

區別如下:
作用域     當前類   同一package   子孫類   其他package
public       √          √             √            √
protected   √          √             √             ×
friendly     √          √             ×             ×
private      √          ×             ×             ×

 

4、  Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)

匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個介面,由另一個內部類實現

 

5、  String s = new String("xyz");創建了幾個String Object

兩個,一個字元對象,一個字元對象引用對象

 

6、  請解釋下在單線程模型中Message、Handler、MessageQueue、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組件進行信息交換

 

7、  簡要解釋一下activity、 intent 、intentfilter 、service 、Broadcase、BroadcaseReceiver

一個activity呈現了一個用戶可以操作的可視化用戶界面;一個service

不包含可見的用戶界面,而是在後臺運行,可以與一個activity綁定,通過

綁定暴露出來介面並與其進行通信;一個broadcast receiver是一個接收廣

播消息並做出回應的component,broadcast receiver沒有界面;一個

intent是一個Intent對象,它保存了消息的內容。對於activity和service來

說,它指定了請求的操作名稱和待操作數據的URI,Intent對象可以顯式的

指定一個目標component。如果這樣的話,android會找到這個

component(基於manifest文件中的聲明)並激活它。但如果一個目標不是顯

式指定的,android必須找到響應intent的最佳component。它是通過將

Intent對象和目標的intent filter相比較來完成這一工作的;一個

component的intent filter告訴android該component能處理的

intent。intent filter也是在manifest文件中聲明的。

 

8、  說說mvc模式的原理,它在android中的運用,android的官方建議應用程式的開發採用mvc模式。何謂mvc?

mvc是model,view,controller的縮寫,mvc包含三個部分:

  模型(model)對象:是應用程式的主體部分,所有的業務邏輯都應該

寫在該層。

  視圖(view)對象:是應用程式中負責生成用戶界面的部分。也是在整個

mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。

  控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及

更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發

的相關事件,交給m層處理。 android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:

  1)視圖層(view):一般採用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如果你對android瞭解的比較的多了話,就一定

可以想到在android中也可以使用javascript+html等的方式作為view層,

當然這裡需要進行java和javascript之間的通信,幸運的是,android提供

了它們之間非常方便的通信實現。

  2)控制層(controller):android的控制層的重任通常落在了眾多的

acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過

activity交割model業務邏輯層處理,這樣做的另外一個原因是android中

的acitivity的響應時間是5s,如果耗時的操作放在這裡,程式就很容易被回

收掉。

  3)模型層(model):對資料庫的操作、對網路等的操作都應該在model

裡面處理,當然對業務計算等操作也是必須放在的該層的。

 

9、  什麼是ANR 如何避免它?

ANR:Application Not Responding。在Android中,活動管理器和窗

口管理器這兩個系統服務負責監視應用程式的響應,當用戶操作的在5s內應

用程式沒能做出反應,BroadcastReceiver在10秒內沒有執行完畢,就會出

現應用程式無響應對話框,這既是ANR。

避免方法:Activity應該在它的關鍵生命周期方法(如onCreate()和

onResume())里儘可能少的去做創建操作。潛在的耗時操作,例如網路或數

據庫操作,或者高耗時的計算如改變點陣圖尺寸,應該在子線程里(或者非同步

方式)來完成。主線程應該為子線程提供一個Handler,以便完成時能夠提交

給主線程。

 

10、              什麼情況會導致Force Close ?如何避免?能否捕獲導致其的異常?

程式出現異常,比如nullpointer。

避免:編寫程式時邏輯連貫,思維縝密。能捕獲異常,在logcat中能看到異

常信息

 

11、              short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯

short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)short s1 = 1; s1 += 1;(可以正確編譯)

 

12、              Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型

方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型

 

13、              Set里的元素是不能重覆的,那麼用什麼方法來區分重覆與否呢? 是用==還是equals()? 它們有何區別

Set里的元素是不能重覆的,那麼用iterator()方法來區分重覆與否。equals()是判讀兩個Set是否相等

    equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值

 

14、              error和exception有什麼區別

error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說記憶體溢出。不可能指望程式能處理這樣的情況

    exception 表示一種設計或實現問題。也就是說,它表示如果程式運行正常,從不會發生的情況

 

15、              請介紹下ContentProvider是如何實現數據共用的。

一個程式可以通過實現一個Content provider的抽象介面將自己的數據

完全暴露出去,而且Content providers是以類似資料庫中表的方式將數據

暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程式訪

問到,這也是應用程式之間唯一共用數據的方法。

要想使應用程式的數據公開化,可通過2種方法:創建一個屬於你自己的

Content provider或者將你的數據添加到一個已經存在的Content provider

中,前提是有相同數據類型並且有寫入Content provider的許可權。

如何通過一套標準及統一的介面獲取其他應用程式暴露的數據?

Android提供了ContentResolver,外界的程式可以通過

ContentResolver介面訪問ContentProvider提供的數據。

 

16、              try {}里有一個return語句,那麼緊跟在這個try後的finally {}里的code會不會被執行,什麼時候被執行,在return前還是後

會執行,在return前執行

 

17、              IntentService有何優點?

Acitivity的進程,當處理Intent的時候,會產生一個對應的Service;

Android的進程處理器現在會儘可能的不kill掉你;非常容易使用

 

18、              如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?

重寫onSaveInstanceState()方法,在此方法中保存需要保存的數據,

該方法將會在activity被回收之前調用。通過重寫onRestoreInstanceState()

方法可以從中提取保存好的數據

 

19、              如何將一個Activity設置成視窗的樣式。

:<activity>中配置:android :theme="@android:style/Theme.Dialog"

 

20、              談談Android的IPC(進程間通信)機制

IPC是內部進程通信的簡稱, 是共用"命名管道"的資源。Android中的IPC

機制是為了讓Activity和Service之間可以隨時的進行交互,故在Android

中該機制,只適用於Activity和Service之間的通信,類似於遠程方法調用,

類似於C/S模式的訪問。通過定義AIDL介面文件來定義IPC介面。Servier端

實現IPC介面,Client端調用IPC介面本地代理。

 


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

-Advertisement-
Play Games
更多相關文章
  • 序言 開始開發應用號之前,先看看官方公佈的「小程式」教程吧!(以下內容來自微信官方公佈的「小程式」開髮指南) 本文檔將帶你一步步創建完成一個微信小程式,並可以在手機上體驗該小程式的實際效果。這個小程式的首頁將會顯示歡迎語以及當前用戶的微信頭像,點擊頭像,可以在新開的頁面中查看當前小程式的啟動日誌。 ...
  • public void httpget(String uri){ HttpURLConnection connection = null; FileOutputStream fos = null; File fie = new File("/sdcard/W_Local_Data/LiveVideo ...
  • 最近在實現一個類似淘寶中的評論列表的功能,其中要在列表中顯示評論圖,點擊圖片後顯示大圖進行查看,各家app幾乎都會有這樣的功能。 可以看到,一個體驗較好的查看大圖的基本功能有, 第一,左右滑動時切換圖片; 第二,雙擊或雙指縮放實現圖片的縮放; 第三,圖片放大時,滑動到邊緣繼續滑動時,切換圖片。 因為 ...
  • 入職安居客三年從工程師到Team Leader,見證了Android團隊一路走來的發展歷程。因此有心將這些記錄下來與大家分享,也算是對自己三年來一部分工作的總結。希望對大家有所幫助,更希望能得到大家寶貴的建議。 一、三網合併 三年前入職時安居客在業務上剛完成了三網合併(新房、二手房、好租和商業地產多 ...
  • package com.example.lesson3_4; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import a... ...
  • package com.lxj.lesson2_3ID19; import com.example.lesson2_3_id19.R; import com.lxj.other.AgeActivity; import com.lxj.other.HeightActivity; import com.... ...
  • 在Adapter的itemView裡面,判斷列表是否在滾動中,其實是比較麻煩的,可能耦合性會比較嚴重。 所以考慮了下,是否能在itemView裡面,檢測列表的滾動狀態,並監聽停止狀態載入圖片,實現itemView與Adapter進而與ListView等解耦呢? 想到了一種實現方法,直接上代碼了: 使 ...
  • 1、首先創建一個按鈕 <Button android:id="@+id/click" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="點擊變色" android:backgro ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...