Android 面試題及答案(2),android試題及答案

來源:互聯網
上載者:User

Android 面試題及答案(2),android試題及答案
1.Activity相關。launchmode,OnSaveInstnceState,生命週期等。

 4種預設的launchmode,以及OnNewIntent的回調。

OnNewIntent->OnRestart->OnStart->onResume

OnActivity->OnResume.

OnNewIntent ,OnActivityResult?

OnNewIntent launchmode with singletask or singleInstance.

but if set these two mode. OnActivityResult will be called after startActivityforResult directly。

so normally,they can not called both.

OnSaveInstanceState:

在Activity這個方法的地方有一段描述:當activity將要被kill的時候,系統會開放這個借口供程式員調用

然後它會把bundle資訊傳遞到OnCreate & Bundle裡面。

這個方法一定會在OnStop之前被調用,but 與OnPause的順序無法確定。

某些情況下,生命週期不會走到OnDestroy,但是有些資源需要釋放。這時候,最好是事件驅動。

2.Fragment相關技術。

Fragment 的生命週期:Android四大組件之Activity & Fragement

Fragment和activity溝通,

fragmentmaneger.findFragmentById

fragmentmaneger.findFragmentByTag,

fragment之間的溝通,setArgument。

getActivity & addlistener等。

資料存放區和恢複。onSaveInstanceState:Fragment的該func同Activity同步。

FragmentTransaction transaction = fm.benginTransatcion();//開啟一個事務

transaction.add() 

往Activity中添加一個Fragment

transaction.remove()

從Activity中移除一個Fragment,如果被移除的Fragment沒有添加到回退棧(回退棧後面會詳細說),這個Fragment執行個體將會被銷毀。

transaction.replace()

使用另一個Fragment替換當前的,實際上就是remove()然後add()的合體~

transaction.hide()

隱藏當前的Fragment,僅僅是設為不可見,並不會銷毀

transaction.show()

顯示之前隱藏的Fragment

detach()

會將view從UI中移除,和remove()不同,此時fragment的狀態依然由FragmentManager維護。

attach()

重建view視圖,附加到UI上並顯示。

transatcion.commit()//提交一個事務

注意:常用Fragment的哥們,可能會經常遇到這樣Activity狀態不一致:State loss這樣的錯誤。主要是因為:commit方法一定要在Activity.onSaveInstance()之前調用。

上述,基本是操作Fragment的所有的方式了,在一個事務開啟到提交可以進行多個的添加、移除、替換等操作。

值得注意的是:如果你喜歡使用Fragment,一定要清楚這些方法,哪個會銷毀視圖,哪個會銷毀執行個體,哪個僅僅只是隱藏,這樣才能更好的使用它們。

其他問題:Android Fragment 真正的完全解析(下)

 FragmentTransaction.addToBackStack(String):如果是replace的方法,那麼當前fragment會被remove掉,所有back的時候,fragment的狀態不會保留,只會重新

建立。而如果是hide & add的方法,就會把之前的fragment重新attch上。

如果activity管理fragment,可以調用fragment的所有public方法。

可以通過findfragmentbyid & findfragmentbytag來定位fragment,然後同上。

fragment可以通過getactivity獲得執行個體。 

當旋轉螢幕是,fragment會被重複建立,這是時候如果使用OnCreate的bundle參數,就可以判斷是否是第一次建立。

activity的預設實現bundle參數是有內容的。

3.序列化技術,Parcable & Serializable.

android 處理序間通訊資料(一)------parcel的起源

為什麼要序列化:為了跨進程通訊,應為處理序間通訊就是二進位格式,所以序列化可以通過還原序列化,把資料還原。

parcable是記憶體機的序列化,所以速度快。

4.fastJson & GSon的使用package com.joyfulmath.publibrary.json;import com.alibaba.fastjson.JSON;import com.joyfulmath.publicutils.utils.TraceLog;/** * @author deman.lu * @version on 2016-03-24 17:20 * 使用fastjson 來解析該問題 */public class JsonUtils { public static <T> T parseObject(String jsonStr, Class<T> entityClass) { T ret = null; try { ret = JSON.parseObject(jsonStr,entityClass); }catch (Exception e) { TraceLog.e("parseObject-something Exception with:" + e.toString()); } return ret; } public static String toJSONString(Object obj) { String ret = null; try { ret = JSON.toJSONString(obj); } catch (Exception e) { e.printStackTrace(); } return ret; }}fastJson

 

