亚洲v欧美v国产v在线成_制服丝袜中文字幕丝袜专区_一区二区三区韩国电影_激情欧美一区二区中文字幕

我要投稿 投訴建議

android面試題

時間:2024-08-16 16:06:11 面試試題 我要投稿

android面試題

 1. 什么是Activity?

android面試題

  四大組件之一,一般的,一個用戶交互界面對應(yīng)一個activity

  setContentView() ,// 要顯示的布局

  , activity 是Context的子類,同時實(shí)現(xiàn)了window.callback和keyevent.callback, 可以處理與窗體用戶交互的事件.

  button.setOnclickLinstener{}

  我開發(fā)常用的的有ListActivity , PreferenceActivity ,TabAcitivty等…

  如果界面有共同的特點(diǎn)或者功能的時候,還會自己定義一個BaseActivity.

  進(jìn)度對話框的顯示與銷毀 doubanservice

  2. 請描述一下Activity 生命周期。

  生命周期描述的是一個類 從創(chuàng)建(new出來)到死亡(垃圾回收)的過程中會執(zhí)行的方法..

  在這個過程中 會針對不同的生命階段會調(diào)用不同的方法

  Activity從創(chuàng)建到銷毀有多種狀態(tài),從一種狀態(tài)到另一種狀態(tài)時會激發(fā)相應(yīng)的回調(diào)方法,這些回調(diào)方法包括:oncreate ondestroy onstop onstart onresume onpause

  其實(shí)這些方法都是兩兩對應(yīng)的,onCreate創(chuàng)建與onDestroy銷毀;

  onStart可見與onStop不可見;onResume可編輯(即焦點(diǎn))與onPause;

  對話框的彈出, Activity.this

  這6個方法是相對應(yīng)的,那么就只剩下一個onRestart方法了,這個方法在什么時候調(diào)用呢?

  答案就是:在Activity被onStop后,但是沒有被onDestroy,在再次啟動此Activity時就調(diào)用onRestart(而不再調(diào)用onCreate)方法;

  如果被onDestroy了,則是調(diào)用onCreate方法。

  最后講自己項(xiàng)目中的經(jīng)驗(yàn),比如說豆瓣客戶端每次進(jìn)入某個界面的時候都要看到最新的數(shù)據(jù),這個刷新列表的操作 就放在onStart()的方法里面.

  fillData() 這樣保證每次用戶看到的數(shù)據(jù)都是最新的.

  多媒體播放, 播放來電話. onStop() 視頻, 視頻聲音設(shè)置為0 , 記錄視頻播放的位置 mediaplayer.pause();

  onStart() 根據(jù)保存的狀態(tài)恢復(fù)現(xiàn)場. mediaplayer.start();

  在讀文檔的時候 還發(fā)現(xiàn) activity還有兩個方法 onPostResume() 和 OnPostCreate()這兩個生命周期的方法,不過開發(fā)的時候沒有用到過.

  3. 兩個Activity之間跳轉(zhuǎn)時必然會執(zhí)行的是哪幾個方法。

  一般情況比如說有兩個activity,分別叫A,B ,當(dāng)在A里面激活B組件的時候, A 會調(diào)用 onPause()方法,然后B 調(diào)用onCreate() ,onStart(), OnResume() ,

  這個時候B覆蓋了窗體, A會調(diào)用onStop()方法. 如果B呢 是個透明的,或者是對話框的樣式, 就不會調(diào)用onStop()方法

  4. 橫豎屏切換時候Activity的生命周期。

  這個生命周期跟清單文件里的配置有關(guān)系

  1、不設(shè)置Activity的android:configChanges時,切屏?xí)匦抡{(diào)用各個生命周期

  默認(rèn)首先銷毀當(dāng)前activity,然后重新加載

  2、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法

  游戲開發(fā)中, 屏幕的朝向都是寫死的.

  5. 如何將一個Activity設(shè)置成窗口的樣式。

  可以自定義一個activity的樣式,詳細(xì)見手機(jī)衛(wèi)士的程序詳細(xì)信息

  android:theme="@style/FloatActivity"

  E:\day9\mobilesafe\res\values\style

  6. 你后臺的Activity被系統(tǒng) 回收怎么辦?如果后臺的Activity由于某原因被系統(tǒng)回收可了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?

  除了在棧頂?shù)腶ctivity,其他的activity都有可能在內(nèi)存不足的時候被系統(tǒng)回收,一個activity越處于棧底,被回收的可能性越大.

  protected void onSaveInstanceState(Bundle outState) {

  super.onSaveInstanceState(outState);

  outState.putLong("id", 1234567890);

  }

  public void onCreate(Bundle savedInstanceState) {

  //判斷 savedInstanceState是不是空.

  //如果不為空就取出來

  super.onCreate(savedInstanceState);

  }

  7. 如何退出Activity?如何安全退出已調(diào)用多個Activity的Application?

  退出activity 直接調(diào)用 finish () 方法 . //用戶點(diǎn)擊back鍵 就是退出一個activity

  退出activity 會執(zhí)行 onDestroy()方法 .

  1、拋異常強(qiáng)制退出:

  該方法通過拋異常,使程序Force Close。

  驗(yàn)證可以,但是,需要解決的問題是,如何使程序結(jié)束掉,而不彈出Force Close的窗口。

  //安全結(jié)束進(jìn)程 android.os.Process.killProcess(android.os.Process.myPid());

  2、記錄打開的Activity:

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

  List lists ; 在application 全集的環(huán)境里面

  lists = new ArrayList();

  lists.add(activity);

  for(Activity activity: lists)

  {

  activity.finish();

  }

  3、發(fā)送特定廣播:

  在需要結(jié)束應(yīng)用時,發(fā)送一個特定的廣播,每個Activity收到廣播后,關(guān)閉即可。

  //給某個activity 注冊接受接受廣播的意圖

  registerReceiver(receiver, filter)

  //如果過接受到的是 關(guān)閉activity的廣播 就調(diào)用finish()方法 把當(dāng)前的activity finish()掉

  4、遞歸退出

  在打開新的Activity時使用startActivityForResult,然后自己加標(biāo)志,在onActivityResult中處理,遞歸關(guān)閉。

  上面是網(wǎng)上的一些做法.

  其實(shí) 可以通過 intent的flag 來實(shí)現(xiàn).. intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一個新的activity,然后在新的activity的oncreate方法里面 finish掉.

  Intent intent = new Intent(this,B.class);

  intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

  局限性 :所有的activity的啟動模式都要是默認(rèn)的啟動模式

  講一講你對activity的理解

  把上面的幾點(diǎn)用自己的心得寫出來

  8. service是否在main thread中執(zhí)行, service里面是否能執(zhí)行耗時的操作?

  默認(rèn)情況,如果沒有顯示的指定service所運(yùn)行的進(jìn)程, Service和activity是運(yùn)行在當(dāng)前app所在進(jìn)程的main thread(UI主線程)里面

  service里面不能執(zhí)行耗時的操作(網(wǎng)絡(luò)請求,拷貝數(shù)據(jù)庫,大文件 )

  在子線程中執(zhí)行 new Thread(){}.start();

  特殊情況 ,可以在清單文件配置 service 執(zhí)行所在的進(jìn)程 ,讓service在另外的進(jìn)程中執(zhí)行

  9. 兩個Activity之間怎么傳遞數(shù)據(jù)?

  基本數(shù)據(jù)類型可以通過. Intent 傳遞數(shù)據(jù)

  extras.putDouble(key, value)

  intent.putExtra(name, value)

  // 通過intent putExtra 方法 基本數(shù)據(jù)類型 都傳遞

  Bundle bundle = new Bundle();

  bumdle.putShort(key, value);

  intent.putExtras(bundle);

  intent.putExtras(bundle)

  獲取到激活他的 getIntent();

  Intent intent = getIntent();

  Bundle bundle = intent.getExtras();

  intent.getStringExtra("key","value");

  intent.getBooleanExtra("key","value")

  Application 全局里面存放 對象 ,自己去實(shí)現(xiàn)自己的application的這個類,基礎(chǔ)系統(tǒng)的application , 每個activity都可以取到

  讓對象實(shí)現(xiàn) implements Serializable 接口把對象存放到文件上.

  讓類實(shí)現(xiàn)Serializable 接口,然后可以通過 ObjectOutputStream //對象輸出流

  File file = new File("c:\\1.obj");

  FileOutputStream fos = new FileOutputStream(file);

  ObjectOutputStream oos = new ObjectOutputStream(fos);

  Student stu = new Student();

  stu.setId("10001");

  stu.setName("zs");

  oos.writeObject(stu);

  FileInputStream fis = new FileInputStream(file);

  ObjectInputStream ois = new ObjectInputStream(fis);

  Student stu1 = (Student) ois.readObject();

  System.out.println(stu1.getName());

  Parcelable 和 Serializable

  Parcelable 把對象序列化到android操作系統(tǒng) 的一塊公用的內(nèi)存空間

  文件/網(wǎng)絡(luò)

  intent.setData(Uri)

  Uri.fromFile(); //大圖片的傳遞

  contentResolver.getInputStream(url);

  10. 怎么讓在啟動一個Activity是就啟動一個service?

  在activity的onCreate()方法里面 startService();

  11. 同一個程序,但不同的Activity是否可以放在不同的Task任務(wù)棧中?

  比方說在激活一個新的activity時候, 給intent設(shè)置flag

  Intent的flag添加FLAG_ACTIVITY_NEW_TASK

  這個被激活的activity就會在新的task棧里面…

  Intent intent = new Intent(A.this,B.class);

  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

  startActivity(intent);

  12. Activity怎么和service綁定,怎么在activity中啟動自己對應(yīng)的service?

  startService() 一旦被創(chuàng)建 調(diào)用著無關(guān) 沒法使用service里面的方法

  bindService () 把service 與調(diào)用者綁定 ,如果調(diào)用者被銷毀, service會銷毀

  bindService() 我們可以使用service 里面的方法

  bindService(). 讓activity能夠訪問到 service里面的方法

  構(gòu)建一個intent對象,

  Intent service = new Intent(this,MyService.class);

  通過bindService的方法去啟動一個服務(wù),

  bindService(intent, new MyConn(), BIND_AUTO_CREATE);

  ServiceConnection 對象(重寫onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.

  private class myconn implements ServiceConnection

  {

  public void onServiceConnected(ComponentName name, IBinder service) {

  // TODO Auto-generated method stub

  //可以通過IBinder的對象 去使用service里面的方法

  }

  public void onServiceDisconnected(ComponentName name) {

  // TODO Auto-generated method stub

  }

  13. 14 .什么是Service以及描述下它的生命周期。Service有哪些啟動方法,有什么區(qū)別,怎樣停用Service?

  在Service的生命周期中,被回調(diào)的方法比Activity少一些,只有onCreate, onStart, onDestroy,

  onBind和onUnbind。

  通常有兩種方式啟動一個Service,他們對Service生命周期的影響是不一樣的。

  1 通過startService

  Service會經(jīng)歷 onCreate 到onStart,然后處于運(yùn)行狀態(tài),stopService的時候調(diào)用onDestroy方法。

  如果是調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會一直在后臺運(yùn)行。

  2 通過bindService

  Service會運(yùn)行onCreate,然后是調(diào)用onBind, 這個時候調(diào)用者和Service綁定在一起。調(diào)用者退出了,Srevice就會調(diào)用onUnbind->onDestroyed方法。

  所謂綁定在一起就共存亡了。調(diào)用者也可以通過調(diào)用unbindService方法來停止服務(wù),這時候Srevice就會調(diào)用onUnbind->onDestroyed方法。

  需要注意的是如果這幾個方法交織在一起的話,會出現(xiàn)什么情況呢?

  一個原則是Service的onCreate的方法只會被調(diào)用一次,就是你無論多少次的startService又bindService,Service只被創(chuàng)建一次。

  如果先是bind了,那么start的時候就直接運(yùn)行Service的onStart方法,如果先是start,那么bind的時候就直接運(yùn)行onBind方法。

  如果service運(yùn)行期間調(diào)用了bindService,這時候再調(diào)用stopService的話,service是不會調(diào)用onDestroy方法的,service就stop不掉了,只能調(diào)用UnbindService, service就會被銷毀

  如果一個service通過startService 被start之后,多次調(diào)用startService 的話,service會多次調(diào)用onStart方法。多次調(diào)用stopService的話,service只會調(diào)用一次onDestroyed方法。

  如果一個service通過bindService被start之后,多次調(diào)用bindService的話,service只會調(diào)用一次onBind方法。

  多次調(diào)用unbindService的話會拋出異常。

  15. 不用service,B頁面為音樂播放,從A跳轉(zhuǎn)到B,再返回,如何使音樂繼續(xù)播放?

  這個問題問的很山寨.默認(rèn)不做任何處理,B里面的音樂都能播放.

  遇到問題, 可以隨機(jī)應(yīng)變,靈活發(fā)揮,多考慮些細(xì)節(jié),比如說這個題就可以這樣說,說說你對startActivityForResult的理解()

  A開啟B的時候,用startActivityForResult()方法, B返回的時候把播放的狀態(tài)信息返回給A ,A繼續(xù)播放音樂.

  16. 什么是IntentService?有何優(yōu)點(diǎn)?

  普通的service ,默認(rèn)運(yùn)行在ui main 主線程

  Sdk給我們提供的方便的,帶有異步處理的service類,

  異步處理的方法 OnHandleIntent()

  OnHandleIntent() 處理耗時的操作

  17. 什么時候使用Service?

  擁有service的進(jìn)程具有較高的優(yōu)先級

  官方文檔告訴我們,Android系統(tǒng)會盡量保持擁有service的進(jìn)程運(yùn)行,只要在該service已經(jīng)被啟動(start)或者客戶端連接(bindService)到它。當(dāng)內(nèi)存不足時,需要保持,擁有service的進(jìn)程具有較高的優(yōu)先級。

  1. 如果service正在調(diào)用onCreate, onStartCommand或者onDestory方法,那么用于當(dāng)前service的進(jìn)程相當(dāng)于前臺進(jìn)程以避免被killed。

  2. 如果當(dāng)前service已經(jīng)被啟動(start),擁有它的進(jìn)程則比那些用戶可見的進(jìn)程優(yōu)先級低一些,但是比那些不可見的進(jìn)程更重要,這就意味著service一般不會被killed.

  3. 如果客戶端已經(jīng)連接到service (bindService),那么擁有Service的進(jìn)程則擁有最高的優(yōu)先級,可以認(rèn)為service是可見的。

  4. 如果service可以使用startForeground(true)方法來將service設(shè)置為前臺狀態(tài),那么系統(tǒng)就認(rèn)為是對用戶可見的,并不會在內(nèi)存不足時killed。

  如果有其他的應(yīng)用組件作為Service,Activity等運(yùn)行在相同的進(jìn)程中,那么將會增加該進(jìn)程的重要性。

  1.Service的特點(diǎn)可以讓他在后臺一直運(yùn)行,可以在service里面創(chuàng)建線程去完成耗時的操作. 天氣預(yù)報(bào) widget TimerTask Timer 定期執(zhí)行timertask

  2.Broadcast receiver捕獲到一個事件之后,可以起一個service來完成一個耗時的操作.

  Broadcast receiver生命周期 和 響應(yīng)時間很短

  3.遠(yuǎn)程的service如果被啟動起來,可以被多次bind, 但不會重新create. 索愛手機(jī)X10i的人臉識別的service可以被圖庫使用,可以被攝像機(jī),照相機(jī)等程序使用.

  18. 請描述一下Intent 和 Intent Filter。

  Android 中通過 Intent 對象來表示一條消息,一個 Intent 對象不僅包含有這個消息的目的地,還可以包含消息的內(nèi)容,這好比一封 Email,其中不僅應(yīng)該包含收件地址,還可以包含具體的內(nèi)容。對于一個 Intent 對象,消息“目的地”是必須的,而內(nèi)容則是可選項(xiàng)。

  通過Intent 可以實(shí)現(xiàn)各種系統(tǒng)組件的調(diào)用與激活.

  Intent filter: 可以理解為郵局或者是一個信箋的分揀系統(tǒng)…

  這個分揀系統(tǒng)通過3個參數(shù)來識別

  Action: 動作 view

  Data: 數(shù)據(jù)uri uri

  Category : 而外的附加信息

  Action 匹配

  Action 是一個用戶定義的字符串,用于描述一個 Android 應(yīng)用程序組件,一個 Intent Filter 可以包含多個 Action。在 AndroidManifest.xml 的 Activity 定義時可以在其 節(jié)點(diǎn)指定一個 Action 列表用于標(biāo)示 Activity 所能接受的“動作”,例如:

  ……

  如果我們在啟動一個 Activity 時使用這樣的 Intent 對象:

  Intent intent =new Intent();

  intent.setAction("cn.itcast.action");

  那么所有的 Action 列表中包含了“cn.itcast”的 Activity 都將會匹配成功。

  Android 預(yù)定義了一系列的 Action 分別表示特定的系統(tǒng)動作。這些 Action 通過常量的方式定義在 android.content. Intent中,以“ACTION_”開頭。我們可以在 Android 提供的文檔中找到它們的詳細(xì)說明。

  URI 數(shù)據(jù)匹配

  一個 Intent 可以通過 URI 攜帶外部數(shù)據(jù)給目標(biāo)組件。在 節(jié)點(diǎn)中,通過 節(jié)點(diǎn)匹配外部數(shù)據(jù)。

  mimeType 屬性指定攜帶外部數(shù)據(jù)的數(shù)據(jù)類型,scheme 指定協(xié)議,host、port、path 指定數(shù)據(jù)的位置、端口、和路徑。如下:

  android:host="host" android:port="port" android:path="path"/>

  電話的uri tel: 12345

  http://www.baidu.com

  自己定義的uri itcast://cn.itcast/person/10

  如果在 Intent Filter 中指定了這些屬性,那么只有所有的屬性都匹配成功時 URI 數(shù)據(jù)匹配才會成功。

  Category 類別匹配

  節(jié)點(diǎn)中可以為組件定義一個 Category 類別列表,當(dāng) Intent 中包含這個列表的所有項(xiàng)目時 Category 類別匹配才會成功。

  默認(rèn)是DEFAULT

  19. Intent傳遞數(shù)據(jù)時,可以傳遞哪些類型數(shù)據(jù)?

  1.一般的基本數(shù)據(jù)類型 Intent .putextra() intent.getStringextra();

  2.數(shù)據(jù)的uri, intent.setData() intent.getData();

  20. 說說Activity,Intent,Service是什么關(guān)系 。

  麥當(dāng)勞和麥當(dāng)娜的關(guān)系是什么關(guān)系?

  這種問題,就講下activity,講一下service,說一下 通過intent去激活組件,傳遞數(shù)據(jù).

  說自己項(xiàng)目中有這樣一個網(wǎng)絡(luò)更新的功能,顯示界面就用的activity, 后臺有個service每隔半小時都去訪問下服務(wù)器獲取更新的數(shù)據(jù)…

  開啟服務(wù)用的是intent來開啟

  21. 請描述一下Broadcast Receiver。

  有很多廣播接收者 ,系統(tǒng)已經(jīng)實(shí)現(xiàn)了.

  廣播分兩種

  有序廣播

  無序廣播

  指定接收者的廣播 . 是不可以被攔截掉的

  onReceive() 方法.

  abortBroadcast();

  有序廣播有一個特例

  sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);

  resultReceiver 廣播接受者 如果我們顯示的指定了廣播接收者

  無論如何 都會接受廣播 時間 abortBroadcast(); 的方法不會終止廣播時間

  Sticky

  sendStickyBroadcast(intent) // 陰魂不散的廣播

  Wifi設(shè)置

  用于接收系統(tǒng)的廣播通知, 系統(tǒng)會有很多sd卡掛載,手機(jī)重啟,廣播通知,低電量,來短信等,一個apk的安裝成功….

  手機(jī)衛(wèi)士中自定義一個broadcast receiver

  sms_received

  來獲取短信到來的廣播, 根據(jù)黑名單來判斷是否攔截該短信.

  畫畫板生成圖片后,發(fā)送一個sd掛載的通知,通知系統(tǒng)的gallery去獲取到新的圖片.

  Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse(" file://"+Environment.getExternalStorageDirectory ()));

  sendBroadcast(intent);

  22. 在manifest和代碼中如何注冊和使 用 broadcast receiver 。

  設(shè)置廣播接收者的優(yōu)先級,設(shè)置廣播接受者的action名字 等…

  詳細(xì)見工程代碼.

  代碼中注冊,如果代碼沒有執(zhí)行,就接受不到廣播事件

  registerReceiver(receiver, filter)

  23. 請介紹下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)共享的。

  把自己的數(shù)據(jù)通過uri的形式共享出去

  android 系統(tǒng)下 不同程序 數(shù)據(jù)默認(rèn)是不能共享訪問

  需要去實(shí)現(xiàn)一個類去繼承ContentProvider

  public class PersonContentProvider extends ContentProvider{

  public boolean onCreate(){

  //..

  }

  query(Uri, String[], String, String[], String)

  insert(Uri, ContentValues)

  update(Uri, ContentValues, String, String[])

  delete(Uri, String, String[])

  }

  content:// 代表contentprovider

  技巧: 1.看urlmarcher.

  2. 根據(jù)匹配碼 查看增刪改查的具體實(shí)現(xiàn)

  24. 請介紹下Android的數(shù)據(jù)存儲方式。

  文件 訪問權(quán)限. sdcard

  / context.openFileInput(name) 默認(rèn)是私有的訪問權(quán)限

  數(shù)據(jù)庫 sqlite

  網(wǎng)絡(luò) socket tcp udp ,

  http httpurlconnection

  ftp的網(wǎng)絡(luò)

  25. 為什么要用ContentProvider?它和sql的實(shí)現(xiàn)上有什么差別?

  屏蔽數(shù)據(jù)存儲的細(xì)節(jié),對用戶透明,用戶只需要關(guān)心操作數(shù)據(jù)的uri就可以了,對應(yīng)的參數(shù) .

  不同app之間共享,操作數(shù)據(jù)

  但是contentprovider 還可以去增刪改查本地文件. xml文件的讀取,更改,

  網(wǎng)絡(luò)數(shù)據(jù)讀取更改

  Sql也有增刪改查的方法.

  26. 請介紹下Android中常用的五種布局。

  FrameLayout(幀布局),LinearLayout (線性布局),AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格布局)

  FrameLayout

  從屏幕的左上角開始布局,疊加顯示, 實(shí)際應(yīng)用 播放器的暫停按鈕.

  LinearLayout

  線性布局,這個東西,從外框上可以理解為一個div,他首先是一個一個從上往下羅列在屏幕上。每一個LinearLayout里面又可分為垂直布局

  (android:orientation="vertical")和水平布局(android:orientation="horizontal"

  )。當(dāng)垂直布局時,每一行就只有一個元素,多個元素依次垂直往下;水平布局時,只有一行,每一個元素依次向右排列。

  AbsoluteLayout

  絕對布局猶如div指定了absolute屬性,用X,Y坐標(biāo)來指定元素的位置android:layout_x="20px"

  android:layout_y="12px"

  qq斗地主 qq游戲大廳 800*480 800*480.apk fwvga 854*480

  指定平板機(jī)型的游戲開發(fā)中經(jīng)常用到絕對布局 widget 絕對布局

  指定機(jī)型的平板游戲開發(fā). 2.3 3.0

  1. 界面布局 任務(wù)管理器 gridview

  2. 手機(jī) 任務(wù)管理 listview

  lephone

  lepad

  RelativeLayout

  相對布局可以理解為某一個元素為參照物,來定位的布局方式。主要屬性有:

  相對于某一個元素

  android:layout_below="@id/aaa" 該元素在 id為aaa的下面

  android:layout_toLeftOf="@id/bbb" 改元素的左邊是bbb

  相對于父元素的地方

  android:layout_alignParentLeft="true" 在父元素左對齊

  android:layout_alignParentRight="true" 在父元素右對齊

  TableLayout

  表格布局類似Html里面的Table。每一個TableLayout里面有表格行TableRow,TableRow里面可以具體定義每一個元素,設(shè)定他的對齊方式 android:gravity="" 。

  每一個布局都有自己適合的方式,另外,這五個布局元素可以相互嵌套應(yīng)用,做出美觀的界面。

  oa 自動化 生成報(bào)表 ,圖標(biāo) 表示

  css div

  webview

  27. 談?wù)刄I中, Padding和Margin有什么區(qū)別?

  Padding 文字對邊框, margin是控件與控件之間的距離

  28. widget相對位置的完成在activity的哪個生命周期階段實(shí)現(xiàn)。

  這個題沒看懂…

  widget可以理解成桌面小控件,

  也可以理解成 某個button, imageview這樣的控件…

  onmeasure() // 計(jì)算 控件在屏幕上的位子

  某個view 要顯示在界面 ondraw 被顯示到界面上的

  29. 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關(guān)系。

  Handler簡介:

  一個Handler允許你發(fā)送和處理Message和Runable對象,這些對象和一個線程的MessageQueue相關(guān)聯(lián)。每一個線程實(shí)例和一個單獨(dú)的線程以及該線程的MessageQueue相關(guān)聯(lián)。當(dāng)你創(chuàng)建一個新的Handler時,它就和創(chuàng)建它的線程綁定在一起了。這里,線程我們也可以理解為線程的MessageQueue。從這一點(diǎn)上來看,Handler把Message和Runable對象傳遞給MessageQueue,而且在這些對象離開MessageQueue時,Handler負(fù)責(zé)執(zhí)行他們。

  Handler有兩個主要的用途:(1)確定在將來的某個時間點(diǎn)執(zhí)行一個或者一些Message和Runnable對象。(2)在其他線程(不是Handler綁定線程)中排入一些要執(zhí)行的動作。

  Scheduling Message,即(1),可以通過以下方法完成:

  post(Runnable):Runnable在handler綁定的線程上執(zhí)行,也就是說不創(chuàng)建新線程。

  postAtTime(Runnable,long):

  postDelayed(Runnable,long):

  sendEmptyMessage(int):

  sendMessage(Message):

  sendMessageAtTime(Message,long):

  sendMessageDelayed(Message,long):

  post這個動作讓你把Runnable對象排入MessageQueue,MessageQueue受到這些消息的時候執(zhí)行他們,當(dāng)然以一定的排序。sendMessage這個動作允許你把Message對象排成隊(duì)列,這些Message對象包含一些信息,Handler的hanlerMessage(Message)會處理這些Message.當(dāng)然,handlerMessage(Message)必須由Handler的子類來重寫。這是編程人員需要作的事。

  當(dāng)posting或者sending到一個Hanler時,你可以有三種行為:當(dāng)MessageQueue準(zhǔn)備好就處理,定義一個延遲時間,定義一個精確的時間去處理。后兩者允許你實(shí)現(xiàn)timeout,tick,和基于時間的行為。

  當(dāng)你的應(yīng)用創(chuàng)建一個新的進(jìn)程時,主線程(也就是UI線程)自帶一個MessageQueue,這個MessageQueue管理頂層的應(yīng)用對象(像activities,broadcast receivers等)和主線程創(chuàng)建的窗體。你可以創(chuàng)建自己的線程,并通過一個Handler和主線程進(jìn)行通信。這和之前一樣,通過post和sendmessage來完成,差別在于在哪一個線程中執(zhí)行這么方法。在恰當(dāng)?shù)臅r候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled。

  Message簡介:

  Message類就是定義了一個信息,這個信息中包含一個描述符和任意的數(shù)據(jù)對象,這個信息被用來傳遞給Handler.Message對象提供額外的兩個int域和一個Object域,這可以讓你在大多數(shù)情況下不用作分配的動作。

  盡管Message的構(gòu)造函數(shù)是public的,但是獲取Message實(shí)例的最好方法是調(diào)用Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收對象池中獲取一個。

  MessageQueue簡介:

  這是一個包含message列表的底層類。Looper負(fù)責(zé)分發(fā)這些message。Messages并不是直接加到一個MessageQueue中,而是通過MessageQueue.IdleHandler關(guān)聯(lián)到Looper。

  你可以通過Looper.myQueue()從當(dāng)前線程中獲取MessageQueue。

  Looper簡介:

  Looper類被用來執(zhí)行一個線程中的message循環(huán)。默認(rèn)情況,沒有一個消息循環(huán)關(guān)聯(lián)到線程。在線程中調(diào)用prepare()創(chuàng)建一個Looper,然后用loop()來處理messages,直到循環(huán)終止。

  大多數(shù)和message loop的交互是通過Handler。

  下面是一個典型的帶有Looper的線程實(shí)現(xiàn)。

  class LooperThread extends Thread {

  public Handler mHandler;

  public void run() {

  Looper.prepare();

  mHandler = new Handler() {

  public void handleMessage(Message msg) {

  // process incoming messages here

  }

  };

  Looper.loop();

  }

  }

  30. AIDL的全稱是什么?如何工作?

  Android interface definition language (android接口定義語言) ,

  用來跨進(jìn)程的訪問方法,

  訪問遠(yuǎn)程的服務(wù)的方法. 如何工作 day7 queryStudent .

  手機(jī)衛(wèi)士 Itelephony 接口掛斷電話.

  31. 請解釋下Android程序運(yùn)行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別。

  Android程序執(zhí)行需要讀取到安全敏感項(xiàng)必需在androidmanifest.xml中聲明相關(guān)權(quán)限請求, 打電話,訪問網(wǎng)絡(luò),獲取坐標(biāo),讀寫sd卡,讀寫聯(lián)系人等..安裝的時候會提示用戶…

  文件系統(tǒng)的權(quán)限是linux權(quán)限. 比如說sharedpreference里面的Context.Mode.private Context.Mode.world_read_able Context.Mode_world_writeable

  777自己 同組 其他

  root 是危險(xiǎn)的行為

  32. 系統(tǒng)上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?

  找到對應(yīng)的瀏覽器的意圖,傳遞數(shù)據(jù)URI , 激活這個意圖

  Intent intent = new Intent();

  intent.setClassName(packageName, className);

  Intent.setdata(uri);

  33. 對android主線程的運(yùn)用和理解。

  主ui線程不能執(zhí)行耗時的操作,

  34. 對android虛擬機(jī)的理解,包括內(nèi)存管理機(jī)制垃圾回收機(jī)制。

  虛擬機(jī)很小,空間很小,談?wù)勔苿釉O(shè)備的虛擬機(jī)的大小限制 16M ,

  談?wù)劶虞d圖片的時候怎么處理大圖片的,

  垃圾回收,沒有引用的對象,在某個時刻會被系統(tǒng)gc掉.

  System.gc(); 不是立刻去執(zhí)行垃圾回收.

  手機(jī)電視. 視頻點(diǎn)播. Onstop() 通知gc();

  別的界面圖片 白板.

  遇到一個不可復(fù)現(xiàn)的bug, 不解決 won't fix

  35. Framework工作方式及原理,Activity是如何生成一個view的,機(jī)制是什么。

  反射 , 配置文件

  可以講下activity的源碼,比如說 每個activity里面都有window.callback和keyevent.callback,一些回調(diào)的接口或者函數(shù)吧. 框架把a(bǔ)ctivity創(chuàng)建出來就會調(diào)用里面的這些回調(diào)方法,會調(diào)用activity生命周期相關(guān)的方法.

  setContentView();

  普通的情況:

  Activity創(chuàng)建一個view是通過 ondraw 畫出來的, 畫這個view之前呢,還會調(diào)用onmeasure方法來計(jì)算顯示的大小.

  Surfaceview 直接操作硬件 opengl .

  圖像要想被顯示到界面上, 需要設(shè)備顯卡, 顯存.

  寫到顯存.

  36. android本身的一些限制,比如apk包大小限制,讀取大文件時的時間限。

  這個問題問的有問題, apk包大小限制不好說,

  極品飛車有100M 還是能裝到手機(jī)上,

  世面google market 上大程序 主程序 很小 5~10M 下載sdcard

  15分鐘之內(nèi) 申請退款

  apk包,精簡包, 素材存放在服務(wù)器. 游戲程序.

  讀大文件的時間限制應(yīng)該是main線程里面的時間限制吧.5秒.

  37. 如何加載的音樂信息,如何改善其效率。

  Android提供mediascanner,mediaStore等接口, 音樂文件的信息都會存放到系統(tǒng)的數(shù)據(jù)庫表中,可以通過content provider獲取,

  顯示出來,改善效率,是個常見問題, 可以從以下幾個方面作答,

  分批加載數(shù)據(jù), 延時加載數(shù)據(jù), 合理使用緩存等...

  Java虛擬機(jī), 目標(biāo), 加快java程序執(zhí)行速度

  預(yù)先加載一些 都會的使用的大的class的字節(jié)碼, 提前加載.

  時間換時間

  空間換時間

  38. ListView如何提高其效率?

  復(fù)用convertview , 歷史的view對象

  異步加載數(shù)據(jù), 分頁加載數(shù)據(jù), onscallLinster();

  Static class ViewHolder

  使用靜態(tài)的view對象 避免創(chuàng)建過多的view.

  把下載后的數(shù)據(jù)緩存到數(shù)據(jù)庫里

  客戶端和服務(wù)器 協(xié)同 作戰(zhàn) .

  Http 請求

  If-modify-since : 檢查數(shù)據(jù)是否更新 1.html 2001年 302 拿緩存

  39. 啟動應(yīng)用后,改變系統(tǒng)語言,應(yīng)用的語言會改變么?

  會

  40. 啟動一個程序,可以主界面點(diǎn)擊圖標(biāo)進(jìn)入,也可以從一個程序中跳轉(zhuǎn)過去,二者有什么區(qū)別?

  區(qū)別是根據(jù)activity在manifest里面的配置,這個activity可能會放在不同的task棧里面

  intent設(shè)置的flag flag_new_task

  41. Android程序與Java程序的區(qū)別?

  Android程序用android sdk開發(fā),java程序用javasdk開發(fā).

  Android SDK引用了大部分的Java SDK,少數(shù)部分被Android SDK拋棄,比如說界面部分,java.awt swing package除了java.awt.font被引用外,其他都被拋棄,在Android平臺開發(fā)中不能使用。

  android sdk 添加工具jar httpclient , pull openGL

  將Java 游戲或者j2me程序移植到Android平臺的過程中,

  Android SDK 與Java SDK的區(qū)別是很需要注意的地方。

  1.6的 不支持 httpUrlconning 獲取 last-modified 信息的處理

  simpleDataFormat

  42. Android中Task任務(wù)棧的分配。

  假如有三個Activity A B C,A跳到B,然后B跳到C,現(xiàn)在需要從C跳到A如何傳遞數(shù)據(jù)而且使效率最高呢?

  首先我們來看下Task的定義,Google是這樣定義Task的:a task is what the user experiences as an "application." It's a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 這意思就是說Task實(shí)際上是一個Activity棧,通常用戶感受的一個Application就是一個Task。從這個定義來看,Task跟Service或者其他Components是沒有任何聯(lián)系的,它只是針對Activity而言的。

  Activity有不同的啟動模式, 可以影響到task的分配

  Task,簡單的說,就是一組以棧的模式聚集在一起的Activity組件集合。它們有潛在的前后驅(qū)關(guān)聯(lián),新加入的Activity組件,位于棧頂,并僅有在棧頂?shù)腁ctivity,才會有機(jī)會與用戶進(jìn)行交互。而當(dāng)棧頂?shù)腁ctivity完成使命退出的時候,Task會將其退棧,并讓下一個將跑到棧頂?shù)腁ctivity來于用戶面對面,直至棧中再無更多Activity,Task結(jié)束。

  事件 Task棧(粗體為棧頂組件)

  點(diǎn)開Email應(yīng)用,進(jìn)入收件箱(Activity A) A

  選中一封郵件,點(diǎn)擊查看詳情(Activity B) AB

  點(diǎn)擊回復(fù),開始寫新郵件(Activity C) ABC

  寫了幾行字,點(diǎn)擊選擇聯(lián)系人,進(jìn)入選擇聯(lián)系人界面(Activity D) ABCD

  選擇好了聯(lián)系人,繼續(xù)寫郵件 ABC

  寫好郵件,發(fā)送完成,回到原始郵件 AB

  點(diǎn)擊返回,回到收件箱 A

  退出Email程序 null

  如上表所示,是一個實(shí)例。從用戶從進(jìn)入郵箱開始,到回復(fù)完成,退出應(yīng)用整個過程的Task棧變化。這是一個標(biāo)準(zhǔn)的棧模式,對于大部分的狀況,這樣的Task模型,足以應(yīng)付,但是,涉及到實(shí)際的性能、開銷等問題,就會變得殘酷許多。

  比如,啟動一個瀏覽器,在Android中是一個比較沉重的過程,它需要做很多初始化的工作,并且會有不小的內(nèi)存開銷。但與此同時,用瀏覽器打開一些內(nèi)容,又是一般應(yīng)用都會有的一個需求。設(shè)想一下,如果同時有十個運(yùn)行著的應(yīng)用(就會對應(yīng)著是多個Task),都需要啟動瀏覽器,這將是一個多么殘酷的場面,十個Task棧都堆積著很雷同的瀏覽器Activity,

  是多么華麗的一種浪費(fèi)啊。

  于是你會有這樣一種設(shè)想,瀏覽器Activity,可不可以作為一個單獨(dú)的Task而存在,不管是來自那個Task的請求,瀏覽器的Task,都不會歸并過去。這樣,雖然瀏覽器Activity本身需要維系的狀態(tài)更多了,但整體的開銷將大大的減少,這種舍小家為大家的行為,還是很值得歌頌的

  standard", "singleTop", "singleTask", "singleInstance"。

  standard模式, 是默認(rèn)的也是標(biāo)準(zhǔn)的Task模式,在沒有其他因素的影響下,使用此模式的Activity,會構(gòu)造一個Activity的實(shí)例,加入到調(diào)用者的Task棧中去,對于使用頻度一般開銷一般什么都一般的Activity而言,standard模式無疑是最合適的,因?yàn)樗壿嫼唵螚l理清晰,所以是默認(rèn)的選擇。

  而singleTop模式,基本上于standard一致,僅在請求的Activity正好位于棧頂時,有所區(qū)別。此時,配置成singleTop的Activity,不再會構(gòu)造新的實(shí)例加入到Task棧中,而是將新來的Intent發(fā)送到棧頂Activity中,棧頂?shù)腁ctivity可以通過重載onNewIntent來處理新的Intent(當(dāng)然,也可以無視...)。這個模式,降低了位于棧頂時的一些重復(fù)開銷,更避免了一些奇異的行為(想象一下,如果在棧頂連續(xù)幾個都是同樣的Activity,再一級級退出的時候,這是怎么樣的用戶體驗(yàn)...),很適合一些會有更新的列表Activity展示。一個活生生的實(shí)例是,在Android默認(rèn)提供的應(yīng)用中,瀏覽器(Browser)的書簽Activity(BrowserBookmarkPage),就用的是singleTop。

  singleTask,和singleInstance,則都采取的另辟Task的蹊徑。

  標(biāo)志為singleTask的Activity,最多僅有一個實(shí)例存在,并且,位于以它為根的Task中。所有對該Activity的請求,都會跳到該Activity的Task中展開進(jìn)行。singleTask,很象概念中的單件模式,所有的修改都是基于一個實(shí)例,這通常用在構(gòu)造成本很大,但切換成本較小的Activity中。最典型的例子,還是瀏覽器應(yīng)用的主Activity(名為Browser...),它是展示當(dāng)前tab,當(dāng)前頁面內(nèi)容的窗口。它的構(gòu)造成本大,但頁面的切換還是較快的,于singleTask相配,還是挺天作之合的。

  singleInstance顯得更為極端一些。在大部分時候singleInstance與singleTask完全一致,唯一的不同在于,singleInstance的Activity,是它所在棧中僅有的一個Activity,如果涉及到的其他Activity,都移交到其他Task中進(jìn)行。這使得singleInstance的Activity,像一座孤島,徹底的黑盒,它不關(guān)注請求來自何方,也不計(jì)較后續(xù)由誰執(zhí)行。在Android默認(rèn)的各個應(yīng)用中,很少有這樣的Activity,在我個人的工程實(shí)踐中,曾嘗試在有道詞典的快速取詞Activity中采用過,

  是因?yàn)槲矣X得快速取詞入口足夠方便(從notification中點(diǎn)選進(jìn)入),并且會在各個場合使用,應(yīng)該做得完全獨(dú)立。

  大的apk 拆成 很多小的apk

  ●Activity的 android:taskAffinity=""屬性 姻緣關(guān)系

  1.配置后 當(dāng)啟動這個activity時就先去找有沒有activity的親和力屬性相同 有就加入這個

  activity所在的任務(wù)中沒有就新開任務(wù)

  2.affinity起作用需要的條件而者具備一個:

  1.intent包含F(xiàn)LAG_ACTIVITY_NEW_TASK標(biāo)記

  2.activity元素啟用了allowTaskReparenting屬性.

  43. 在Android中,怎么節(jié)省內(nèi)存的使用,怎么主動回收內(nèi)存?

  回收已經(jīng)使用的資源,

  合理的使用緩存

  合理設(shè)置變量的作用范圍… application 對象

  //未來的某一段時間執(zhí)行

  System.gc();

  44. 不同工程中的方法是否可以相互調(diào)用?

  可以,列舉aidl訪問遠(yuǎn)程服務(wù)的例子.

  45. 在Android中是如何實(shí)現(xiàn)判斷區(qū)分電話的狀態(tài),去電,來電、未接來電?

  Day8 showAddressService.java

  46. dvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個概念

  Dvm的進(jìn)程是dalivk虛擬機(jī)進(jìn)程,每個android程序都運(yùn)行在自己的進(jìn)程里面,

  每個android程序系統(tǒng)都會給他分配一個單獨(dú)的liunx uid(user id),

  每個dvm都是linux里面的一個進(jìn)程.所以說這兩個進(jìn)程是一個進(jìn)程.

  47. sim卡的EF 文件有何作用

  Sim卡相關(guān)的東西,沒接觸過

  48. 如何判斷是否有SD卡?

  配置文件中有sd卡的權(quán)限, 通過environment的靜態(tài)方法,

  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

  49. 嵌入式操作系統(tǒng)內(nèi)存管理有哪幾種, 各有何特性。

  頁式,段式,段頁,等 …

  50. 什么是嵌入式實(shí)時操作系統(tǒng), Android 操作系統(tǒng)屬于實(shí)時操作系統(tǒng)嗎?

  實(shí)時操作系統(tǒng)是指當(dāng)外界事件或數(shù)據(jù)產(chǎn)生時,能夠接受并以足夠快的速度予以處理,其處理的結(jié)果又能在規(guī)定的時間之內(nèi)來控制生產(chǎn)過程或?qū)μ幚硐到y(tǒng)作出快速響應(yīng),并控制所有實(shí)時任務(wù)協(xié)調(diào)一致運(yùn)行的嵌入式操作系統(tǒng)。主要用于工業(yè)控制、軍事設(shè)備、航空航天等領(lǐng)域?qū)ο到y(tǒng)的響應(yīng)時間有苛刻的要求,這就需要使用實(shí)時系統(tǒng)。又可分為軟實(shí)時和硬實(shí)時兩種,而android是基于linux內(nèi)核的,因此屬于軟實(shí)時。

  硬實(shí)時. 火星探測車.

  軟實(shí)時.

  51. 一條最長的短信息約占多少byte?

  中文70(包括標(biāo)點(diǎn)),英文160,160個字節(jié) 這個說法不準(zhǔn)確,

  要跟手機(jī)制式運(yùn)營商等信息有關(guān).

  做實(shí)驗(yàn),看源碼

  ArrayListmsgs = sms.divideMessage(message);

  for (String msg : msgs) {

  sms.sendTextMessage(phoneNumber, null, msg, pi, null);

  }

  52. Linux中跨進(jìn)程通信的幾種方式 。

  linux編程

  # 管道( pipe ):管道是一種半雙工的通信方式,數(shù)據(jù)只能單向流動,而且只能在具有親緣關(guān)系的進(jìn)程間使用。進(jìn)程的親緣關(guān)系通常是指父子進(jìn)程關(guān)系。

  # 有名管道 (named pipe) : 有名管道也是半雙工的通信方式,但是它允許無親緣關(guān)系進(jìn)程間的通信。

  # 信號量( semophore ) : 信號量是一個計(jì)數(shù)器,可以用來控制多個進(jìn)程對共享資源的訪問。它常作為一種鎖機(jī)制,防止某進(jìn)程正在訪問共享資源時,其他進(jìn)程也訪問該資源。因此,主要作為進(jìn)程間以及同一進(jìn)程內(nèi)不同線程之間的同步手段。

  # 消息隊(duì)列( message queue ) : 消息隊(duì)列是由消息的鏈表,存放在內(nèi)核中并由消息隊(duì)列標(biāo)識符標(biāo)識。消息隊(duì)列克服了信號傳遞信息少、管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺點(diǎn)。

  # 信號 ( sinal ) : 信號是一種比較復(fù)雜的通信方式,用于通知接收進(jìn)程某個事件已經(jīng)發(fā)生。

  # 共享內(nèi)存( shared memory ) :共享內(nèi)存就是映射一段能被其他進(jìn)程所訪問的內(nèi)存,這段共享內(nèi)存由一個進(jìn)程創(chuàng)建,但多個進(jìn)程都可以訪問。共享內(nèi)存是最快的 IPC 方式,它是針對其他進(jìn)程間通信方式運(yùn)行效率低而專門設(shè)計(jì)的。它往往與其他通信機(jī)制,如信號兩,配合使用,來實(shí)現(xiàn)進(jìn)程間的同步和通信。

  # 套接字( socket ) : 套解口也是一種進(jìn)程間通信機(jī)制,與其他通信機(jī)制不同的是,它可用于不同及其間的進(jìn)程通信。

  53. 談?wù)剬ndroid NDK的理解。

  native develop kit 只是一個交叉編譯的工具 .so

  1.什么時候用ndk, 實(shí)時性要求高,游戲,圖形渲染,

  opencv (人臉識別) , ffmpeg , rmvb mp5 avi 高清解碼. ffmpeg, opencore.

  2.為什么用ndk,ndk的優(yōu)點(diǎn) ,缺點(diǎn) ,

  我們項(xiàng)目中那些地方用到了ndk,

  54. 談?wù)凙ndroid的優(yōu)點(diǎn)和不足之處。

  1、開放性,開源 ophone 阿里云( 完全兼容android)

  2、掙脫運(yùn)營商束縛

  3、豐富的硬件選擇 mtk android

  4、不受任何限制的開發(fā)商

  5、無縫結(jié)合的Google應(yīng)用

  缺點(diǎn)也有5處:

  1、安全問題、隱私問題

  2、賣手機(jī)的不是最大運(yùn)營商

  3、運(yùn)營商對Android手機(jī)仍然有影響

  4、山寨化嚴(yán)重

  5、過分依賴開發(fā)商,缺乏標(biāo)準(zhǔn)配置 版本過多

  55. Android系統(tǒng)中GC什么情況下會出現(xiàn)內(nèi)存泄露呢? 視頻編解碼/內(nèi)存泄露

  檢測內(nèi)存泄露 工具

  導(dǎo)致內(nèi)存泄漏主要的原因是,先前申請了內(nèi)存空間而忘記了釋放。如果程序中存在對無用對象的引用,那么這些對象就會駐留內(nèi)存,消耗內(nèi)存,因?yàn)闊o法讓垃圾回收器GC驗(yàn)證這些對象是否不再需要。如果存在對象的引用,這個對象就被定義為"有效的活動",同時不會被釋放。要確定對象所占內(nèi)存將被回收,我們就要務(wù)必確認(rèn)該對象不再會被使用。典型的做法就是把對象數(shù)據(jù)成員設(shè)為null或者從集合中移除該對象。但當(dāng)局部變量不需要時,不需明顯的設(shè)為null,因?yàn)橐粋方法執(zhí)行完畢時,這些引用會自動被清理。

  Java帶垃圾回收的機(jī)制,為什么還會內(nèi)存泄露呢?

  Vector v = new Vector(10);

  for (int i = 1; i < 100; i++) {

  Object o = new Object();

  v.add(o);

  o = null;

  }//此時,所有的Object對象都沒有被釋放,因?yàn)樽兞縱引用這些對象。

  Java 內(nèi)存泄露的根本原因就是 保存了不可能再被訪問的變量類型的引用

  56. Android UI中的View如何刷新。

  在主線程中 拿到view調(diào)用Invalide()方法,查看畫畫板里面更新imageview的方法

  在子線程里面可以通過postInvalide()方法;

  57. 簡單描述下Android 數(shù)字簽名。

  Android 數(shù)字簽名

  在Android系統(tǒng)中,所有安裝到系統(tǒng)的應(yīng)用程序都必有一個數(shù)字證書,此數(shù)字證書用于標(biāo)識應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系

  Android系統(tǒng)要求每一個安裝進(jìn)系統(tǒng)的應(yīng)用程序都是經(jīng)過數(shù)字證書簽名的,數(shù)字證書的私鑰則保存在程序開發(fā)者的手中。Android將數(shù)字證書用來標(biāo)識應(yīng)用程序的作者和在應(yīng)用程序之間建立信任關(guān)系,不是用來決定最終用戶可以安裝哪些應(yīng)用程序。

  這個數(shù)字證書并不需要權(quán)威的數(shù)字證書簽名機(jī)構(gòu)認(rèn)證(CA),它只是用來讓應(yīng)用程序包自我認(rèn)證的。

  同一個開發(fā)者的多個程序盡可能使用同一個數(shù)字證書,這可以帶來以下好處。

  (1)有利于程序升級,當(dāng)新版程序和舊版程序的數(shù)字證書相同時,Android系統(tǒng)才會認(rèn)為這兩個程序是同一個程序的不同版本。如果新版程序和舊版程序的數(shù)字證書不相同,則Android系統(tǒng)認(rèn)為他們是不同的程序,并產(chǎn)生沖突,會要求新程序更改包名。

  (2)有利于程序的模塊化設(shè)計(jì)和開發(fā)。Android系統(tǒng)允許擁有同一個數(shù)字簽名的程序運(yùn)行在一個進(jìn)程中,Android程序會將他們視為同一個程序。所以開發(fā)者可以將自己的程序分模塊開發(fā),而用戶只需要在需要的時候下載適當(dāng)?shù)哪K。

  在簽名時,需要考慮數(shù)字證書的有效期:

  (1)數(shù)字證書的有效期要包含程序的預(yù)計(jì)生命周期,一旦數(shù)字證書失效,持有改數(shù)字證書的程序?qū)⒉荒苷I墶?/p>

  (2)如果多個程序使用同一個數(shù)字證書,則該數(shù)字證書的有效期要包含所有程序的預(yù)計(jì)生命周期。

  (3)Android Market強(qiáng)制要求所有應(yīng)用程序數(shù)字證書的有效期要持續(xù)到2033年10月22日以后。

  Android數(shù)字證書包含以下幾個要點(diǎn):

  (1)所有的應(yīng)用程序都必須有數(shù)字證書,Android系統(tǒng)不會安裝一個沒有數(shù)字證書的應(yīng)用程序

  (2)Android程序包使用的數(shù)字證書可以是自簽名的,不需要一個權(quán)威的數(shù)字證書機(jī)構(gòu)簽名認(rèn)證

  (3)如果要正式發(fā)布一個Android ,必須使用一個合適的私鑰生成的數(shù)字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調(diào)試證書來發(fā)布。

  (4)數(shù)字證書都是有有效期的,Android只是在應(yīng)用程序安裝的時候才會檢查證書的有效期。如果程序已經(jīng)安裝在系統(tǒng)中,即使證書過期也不會影響程序的正常功能。

  58. 什么是ANR 如何避免它?

  在Android上,如果你的應(yīng)用程序有一段時間響應(yīng)不夠靈敏,系統(tǒng)會向用戶顯示一個對話框,這個對話框稱作應(yīng)用程序無響應(yīng)(ANR:Application Not Responding)對話框。用戶可以選擇讓程序繼續(xù)運(yùn)行,但是,他們在使用你的應(yīng)用程序時,并不希望每次都要處理這個對話框。因此,在程序里對響應(yīng)性能的設(shè)計(jì)很重要,這樣,系統(tǒng)不會顯示ANR給用戶。

  Activity 5秒 broadcast10秒

  耗時的操作 worker thread里面完成, handler message…AsynTask , intentservice.等…

  59. android中的動畫有哪幾類,它們的特點(diǎn)和區(qū)別是什么?

  兩種,一種是Tween動畫、還有一種是Frame動畫。

  Tween動畫,這種實(shí)現(xiàn)方式可以使視圖組件移動、放大、縮小以及產(chǎn)生透明度的變化;

  可以通過布局文件,可以通過代碼

  1、 控制View的動畫

  a) alpha(AlphaAnimation)

  漸變透明

  b) scale(ScaleAnimation)

  漸變尺寸伸縮

  c) translate(TranslateAnimation)

  畫面轉(zhuǎn)換、位置移動

  d) rotate(RotateAnimation)

  畫面轉(zhuǎn)移,旋轉(zhuǎn)動畫

  2、 控制一個Layout里面子View的動畫效果

  a) layoutAnimation(LayoutAnimationController)

  b) gridAnimation(GridLayoutAnimationController)

  另一種Frame動畫,傳統(tǒng)的動畫方法,通過順序的播放排列好的圖片來實(shí)現(xiàn),類似電影。

  62. 說說mvc模式的原理,它在android中的運(yùn)用。

  MVC英文即Model-View-Controller,即把一個應(yīng)用的輸入、處理、輸出流程按照Model、View、Controller的方式進(jìn)行分離,這樣一個應(yīng)用被分成三個層——模型層、視圖層、控制層。

  Android中界面部分也采用了當(dāng)前比較流行的MVC框架,在Android中M就是應(yīng)用程序中二進(jìn)制的數(shù)據(jù),V就是用戶的界面。Android的界面直接采用XML文件保存的,界面開發(fā)變的很方便。在Android中C也是很簡單的,一個Activity可以有多個界面,只需要將視圖的ID傳遞到setContentView(),就指定了以哪個視圖模型顯示數(shù)據(jù)。

  在Android SDK中的數(shù)據(jù)綁定,也都是采用了與MVC框架類似的方法來顯示數(shù)據(jù)。在控制層上將數(shù)據(jù)按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就可以直接在視圖模型上顯示了,從而實(shí)現(xiàn)了數(shù)據(jù)綁定。比如顯示Cursor中所有數(shù)據(jù)的ListActivity,其視圖層就是一個ListView,將數(shù)據(jù)封裝為ListAdapter,并傳遞給ListView,數(shù)據(jù)就在ListView中顯示。

  63. 通過點(diǎn)擊一個網(wǎng)頁上的url 就可以完成程序的自動安裝,描述下原理

  Day11 AddJavascriptInterface

  new Object{

  callphone();

  installapk();

  }

  64,Service和Activity在同一個線程嗎

  默認(rèn)情況同一線程 main主線程 ui線程

  65,java中的soft reference是個什么東西

  StrongReference 是 Java 的默認(rèn)引用實(shí)現(xiàn), 它會盡可能長時間的存活于 JVM 內(nèi), 當(dāng)沒有任何對象指向它時 GC 執(zhí)行后將會被回收

  SoftReference 會盡可能長的保留引用直到 JVM 內(nèi)存不足時才會被回收(虛擬機(jī)保證), 這一特性使得 SoftReference 非常適合緩存

  應(yīng)用詳細(xì)見豆瓣客戶端圖片的緩存

  66,udp連接和TCP的不同之處

  tcp/滑動窗口協(xié)議. 擁塞控制.

  udp 不關(guān)心數(shù)據(jù)是否達(dá)到,是否阻塞

  畫面優(yōu)先. tcp

  流暢優(yōu)先 udp

  67, android開發(fā)中怎么去調(diào)試bug

  邏輯錯誤

  1.斷點(diǎn) debug

  2. logcat ,

  界面布局,顯示 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調(diào)用常用的兩個參數(shù)

  JNIEnv *env, jobject javaThis

  71. 書寫出android工程的目錄結(jié)構(gòu)

  src

  android. jar

  asset

  res

  gen

  manifest

  72. ddms 和traceview的區(qū)別.

  daivilk debug manager system

  1.在應(yīng)用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字");

  2.同樣在主activity的onStop方法中加入Debug.stopMethodTracing();

  3.同時要在AndroidManifest.xml文件中配置權(quán)限

  3.重新編譯,安裝,啟動服務(wù),測試完成取對應(yīng)的traceview文件(adb pull /sdcard/xxxx.trace)。

  4.直接在命令行輸入traceview xxxxtrace,彈出traceview窗口,分析對應(yīng)的應(yīng)用即可。

  traceview 分析程序執(zhí)行時間和效率

  KPI : key performance information : 關(guān)鍵性能指標(biāo):

  splash界面不能超過5秒

  從splash 界面加載mainactivity 不能超過0.7秒

  74. 利用mvc的模式重構(gòu)代碼

  1) 重構(gòu)前的代碼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:抽取所有界面元件的聲明和定義,整合到單獨(dú)一個函數(shù)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:抽取程序的邏輯(即界面元件的處理邏輯),整合到函數(shù)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中相應(yīng)的部分(主要是變量已經(jīng)在視圖部分定義了);

  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);

  }

  }

  };

  總之,此重構(gòu)的目的無非是使程序的脈絡(luò)更加清晰,即讓人一眼望去,就能很容易地分辨出界面(View)應(yīng)該寫在哪里,程序邏輯(Controller)應(yīng)該寫在哪里,最終使維護(hù)和擴(kuò)展代碼變得更加容易!

  其實(shí),重構(gòu)很簡單,通讀代碼,感覺哪邊不太爽,就改那邊吧!(我目前的感受)

  一個良好的代碼應(yīng)該是能讓人感到舒服的!

  2) 重構(gòu)后的代碼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);

  }

  }

  };

  }

  總結(jié):

  關(guān)于項(xiàng)目

  在就是你項(xiàng)目經(jīng)驗(yàn),一定要突出你遇到什么難點(diǎn),然后是怎么解決的!把問題引導(dǎo)到你熟悉的領(lǐng)域,或者知識點(diǎn)上,盡量將每個技術(shù)點(diǎn)細(xì)節(jié)凸顯出來,

  心態(tài):

  什么樣的面試官都有,去面試的時候要做好一切心理準(zhǔn)備,不管是技術(shù)還是基礎(chǔ)都得扎實(shí)。一個人的交談能力也很重要,總之不是非常標(biāo)準(zhǔn)的普通話, 最起碼你說的得讓別人聽得懂,而且得把面試官講得非常徹底,這樣你獲得offer的機(jī)會更大,談工資也有優(yōu)勢~~

【android面試題】相關(guān)文章:

Android 面試題經(jīng)典(下)11-03

android面試題摘要02-20

Android 面試題經(jīng)典(上)11-03

android面試題大全12-30

android面試題目匯總02-17

軟件測試android面試題及答案11-01

70道Android面試題(大全)07-03

2016年最新最全Android 面試題11-06

Android工程師面試題匯總11-03