52. Linux中跨進程通訊的幾種方式 。 linux編程所有是基於文件管理的。 # 管道( pipe ):管道也是一個文件,一個進程負責讀一個進程負責寫,管道是一種半雙工(2邊能夠通訊可是不能是同時的好比對講機)的通訊方式,數據只能單向流動,並且只能在具備親緣關係的進程間使用。進程的親緣關係一般是指父子進程(一個進程new了另外一個進程)關係或者兄弟進程(一個進程new了2個進程,這2個進程就是兄弟進程)。 # 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,可是它容許無親緣關係進程間的通訊。 # 信號量( semophore ) : 信號量是一個計數器,多線程中使用,能夠用來控制多個進程對共享資源的訪問。它常做爲一種鎖機制,防止某進程正在訪問共享資源時,其餘進程也訪問該資源。所以,主要做爲進程間以及同一進程內不一樣線程之間的同步手段。 # 消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。 # 信號 ( sinal ) : 信號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。 # 共享內存( shared memory ) :共享內存就是映射一段能被其餘進程所訪問的內存,這段共享內存由一個進程建立,但多個進程均可以訪問。共享內存是最快的 IPC 方式,它是針對其餘進程間通訊方式運行效率低而專門設計的。它每每與其餘通訊機制,如信號兩,配合使用,來實現進程間的同步和通訊。 # 套接字( socket ) : 套解口也是一種進程間通訊機制,與其餘通訊機制不一樣的是,它可用於不一樣及其間的進程通訊。 53. 談談對Android NDK的理解。用在windows系統, native develop kit 只是一個交叉編譯的工具 .so,主要用於編譯jni代碼,java效率不如C++的時候會去用jni ,C++編譯完後都是二進制代碼,手機分爲arm架構和x86架構,2中架構的CPU的指令集是不同的,在x86也就是windows上編譯出來的代碼不能運行在arm架構上,由於指令集不同,因此就要轉換這就要交叉編譯,在windows平臺下面須要編譯出來一套能適用在arm架構運行的二進制文件。 1.何時用ndk, 實時性要求高,遊戲,圖形渲染, opencv (人臉識別) , ffmpeg , rmvb mp5 avi 高清解碼. ffmpeg, opencore. 2.爲何用ndk,ndk的優勢 ,缺點 , 效率高可是出現bug很難定位。 咱們項目中那些地方用到了ndk, 54. 談談Android的優勢和不足之處。 1、開放性,開源 ophone 阿里雲( 徹底兼容android) 2、掙脫運營商束縛 3、豐富的硬件選擇 mtk作硬件的 ,高通作手機硬件的,android 4、不受任何限制的開發商 5、無縫結合的Google應用 缺點也有5處: 1、安全問題、隱私問題 :源碼能夠看見, 2、賣手機的不是最大運營商 3、運營商對Android手機仍然有影響,手機屏幕分辨率不同。 4、山寨化嚴重 5、過度依賴開發商,缺少標準配置 55. Android系統中GC什麼狀況下會出現內存泄露呢? 視頻編解碼/內存泄露 檢測內存泄露 工具 mat C:\Users\lenovo\Desktop\prof>hprof-conv com.example.testmat.hprof convert-com.ex ample.testmat.hprof 致使內存泄漏主要的緣由是,先前申請了內存空間而忘記了釋放(已經沒有用了可是沒有斷開引用就是泄漏,內存溢出就是內存不足)。若是程序中存在對無用對象的引用,那麼這些對象就會駐留內存,消耗內存,由於沒法讓垃圾回收器GC驗證這些對象是否再也不須要。若是存在對象的引用,這個對象就被定義爲"有效的活動",同時不會被釋放。要肯定對象所佔內存將被回收,咱們就要務必確認該對象再也不會被使用。典型的作法就是把對象數據成員設爲null或者從集合中移除該對象。但當局部變量不須要時,不需明顯的設爲null,由於一個方法執行完畢時,這些引用會自動被清理。 Java帶垃圾回收的機制,爲何還會內存泄露呢? Vector v = new Vector(10); for (int i = 1; i < 100; i++) { Object o = new Object(); v.add(o); o = null; }//此時,全部的Object對象都沒有被釋放,由於變量v引用這些對象。 Java 內存泄露的根本緣由就是 保存了不可能再被訪問的變量類型的引用 56. Android UI中的View如何刷新。 在主線程中 拿到view調用Invalide()方法,查看畫畫板裏面更新imageview的方法 在子線程裏面能夠經過postInvalide()方法; View view; view.invalidate();//主線程,讓view執行onDraw()方法 view.postInvalidate();//子線程,讓view執行onLayout()方法 57.簡單描述下Android 數字簽名。 簽名不同則不會覆蓋老軟件,若是新軟件包名和舊的同樣可是簽名不同則新的軟件也不會安裝。 Android 數字簽名 在Android系統中,全部安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係 Android系統要求每個安裝進系統的應用程序都是通過數字證書籤名的,數字證書的私鑰則保存在程序開發者的手中。Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序。 這個數字證書並不須要權威的數字證書籤名機構認證(CA),它只是用來讓應用程序包自我認證的。 同一個開發者的多個程序儘量使用同一個數字證書,這能夠帶來如下好處。 (1)有利於程序升級,當新版程序和舊版程序的數字證書相同時,Android系統纔會認爲這兩個程序是同一個程序的不一樣版本。若是新版程序和舊版程序的數字證書不相同,則Android系統認爲他們是不一樣的程序,併產生衝突,會要求新程序更改包名。 (2)有利於程序的模塊化設計和開發。Android系統容許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視爲同一個程序。因此開發者能夠將本身的程序分模塊開發,而用戶只須要在須要的時候下載適當的模塊。 在簽名時,須要考慮數字證書的有效期: (1)數字證書的有效期要包含程序的預計生命週期,一旦數字證書失效,持有改數字證書的程序將不能正常升級。 (2)若是多個程序使用同一個數字證書,則該數字證書的有效期要包含全部程序的預計生命週期。 (3)Android Market強制要求全部應用程序數字證書的有效期要持續到2033年10月22日之後。 Android數字證書包含如下幾個要點: (1)全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序 (2)Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證 (3)若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。 (4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。 58. 什麼是ANR 如何避免它? 在Android上,若是你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框。用戶能夠選擇讓程序繼續運行,可是,他們在使用你的應用程序時,並不但願每次都要處理這個對話框。所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。 Activity 5秒 broadcast10秒 耗時的操做 worker thread裏面完成, handler message…AsynTask , intentservice.等… 59. android中的動畫有哪幾類,它們的特色和區別是什麼? 兩種,一種是Tween移動,縮放,旋轉,動畫、還有一種是Frame跟視頻同樣動畫。 Tween動畫,這種實現方式可使視圖組件移動、放大、縮小以及產生透明度的變化; 能夠經過佈局文件,能夠經過代碼 1、 控制View的動畫 a) alpha(AlphaAnimation) 漸變透明 b) scale(ScaleAnimation) 漸變尺寸伸縮 c) translate(TranslateAnimation) 畫面轉換、位置移動 d) rotate(RotateAnimation) 畫面轉移,旋轉動畫 2、 控制一個Layout裏面子View的動畫效果 a) layoutAnimation(LayoutAnimationController) b) gridAnimation(GridLayoutAnimationController) 另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。 屬性動畫 ObjectAnimator :改變view位置 62. 說說mvc模式的原理,它在android中的運用。 MVC英文即Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分紅三個層——模型層、視圖層、控制層。 Android中界面部分也採用了當前比較流行的MVC框架,在Android中M就是應用程序中二進制的數據,V就是用戶的界面。Android的界面直接採用XML文件保存的,界面開發變的很方便。在Android中C也是很簡單的,一個Activity能夠有多個界面,只須要將視圖的ID傳遞到setContentView(),就指定了以哪一個視圖模型顯示數據。 在Android SDK中的數據綁定,也都是採用了與MVC框架相似的方法來顯示數據。在控制層上將數據按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就能夠直接在視圖模型上顯示了,從而實現了數據綁定。好比顯示Cursor中全部數據的ListActivity,其視圖層就是一個ListView,將數據封裝爲ListAdapter,並傳遞給ListView,數據就在ListView中顯示。 63. 經過點擊一個網頁上的url 就能夠完成程序的自動安裝,描述下原理 Day11 AddJavascriptInterface new Object{ callphone(); installapk(); } 64,Service和Activity在同一個線程嗎 默認狀況同一線程 main主線程 ui線程 65,java中的soft reference是個什麼東西 StrongReference 是 Java 的默認引用實現, 它會盡量長時間的存活於 JVM 內, 當沒有任何對象指向它時 GC 執行後將會被回收 SoftReference 會盡量長的保留引用直到 JVM 內存不足時纔會被回收(虛擬機保證), 這一特性使得 SoftReference 很是適合緩存 應用詳細見客戶端圖片的緩存 66,udp鏈接和TCP的不一樣之處 tcp/滑動窗口協議. 擁塞控制. 面向鏈接 流 udp 不關心數據是否達到,是否阻塞 面向無鏈接 畫面優先. tcp 流暢優先 udp 67, android開發中怎麼去調試bug 邏輯錯誤 1.斷點 debug 2. logcat , traceview 界面佈局,顯示 hierarchyviewer.bat 68.service裏面能夠彈土司麼 能夠 69.寫10個簡單的linux命令 cat ls ps psw wc mv rm cd ping tracert find grep tail vi gcc make ifconfig startup dhcp 70 JNI調用經常使用的兩個參數 JNIEnv *env, jobject javaThis 71. 書寫出android工程的目錄結構 src android. jar asset res gen manifest 72. ddms 和traceview的區別. daivilk debug manager system 1.在應用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字"); 2.一樣在主activity的onStop方法中加入Debug.stopMethodTracing(); 3.同時要在AndroidManifest.xml文件中配置權限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 3.從新編譯,安裝,啓動服務,測試完成取對應的traceview文件(adb pull /sdcard/xxxx.trace)。 4.直接在命令行輸入traceview xxxxtrace,彈出traceview窗口,分析對應的應用便可。 traceview 分析程序執行時間和效率 KPI : key performance information : 關鍵性能指標: splash界面不能超過5秒 從splash 界面加載mainactivity 不能超過0.7秒 對於Android 1.5及如下的版本:不支持。 對於Android 1.5以上2.1下(含2.1)的版本:受限支持。trace文件只能生成到SD卡,且必須在程序中加入代碼。 對於Android 2.2上(含2.2)的版本:全支持。能夠不用SD卡,不用在程序中加代碼,直接本身用DDMS就能夠進程Traceview。 73. 利用mvc的模式重構代碼 1) 重構前的代碼Bmi.java: package com.demo.android.bmi; import java.text.DecimalFormat; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class Bmi extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Listen for button clicks Button button = (Button) findViewById(R.id.submit); button.setOnClickListener(calcBMI); } private OnClickListener calcBMI = new OnClickListener() { @Override public void onClick(View v) { DecimalFormat nf = new DecimalFormat("0.00"); EditText fieldheight = (EditText) findViewById(R.id.height); EditText fieldweight = (EditText) findViewById(R.id.weight); double height = Double.parseDouble(fieldheight.getText().toString()) / 100; double weight = Double.parseDouble(fieldweight.getText().toString()); double BMI = weight / (height * height); TextView result = (TextView) findViewById(R.id.result); result.setText("Your BMI is " + nf.format(BMI)); // Give health advice TextView fieldsuggest = (TextView) findViewById(R.id.suggest); if (BMI > 25) { fieldsuggest.setText(R.string.advice_heavy); } else if (BMI < 20) { fieldsuggest.setText(R.string.advice_light); } else { fieldsuggest.setText(R.string.advice_average); } } }; } Step1:抽取全部界面元件的聲明和定義,整合到單獨一個函數findViews()中; // 聲明 view private Button button_calc; private EditText field_height; private EditText field_weight; private TextView view_result; private TextView view_suggest; // 定義 private void findViews() { button_calc = (Button) findViewById(R.id.submit); field_height = (EditText) findViewById(R.id.height); field_weight = (EditText) findViewById(R.id.weight); view_result = (TextView) findViewById(R.id.result); view_suggest = (TextView) findViewById(R.id.suggest); } 此部分便是MVC中的V:View視圖。 Step2:抽取程序的邏輯(即界面元件的處理邏輯),整合到函數setListensers()中; //Listen for button clicks private void setListensers() { button_calc.setOnClickListener(calcBMI); } 此部分便是MVC中的C:Controller控制器。 接着,onCreate()就顯得很是簡潔、明瞭了: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViews(); setListensers(); } Step3:修改按鈕監聽器calcBMI中相應的部分(主要是變量已經在視圖部分定義了); private OnClickListener calcBMI = new OnClickListener() { @Override public void onClick(View v) { DecimalFormat nf = new DecimalFormat("0.00"); double height = Double.parseDouble(field_height.getText().toString()) / 100; double weight = Double.parseDouble(field_weight.getText().toString()); double BMI = weight / (height * height); // Present result view_result.setText("Your BMI is " + nf.format(BMI)); // Give health advice if (BMI > 25) { view_suggest.setText(R.string.advice_heavy); } else if (BMI < 20) { view_suggest.setText(R.string.advice_light); } else { view_suggest.setText(R.string.advice_average); } } }; 總之,此重構的目的無非是使程序的脈絡更加清晰,即讓人一眼望去,就能很容易地分辨出界面(View)應該寫在哪裏,程序邏輯(Controller)應該寫在哪裏,最終使維護和擴展代碼變得更加容易! 其實,重構很簡單,通讀代碼,感受哪邊不太爽,就改那邊吧!(我目前的感覺) 一個良好的代碼應該是能讓人感到舒服的! 2) 重構後的代碼Bmi.java: package com.demo.android.bmi; import java.text.DecimalFormat; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class Bmi extends Activity { private Button button_calc; private EditText field_height; private EditText field_weight; private TextView view_result; private TextView view_suggest; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViews(); setListensers(); } // 定義 private void findViews() { button_calc = (Button) findViewById(R.id.submit); field_height = (EditText) findViewById(R.id.height); field_weight = (EditText) findViewById(R.id.weight); view_result = (TextView) findViewById(R.id.result); view_suggest = (TextView) findViewById(R.id.suggest); } // Listen for button clicks private void setListeners() { calcbutton.setOnClickListener(calcBMI); } private Button.OnClickListener calcBMI = new Button.OnClickListener() { public void onClick(View v) { DecimalFormat nf = new DecimalFormat("0.0"); double height = Double.parseDouble(field_height.getText().toString()) / 100; double weight = Double.parseDouble(field_weight.getText().toString()); double BMI = weight / (height * height); // Present result view_result.setText(getText(R.string.bmi_result) + nf.format(BMI)); // Give health advice if (BMI > 25) { view_suggest.setText(R.string.advice_heavy); } else if (BMI < 20) { view_suggest.setText(R.string.advice_light); } else { view_suggest.setText(R.string.advice_average); } } }; }