5.多線程相關,包括handler,message looper. ExecutorService.

訊息機制:android 進程/線程管理(一)----訊息機制的架構 請看這個系列。

ExecutorService:線程池,可以提供關閉操作,等待關閉和直接關閉。

6.ImageLoader 原理,包括Glide,picasso,以及Fresco.

Picasso,square公司出品的圖片載入器,內部使用OKHttp執行網路請求。

可以支援URL,FILE,資料庫等路徑的載入。圖片不會縮放,

Picasso & Glide

首先Glide是基於Picasso的二次開發

with參數:Glide可以使用Activity、fragment等。所以它的載入可以和actiivty的生命週期綁定。

Glide預設圖片ARGB_565 piocasso:ARGB_8888

Glide loading Gif but Picasso cannot. but Glide will using much memory with gif.

Glide will cache with size of imageview, so each size of imageview will contains one copy.

Picasso will only has one cahce copy with fullsize. so glide is faster than picasso.

Glide 有助於減少OOM的發生。

/** * Created by deman on 2016/3/30. */public interface IImageLoader { void initLoader(Context context); void load(String path, ImageView view, int width, int height); void load(String path, ImageView view);}IImageLoader public class ImageLoadManger { private IImageLoader iImageLoader = null; private static ImageLoadManger sInstance = null; public static synchronized ImageLoadManger getsInstance() { if (sInstance == null) { sInstance = new ImageLoadManger(); } return sInstance; } /** * initManager * @param context context */ public void initManager(Context context) { iImageLoader = new PicassoImageLoader(); iImageLoader.initLoader(context); } /** * load image with path * @param path path * @param imageView imageView */ public void load(String path, ImageView imageView) { if(null == iImageLoader) { throw new RuntimeException("initManager has not been init"); } iImageLoader.load(path, imageView); } /** * load image with path * @param path path * @param imageView imageView * @param width width * @param height height */ public void load(String path, ImageView imageView,int width,int height) { if(null == iImageLoader) { throw new RuntimeException("initManager has not been init"); } iImageLoader.load(path, imageView,width,height); }}ImageLoadMangerpublic class PicassoImageLoader implements IImageLoader { Picasso picasso; Context context; private void init() { picasso = new Picasso.Builder(context).build(); } @Override public void initLoader(Context context) { this.context = context; init(); } @Override public void load(String path, ImageView view,int width,int height) { if(null == path) { throw new RuntimeException("uri is null!"); } if(width == 0 || height == 0) { throw new RuntimeException("width & height is 0"); } picasso.load(path) .resize(width, height) .into(view); } @Override public void load(String path, ImageView view) { if(null == path) { throw new RuntimeException("uri is null!"); } picasso.load(path) .into(view); }}PicassoImageLoader

Glide 500K,Picasso 100K

Fresco,是facebook開源的一套圖片載入架構。它的使用是基於view層級的。SimpleDraweeView

Fresco, image pipline技術,三級緩衝。所以不容易oom。

第一層。bitmap緩衝:在5.0上,使用java heap,5.0一下,使用ashme記憶體,減少GC發生的機率。

app到後台,bitmap緩衝被清空。

第二層,記憶體緩衝。存放原始的壓縮圖片。

第三層,磁碟緩衝,不會被清空。

Fresco對記憶體的節省效果很大,尤其是低端機,可以減少OOM的幾率。

包比較大,而且使用起來也複雜。

7.Adapter 和 ListView 組合。

 

8.使用者Cookie設計。token的流程包括登陸流程。

 登陸設計:

1)登陸跳轉

首先是登陸到指定頁面,比如MainActivity,

還有就是登陸後,回到上一頁。

這2中需要在登陸的時候考慮到。

2)登陸的密碼驗證

密碼加密後傳輸,以參數的形式。

API使用https請求。

登陸成功後,需要把userinfo存到本地,以便退出後,可以自動登陸。

3)自動登陸

token機制。每次登陸成功後,本地儲存一個token資訊,同時token可以儲存到期的資訊機制。

token到期後,所有先關API(需要驗證token資訊的),都會返回相同的code資訊,然後統一處理。

彈出AlertDialog,讓使用者去判斷是否需要登陸。

9.網路請求的封裝。

Volley

Volley+okhttp

Retrofit

其中Retrofit+okHttp+Picasso 是square公司統一出品的。

主流的套路是,把每個架構都分開了,這樣便於替換。

Retrofit+okHttp /Volley+Okhttp   add  fastjson , Glide/Fresco + buttnkinfe/dragger2/androidannotation + Rebotim.

Android 架構學習之 第一天 okhttp & Retrofit

10.Android & H5 的互動。

H5調用andoriod代碼:

webSettings.setJavaScriptEnabled(true);

mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");

js回調,@JavascriptInterface

android 調用JS

mWebView.loadUrl("javascript:wave()");

跳轉協議:

當JS回調的時候,可以在shouldOverrideUrlLoading的時候

把URL配置成一個協議。

 

11.代碼混淆。

 混淆的開啟:androidstudio:

在gradle裡面,有

    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }

關鍵是minifyEnabled 編程true,混淆編譯就會開啟。

一般需要配置proguard-rules.pro

proguard4大過程:

壓縮,位元組碼最佳化,混淆,預檢。

proguard 可以配置版本:

proguard在sdk裡面。

proguard可以配置過程:

-dontshrink 不壓縮輸入的類檔案

-dontoptimize 不最佳化輸入的類檔案

-dontobfuscate 不混淆輸入的類檔案

12.android打包機制

包括sdk的命令。

Android原理揭秘之APk產生過程

打包過程:aapt用來產生資源檔R.java

java編譯器->class檔案,然後dex編譯成.dex檔案。

aapt放置的resource

打包成apk檔案。

其他的最終會產生dex檔案。+sign 過程,就是APK,當然可能需要壓縮最佳化。

13.線上Crash分析並修複的能力。

首先是,對於沒有處理的crash地方,通過UnCaughtExceptionHandler 來處理和收集日誌。

三步:

收集日誌並發送到伺服器

提示使用者處理

儲存到SD

需要把proguardmapping檔案儲存下來,以便線上app分析問題。

14.記憶體泄露,包括記憶體最佳化,記憶體泄露的情境,以及MAT工具的使用。

 請參見Android 進階面試題及答案

 

15.Monkey機制。 Android開發如何對一款App進行monkey測試。

monkey就是對螢幕進行隨機事件發送,一般次數都在1W次以上,主要測試結果是crash,ANR的事件。

monkey對象是apk

monkey的事件流是隨機的。

monkey的文檔:http://developer.android.com/guide/developing/tools/monkey.html

16.調試工具,包括DDMS,android studio的調試功能。

androidstudio工具:

AndroidMonitor:StartMethodTracing 測試method執行時間。

DDMS也有traceView,功能是一樣的。

測試View的布局:hierachyviewer.

debug:進階調試功能:

Evaluate Expression:在run菜單下面,有這個選項,它的功能同watch差不多,但是它可以測試執行語句。

條件斷點:在迴圈裡面,你只對i=9感興趣,你怎麼辦,在斷點的位置,右擊,出現條件。

日誌斷點:也是一個非常實用的技能,當我們某些情況下需要列印日誌,但是每次編譯非常耗時,這個時候,我們實用日誌斷點,可以列印日誌,而

不修改原始碼。在Debug視窗裡面的console裡面可以看到列印的日誌。

方法斷點:方法斷點就是在函數名的這一樣,斷點,它會在函數入口和結束的地方斷點。

異常斷點:就是Run->View blockpoint->javaException.

屬性斷點:就是在某個屬性被修改或者訪問的時候,但是多線程複雜環境下,很難發現。Run->View blockpoint->javaFieldWatchpoints.

DDMS:Android Studio中怎麼使用DDMS工具?

17.單元測試,Junit的使用,包括其他測試架構。

 

public class ExampleTest extends InstrumentationTestCase {    public void test() throws Exception {        final int expected = 1;        final int reality = 1;        assertEquals(expected, reality);    }    public void test_2() throws Exception{        final int expected = 2;        final int reality = 3;        assertEquals(expected,reality);    }}

需要在configration裡面配置。

18.GIT的進階功能,Stage,rebase,revert,stash,cherry pick & sub module

stage是index區, 一個概念,對應work區 和history區

revert:就是把某次曆史提交給取消掉,but它的提交記錄會被保留,也就是可以提交到遠程庫。

reset:只是回退曆史,回退內容可以被保留在work地區。

cherry pick:branch2 上的某條修改,需要merge到branch3上,but我只是需要這一條修改,用這條指令。

sub module:用處不是很大。

19.外掛程式化編程。

專開一篇講解

20.設計模式,對常見設計模式的熟悉程度。

 TBD.

21.熱修複技術。

 TBD.

22.React +Native架構

TBD.

23.訊息推送原理

 TBD.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.