Android面試題-2013
1. 下列哪些語句關於記憶體回收的說明是正確的? (b )
A、 程式設計師必須建立一個執行緒來釋放記憶體
B、 記憶體回收程式負責釋放無用記憶體
C、 記憶體回收程式允許程式設計師直接釋放記憶體
D、 記憶體回收程式可以在指定的時間釋放記憶體物件
2. 下面異常是屬於Runtime Exception 的是(abcd)(多選)
A、ArithmeticException
B、IllegalArgumentException
C、NullPointerException
D、BufferUnderflowException
3. Math.round(11.5)等於多少(). Math.round(-11.5)等於多少(c). c
A、11 ,-11 B、11 ,-12 C、12 ,-11 D、12 ,-12
4. 下列程式段的輸出結果是:(b )
void complicatedexpression_r(){
int x=20, y=30;
boolean b;
b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;
System.out.println(b);
}
A、true B、false C、1 D、011.activity
5. 對一些資源以及狀態的操作儲存,最好是儲存在生命週期的哪個函式中進行(d)
A、onPause() B、onCreate() C、onResume() D、onStart()
6. Intent傳遞資料時,下列的資料型別哪些可以被傳遞(abcd)(多選)
A、Serializable B、charsequence C、Parcelable D、Bundle
7. android 中下列屬於Intent的作用的是(c)
A、實現應用程式間的資料共享
B、是一段長的生命週期,沒有使用者介面的程式,可以保持應用在後臺執行,而不會因為切換頁面而消失
C、可以實現介面間的切換,可以包含動作和動作資料,連線四大元件的紐帶
D、處理一個應用程式整體性的工作
8. 下列屬於SAX解析xml檔案的優點的是(b)
A、將整個文件樹在記憶體中,便於操作,支援刪除,修改,重新排列等多種功能
B、不用事先調入整個文件,佔用資源少
C、整個文件調入記憶體,浪費時間和空間
D、不是長久駐留在記憶體,資料不是持久的,事件過後,若沒有儲存資料,資料就會
消失
9. 下面的對自定style的方式正確的是(a)
A、 <resources>
<style name="myStyle">
<itemname="android:layout_width">fill_parent</item>
</style>
</resources>
B、 <style name="myStyle">
<itemname="android:layout_width">fill_parent</item>
</style>
C、 <resources>
<itemname="android:layout_width">fill_parent</item>
</resources>
D、 <resources>
<stylename="android:layout_width">fill_parent</style>
</resources>
10. 在android中使用Menu時可能需要重寫的方法有(ac)。(多選)
A、onCreateOptionsMenu()
B、onCreateMenu()
C、onOptionsItemSelected()
D、onItemSelected()
11. 在SQL ServerManagement Studio 中執行下列T-SQL語句,其輸出值(c)。
SELECT @@IDENTITY
A、 可能為0.1
B、 可能為3
C、 不可能為-100
D、 肯定為0
12. 在SQL Server2005中執行如下T-SQL語句,假定SALES表中有多行資料,執行查詢之 後的結果是(d)。
BEGIN TRANSACTION A
Update SALES Set qty=30 WHERE qty<30
BEGIN TRANSACTION B
Update SALES Set qty=40 WHEREqty<40
Update SALES Set qty=50 WHEREqty<50
Update SALES Set qty=60 WHEREqty<60
COMMIT TRANSACTION B
COMMIT TRANSACTION A
A、SALES表中qty列最小值大於等於30
B、SALES表中qty列最小值大於等於40
C、SALES表中qty列的資料全部為50
D、SALES表中qty列最小值大於等於60
13. 在android中使用SQLiteOpenHelper這個輔助類時,可以生成一個資料庫,並可以對資料庫版本進行管理的方法可以是(ab)
A、getWriteableDatabase()
B、getReadableDatabase()
C、getDatabase()
D、getAbleDatabase()
14. android 關於service生命週期的onCreate()和onStart()說法正確的是(ad)(多選題)
A、當第一次啟動的時候先後呼叫onCreate()和onStart()方法
B、當第一次啟動的時候只會呼叫onCreate()方法
C、如果service已經啟動,將先後呼叫onCreate()和onStart()方法
D、如果service已經啟動,只會執行onStart()方法,不在執行onCreate()方法
15. 下面是屬於GLSurFaceView特性的是(abc)(多選)
A、管理一個surface,這個surface就是一塊特殊的記憶體,能直接排版到android的檢視
view上。
B、管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。
C、讓渲染器在獨立的執行緒裡運作,和UI執行緒分離。
D、可以直接從記憶體或者DMA等硬體介面取得影像資料
16. 下面在AndroidManifest.xml檔案中註冊BroadcastReceiver方式正確的(a)
A、<receiver android:name="NewBroad">
<intent-filter>
<action
android:name="android.provider.action.NewBroad"/>
<action>
</intent-filter>
</receiver>
B、<receiver android:name="NewBroad">
<intent-filter>
android:name="android.provider.action.NewBroad"/>
</intent-filter>
</receiver>
C、<receiver android:name="NewBroad">
<action
android:name="android.provider.action.NewBroad"/>
<action>
</receiver>
D、<intent-filter>
<receiver android:name="NewBroad">
<action>
android:name="android.provider.action.NewBroad"/>
<action>
</receiver>
</intent-filter>
17. 關於ContenValues類說法正確的是(a)
A、他和Hashtable比較類似,也是負責儲存一些名值對,但是他儲存的名值對當中的
名是String型別,而值都是基本型別
B、他和Hashtable比較類似,也是負責儲存一些名值對,但是他儲存的名值對當中的
名是任意型別,而值都是基本型別
C、他和Hashtable比較類似,也是負責儲存一些名值對,但是他儲存的名值對當中的
名,可以為空,而值都是String型別
D、他和Hashtable比較類似,也是負責儲存一些名值對,但是他儲存的名值對當中
的名是String型別,而值也是String型別
18. 我們都知道Hanlder是執行緒與Activity通訊的橋樑,如果執行緒處理不當,你的機器就會變得越慢,那麼執行緒銷燬的方法是(a)
A、onDestroy()
B、onClear()
C、onFinish()
D、onStop()
19. 下面退出Activity錯誤的方法是(c)
A、finish()
B、拋異常強制退出
C、System.exit()
D、onStop()
20. 下面屬於android的動畫分類的有(ab)(多項)
A、Tween B、Frame C、Draw D、Animation
21. 下面關於Androiddvm的程式和Linux的程式,應用程式的程式說法正確的是(d)
A、DVM指dalivk的虛擬機器.每一個Android應用程式都在它自己的程式中執行,不一定擁有一個獨立的Dalvik虛擬機器例項.而每一個DVM都是在Linux 中的一個程式,所以說可以認為是同一個概念.
B、DVM指dalivk的虛擬機器.每一個Android應用程式都在它自己的程式中執行,不一定擁有一個獨立的Dalvik虛擬機器例項.而每一個DVM不一定都是在Linux 中的一個程式,所以說不是一個概念.
C、DVM指dalivk的虛擬機器.每一個Android應用程式都在它自己的程式中執行,都擁有一個獨立的Dalvik虛擬機器例項.而每一個DVM不一定都是在Linux 中的一個程式,所以說不是一個概念.
D、DVM指dalivk的虛擬機器.每一個Android應用程式都在它自己的程式中執行,都擁有一個獨立的 Dalvik虛擬機器例項.而每一個DVM都是在Linux 中的一個程式,所以說可以認為是同一個概念.
22. Android專案工程下面的assets目錄的作用是什麼b
A、放置應用到的圖片資源。
B、主要放置多媒體等資料檔案
C、放置字串,顏色,陣列等常量資料
D、放置一些與UI相應的佈局檔案,都是xml檔案
23. 關於res/raw目錄說法正確的是(a)
A、這裡的檔案是原封不動的儲存到裝置上不會轉換為二進位制的格式
B、 這裡的檔案是原封不動的儲存到裝置上會轉換為二進位制的格式
C、這裡的檔案最終以二進位制的格式儲存到指定的包中
D、 這裡的檔案最終不會以二進位制的格式儲存到指定的包中
24. 下列對android NDK的理解正確的是(abcd )
A、 NDK是一系列工具的集合
B、 NDK 提供了一份穩定、功能有限的API 標頭檔案宣告。
C、 使 “Java+C”的開發方式終於轉正,成為官方支援的開發方式
D、 NDK 將是 Android 平臺支援 C 開發的開端
二.填空題
25. android中常用的四個佈局是framlayout,linenarlayout,relativelayout和tablelayout。
26. android 的四大元件是activiey,service,broadcast和contentprovide。
27. java.io包中的objectinputstream和objectoutputstream類主要用於對物件(Object)的讀寫。
28. android 中service的實現方法是:startservice和bindservice。
29. activity一般會過載7個方法用來維護其生命週期,除了onCreate(),onStart(),onDestory() 外還有onrestart,onresume,onpause,onstop。
30. android的資料儲存的方式sharedpreference,檔案,SQlite,contentprovider,網路。
31. 當啟動一個Activity並且新的Activity執行完後需要返回到啟動它的Activity來執行 的回撥函式是startActivityResult()。
32. 請使用命令列的方式建立一個名字為myAvd,sdk版本為2.2,sd卡是在d盤的根目錄下,名字為scard.img,並指定螢幕大小HVGA.____________________________________。
33. 程式執行的結果是:_____good and gbc__________。
public classExample{
String str=newString("good");
char[]ch={'a','b','c'};
public static voidmain(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+"and ");
Sytem.out.print(ex.ch);
}
public void change(Stringstr,char ch[]){
str="test ok";
ch[0]='g';
}
}
34. 在android中,請簡述jni的呼叫過程。(8分)
1)安裝和下載Cygwin,下載 AndroidNDK
2)在ndk專案中JNI介面的設計
3)使用C/C++實現本地方法
4)JNI生成動態連結庫.so檔案
5)將動態連結庫複製到java工程,在java工程中呼叫,執行java工程即可
35. 簡述Android應用程式結構是哪些?(7分)
Android應用程式結構是:
Linux Kernel(Linux核心)、Libraries(系統執行庫或者是c/c++核心庫)、Application
Framework(開發框架包)、Applications (核心應用程式)
36. 請繼承SQLiteOpenHelper實現:(10分)
1).建立一個版本為1的“diaryOpenHelper.db”的資料庫,
2).同時建立一個 “diary” 表(包含一個_id主鍵並自增長,topic字元型100
長度, content字元型1000長度)
3).在資料庫版本變化時請刪除diary表,並重新建立出diary表。
publicclass DBHelper extends SQLiteOpenHelper{
public final static String DATABASENAME ="diaryOpenHelper.db";
public final static int DATABASEVERSION =1;
//建立資料庫
public DBHelper(Context context,Stringname,CursorFactory factory,int version)
{
super(context, name, factory,version);
}
//建立表等機構性檔案
public void onCreate(SQLiteDatabase db)
{
String sql ="create tablediary"+
"("+
"_idinteger primary key autoincrement,"+
"topicvarchar(100),"+
"contentvarchar(1000)"+
")";
db.execSQL(sql);
}
//若資料庫版本有更新,則呼叫此方法
public void onUpgrade(SQLiteDatabasedb,int oldVersion,int newVersion)
{
String sql = "drop table ifexists diary";
db.execSQL(sql);
this.onCreate(db);
}
}
37. 頁面上現有ProgressBar控制元件progressBar,請用書寫執行緒以10秒的的時間完成其進度顯示工作。(10分)
答案
publicclass ProgressBarStu extends Activity {
private ProgressBar progressBar = null;
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.progressbar);
//從這到下是關鍵
progressBar = (ProgressBar)findViewById(R.id.progressBar);
Thread thread = new Thread(newRunnable() {
@Override
public void run() {
int progressBarMax =progressBar.getMax();
try {
while(progressBarMax!=progressBar.getProgress())
{
intstepProgress = progressBarMax/10;
intcurrentprogress = progressBar.getProgress();
progressBar.setProgress(currentprogress+stepProgress);
Thread.sleep(1000);
}
} catch(InterruptedException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
}
});
thread.start();
//關鍵結束
}
}
38. 請描述下Activity的生命週期。
必呼叫的三個方法:onCreate() --> onStart() -->onResume(),用AAA表示
(1)父Activity啟動子Activity,子Actvity退出,父Activity呼叫順序如下
AAA --> onFreeze() --> onPause() --> onStop() --> onRestart()--> onStart(),onResume() …
(2)使用者點選Home,Actvity呼叫順序如下
AAA --> onFreeze() --> onPause() --> onStop() -- Maybe -->onDestroy() – Maybe
(3)呼叫finish(), Activity呼叫順序如下
AAA --> onPause() --> onStop() --> onDestroy()
(4)在Activity上顯示dialog, Activity呼叫順序如下
AAA
(5)在父Activity上顯示透明的或非全屏的activity,Activity呼叫順序如下
AAA --> onFreeze() --> onPause()
(6)裝置進入睡眠狀態,Activity呼叫順序如下
AAA --> onFreeze() --> onPause()
39. 如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前儲存當前狀態?
onSaveInstanceState()
當你的程式中某一個Activity A在執行時,主動或被動地執行另一個新的Activity B,這個時候A會執行onSaveInstanceState()。B完成以後又會來找A,這個時候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新呼叫onCreate()方法,不同於直接啟動的是這回onCreate()裡是帶上了引數savedInstanceState;而沒被收回的就直接執行onResume(),跳過onCreate()了。
40. 如何將一個Activity設定成視窗的樣式。
在AndroidManifest.xml 中定義Activity的地方一句話android:theme="@android:style/Theme.Dialog"或android:theme="@android:style/Theme.Translucent"就變成半透明的
41. 如何退出Activity?如何安全退出已呼叫多個Activity的Application?
對於單一Activity的應用來說,退出很簡單,直接finish()即可。
當然,也可以用killProcess()和System.exit()這樣的方法。
但是,對於多Activity的應用來說,在開啟多個Activity後,如果想在最後開啟的Activity直接退出,上邊的方法都是沒有用的,因為上邊的方法都是結束一個Activity而已。
當然,網上也有人說可以。
就好像有人問,在應用裡如何捕獲Home鍵,有人就會說用keyCode比較KEYCODE_HOME即可,而事實上如果不修改framework,根本不可能做到這一點一樣。
所以,最好還是自己親自試一下。
那麼,有沒有辦法直接退出整個應用呢?
在2.1之前,可以使用ActivityManager的restartPackage方法。
它可以直接結束整個應用。在使用時需要許可權android.permission.RESTART_PACKAGES。
注意不要被它的名字迷惑。
可是,在2.2,這個方法失效了。
在2.2新增了一個新的方法,killBackgroundProcesses(),需要許可權android.permission.KILL_BACKGROUND_PROCESSES。
可惜的是,它和2.2的restartPackage一樣,根本起不到應有的效果。
另外還有一個方法,就是系統自帶的應用程式管理裡,強制結束程式的方法,forceStopPackage()。
它需要許可權android.permission.FORCE_STOP_PACKAGES。
並且需要新增android:sharedUserId="android.uid.system"屬性
同樣可惜的是,該方法是非公開的,他只能執行在系統程式,第三方程式無法呼叫。
因為需要在Android.mk中新增LOCAL_CERTIFICATE:= platform。
而Android.mk是用於在Android原始碼下編譯程式用的。
從以上可以看出,在2.2,沒有辦法直接結束一個應用,而只能用自己的辦法間接辦到。
現提供幾個方法,供參考:
1、拋異常強制退出:
該方法通過拋異常,使程式ForceClose。
驗證可以,但是,需要解決的問題是,如何使程式結束掉,而不彈出Force Close的視窗。
2、記錄開啟的Activity:
每開啟一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。
3、傳送特定廣播:
在需要結束應用時,傳送一個特定的廣播,每個Activity收到廣播後,關閉即可。
4、遞迴退出
在開啟新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞迴關閉。
除了第一個,都是想辦法把每一個Activity都結束掉,間接達到目的。
但是這樣做同樣不完美。
你會發現,如果自己的應用程式對每一個Activity都設定了nosensor,在兩個Activity結束的間隙,sensor可能有效了。
但至少,我們的目的達到了,而且沒有影響使用者使用。
為了程式設計方便,最好定義一個Activity基類,處理這些共通問題。
42. 請介紹下Android中常用的五種佈局。
FrameLayout(框架佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)
43. 請介紹下Android的資料儲存方式。
一.SharedPreferences方式
二.檔案儲存方式
三.SQLite資料庫方式
四.內容提供器(Content provider)方式
五. 網路儲存方式
44. 請介紹下ContentProvider是如何實現資料共享的。
建立一個屬於你自己的Content provider或者將你的資料新增到一個已經存在的Content provider中,前提是有相同資料型別並且有寫入Content provider的許可權。
45. 如何啟用Service,如何停用Service。
Android中的service類似於windows中的service,service一般沒有使用者操作介面,它執行於系統中不容易被使用者發覺,
可以使用它開發如監控之類的程式。
一。步驟
第一步:繼承Service類
public class SMSService extends Service { }
第二步:在AndroidManifest.xml檔案中的<application>節點裡對服務進行配置:
<service android:name=".DemoService" />
二。Context.startService()和Context.bindService
服務不能自己執行,需要通過呼叫Context.startService()或Context.bindService()方法啟動服務。這兩個方法都可
以啟動Service,但是它們的使用場合有所不同。
1.使用startService()方法啟用服務,呼叫者與服務之間沒有關連,即使呼叫者退出了,服務仍然執行。
使用bindService()方法啟用服務,呼叫者與服務繫結在了一起,呼叫者一旦退出,服務也就終止。
2.採用Context.startService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate()方法,
接著呼叫onStart()方法。如果呼叫startService()方法前服務已經被建立,多次呼叫startService()方法並
不會導致多次建立服務,但會導致多次呼叫onStart()方法。
採用startService()方法啟動的服務,只能呼叫Context.stopService()方法結束服務,服務結束時會呼叫
onDestroy()方法。
3.採用Context.bindService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate()方法,
接著呼叫onBind()方法。這個時候呼叫者和服務繫結在一起,呼叫者退出了,系統就會先呼叫服務的onUnbind()方法,
。接著呼叫onDestroy()方法。如果呼叫bindService()方法前服務已經被繫結,多次呼叫bindService()方法並不會
導致多次建立服務及繫結(也就是說onCreate()和onBind()方法並不會被多次呼叫)。如果呼叫者希望與正在繫結的服務
解除繫結,可以呼叫unbindService()方法,呼叫該方法也會導致系統呼叫服務的onUnbind()-->onDestroy()方法。
三。Service的生命週期
1.Service常用生命週期回撥方法如下:
onCreate() 該方法在服務被建立時呼叫,該方法只會被呼叫一次,無論呼叫多少次startService()或bindService()方法,
服務也只被建立一次。 onDestroy()該方法在服務被終止時呼叫。
2. Context.startService()啟動Service有關的生命週期方法
onStart() 只有採用Context.startService()方法啟動服務時才會回撥該方法。該方法在服務開始執行時被呼叫。
多次呼叫startService()方法儘管不會多次建立服務,但onStart() 方法會被多次呼叫。
3. Context.bindService()啟動Service有關的生命週期方法
onBind()只有採用Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與服務繫結時被呼叫,
當呼叫者與服務已經繫結,多次呼叫Context.bindService()方法並不會導致該方法被多次呼叫。
onUnbind()只有採用Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與服務解除繫結時被呼叫。
備註:
1. 採用startService()啟動服務
Intent intent =new Intent(DemoActivity.this, DemoService.class);
startService(intent);
2.Context.bindService()啟動
Intent intent =new Intent(DemoActivity.this, DemoService.class);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
//unbindService(conn);//解除繫結
46. 註冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。
Android廣播機制(兩種註冊方法)
在android下,要想接受廣播資訊,那麼這個廣播接收器就得我們自己來實現了,我們可以繼承BroadcastReceiver,就可以有一個廣播接受器了。有個接受器還不夠,我們還得重寫BroadcastReceiver裡面的onReceiver方法,當來廣播的時候我們要幹什麼,這就要我們自己來實現,不過我們可以搞一個資訊防火牆。具體的程式碼:
public class SmsBroadCastReceiverextends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
Object[] object = (Object[])bundle.get("pdus");
SmsMessage sms[]=new SmsMessage[object.length];
for(int i=0;i<object.length;i++)
{
sms[0] =SmsMessage.createFromPdu((byte[])object[i]);
Toast.makeText(context, "來自"+sms[i].getDisplayOriginatingAddress()+"的訊息是:"+sms[i].getDisplayMessageBody(),Toast.LENGTH_SHORT).show();
}
//終止廣播,在這裡我們可以稍微處理,根據使用者輸入的號碼可以實現簡訊防火牆。
abortBroadcast();
}
}
當實現了廣播接收器,還要設定廣播接收器接收廣播資訊的型別,這裡是資訊:android.provider.Telephony.SMS_RECEIVED
我們就可以把廣播接收器註冊到系統裡面,可以讓系統知道我們有個廣播接收器。這裡有兩種,一種是程式碼動態註冊:
//生成廣播處理
smsBroadCastReceiver = newSmsBroadCastReceiver();
//例項化過濾器並設定要過濾的廣播
IntentFilter intentFilter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
//註冊廣播
BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,intentFilter);
一種是在AndroidManifest.xml中配置廣播
<?xml version="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="spl.broadCastReceiver"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"android:label="@string/app_name">
<activity android:name=".BroadCastReceiverActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--廣播註冊-->
<receiver android:name=".SmsBroadCastReceiver">
<intent-filterandroid:priority="20">
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
<uses-sdk android:minSdkVersion="7" />
<!-- 許可權申請 -->
<uses-permissionandroid:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>
兩種註冊型別的區別是:
1)第一種不是常駐型廣播,也就是說廣播跟隨程式的生命週期。
2)第二種是常駐型,也就是說當應用程式關閉後,如果有資訊廣播來,程式也會被系統呼叫自動執行。
47. 請解釋下在單執行緒模型中Message、Handler、Message Queue、Looper之間的關係。
Handler簡介:
一個Handler允許你傳送和處理Message和Runable物件,這些物件和一個執行緒的MessageQueue相關聯。每一個執行緒例項和一個單獨的執行緒以及該執行緒的MessageQueue相關聯。當你建立一個新的Handler時,它就和建立它的執行緒繫結在一起了。這裡,執行緒我們也可以理解為執行緒的MessageQueue。從這一點上來看,Handler把Message和Runable物件傳遞給MessageQueue,而且在這些物件離開MessageQueue時,Handler負責執行他們。
Handler有兩個主要的用途:(1)確定在將來的某個時間點執行一個或者一些Message和Runnable物件。(2)在其他執行緒(不是Handler繫結執行緒)中排入一些要執行的動作。
Scheduling Message,即(1),可以通過以下方法完成:
post(Runnable):Runnable在handler繫結的執行緒上執行,也就是說不建立新執行緒。
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post這個動作讓你把Runnable物件排入MessageQueue,MessageQueue受到這些訊息的時候執行他們,當然以一定的排序。sendMessage這個動作允許你把Message物件排成佇列,這些Message物件包含一些資訊,Handler的hanlerMessage(Message)會處理這些Message.當然,handlerMessage(Message)必須由Handler的子類來重寫。這是程式設計人員需要作的事。
當posting或者sending到一個Hanler時,你可以有三種行為:當MessageQueue準備好就處理,定義一個延遲時間,定義一個精確的時間去處理。後兩者允許你實現timeout,tick,和基於時間的行為。
當你的應用建立一個新的程式時,主執行緒(也就是UI執行緒)自帶一個MessageQueue,這個MessageQueue管理頂層的應用物件(像activities,broadcastreceivers等)和主執行緒建立的窗體。你可以建立自己的執行緒,並通過一個Handler和主執行緒進行通訊。這和之前一樣,通過post和sendmessage來完成,差別在於在哪一個執行緒中執行這麼方法。在恰當的時候,給定的Runnable和Message將在Handler的MessageQueue中被Scheduled。
Message簡介:
Message類就是定義了一個資訊,這個資訊中包含一個描述符和任意的資料物件,這個資訊被用來傳遞給Handler.Message物件提供額外的兩個int域和一個Object域,這可以讓你在大多數情況下不用作分配的動作。
儘管Message的建構函式是public的,但是獲取Message例項的最好方法是呼叫Message.obtain(),或者Handler.obtainMessage()方法,這些方法會從回收物件池中獲取一個。
MessageQueue簡介:
這是一個包含message列表的底層類。Looper負責分發這些message。Messages並不是直接加到一個MessageQueue中,而是通過MessageQueue.IdleHandler關聯到Looper。
你可以通過Looper.myQueue()從當前執行緒中獲取MessageQueue。
Looper簡介:
Looper類被用來執行一個執行緒中的message迴圈。預設情況,沒有一個訊息迴圈關聯到執行緒。線上程中呼叫prepare()建立一個Looper,然後用loop()來處理messages,直到迴圈終止。
大多數和message loop的互動是通過Handler。
下面是一個典型的帶有Looper的執行緒實現。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public voidhandleMessage(Message msg) {
// process incomingmessages here
}
};
Looper.loop();
}
}
48. AIDL的全稱是什麼?如何工作?能處理哪些型別的資料?
AIDL的英文全稱是Android InterfaceDefine Language
當A程式要去呼叫B程式中的service時,並實現通訊,我們通常都是通過AIDL來操作的
A工程:
首先我們在net.blogjava.mobile.aidlservice包中建立一個RemoteService.aidl檔案,在裡面我們自定義一個介面,含有方法get。ADT外掛會在gen目錄下自動生成一個RemoteService.java檔案,該類中含有一個名為RemoteService.stub的內部類,該內部類中含有aidl檔案介面的get方法。
說明一:aidl檔案的位置不固定,可以任意
然後定義自己的MyService類,在MyService類中自定義一個內部類去繼承RemoteService.stub這個內部類,實現get方法。在onBind方法中返回這個內部類的物件,系統會自動將這個物件封裝成IBinder物件,傳遞給他的呼叫者。
其次需要在AndroidManifest.xml檔案中配置MyService類,程式碼如下:
<!-- 註冊服務 -->
<service android:name=".MyService">
<intent-filter>
<!-- 指定呼叫AIDL服務的ID -->
<actionandroid:name="net.blogjava.mobile.aidlservice.RemoteService" />
</intent-filter>
</service>
為什麼要指定呼叫AIDL服務的ID,就是要告訴外界MyService這個類能夠被別的程式訪問,只要別的程式知道這個ID,正是有了這個ID,B工程才能找到A工程實現通訊。
說明:AIDL並不需要許可權
B工程:
首先我們要將A工程中生成的RemoteService.java檔案拷貝到B工程中,在bindService方法中繫結aidl服務
繫結AIDL服務就是將RemoteService的ID作為intent的action引數。
說明:如果我們單獨將RemoteService.aidl檔案放在一個包裡,那個在我們將gen目錄下的該包拷貝到B工程中。如果我們將RemoteService.aidl檔案和我們的其他類存放在一起,那麼我們在B工程中就要建立相應的包,以保證RmoteService.java檔案的報名正確,我們不能修改RemoteService.java檔案
bindService(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection, Context.BIND_AUTO_CREATE);
ServiceConnection的onServiceConnected(ComponentNamename, IBinder service)方法中的service引數就是A工程中MyService類中繼承了RemoteService.stub類的內部類的物件。
49. 請解釋下Android程式執行時許可權與檔案系統許可權的區別。
執行時許可權Dalvik( android授權)
檔案系統 linux 核心授權
50. 系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。
通過直接傳送Uri把引數帶過去,或者通過manifest裡的intentfilter裡的data屬性
51. 你如何評價Android系統?優缺點。
答:Android平臺手機 5大優勢:
一、開放性
在優勢方面,Android平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到Android聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨著使用者和應用的日益豐富,一個嶄新的平臺也將很快走向成熟。開放性對於Android的發展而言,有利於積累人氣,這裡的人氣包括消費者和廠商,而對於消費者來講,隨大的受益正是豐富的軟體資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機。
二、掙脫運營商的束縛
在過去很長的一段時間,特別是在歐美地區,手機應用往往受到運營商制約,使用什麼功能接入什麼網路,幾乎都受到運營商的控制。從去年iPhone 上市,使用者可以更加方便地連線網路,運營商的制約減少。隨著EDGE、HSDPA這些2G至3G行動網路的逐步過渡和提升,手機隨意接入網路已不是運營商口中的笑談,當你可以通過手機IM軟體方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是不是像噩夢一樣?網際網路巨頭Google推動的Android終端天生就有網路特色,將讓使用者離網際網路更近。
三、豐富的硬體選擇
這一點還是與Android平臺的開放性相關,由於Android的開放性,眾多的廠商會推出千奇百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到資料同步、甚至軟體的相容,好比你從諾基亞 Symbian風格手機一下改用蘋果 iPhone ,同時還可將Symbian中優秀的軟體帶到iPhone上使用、聯絡人等資料更是可以方便地轉移,是不是非常方便呢?
四、不受任何限制的開發商
Android平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別緻的軟體會誕生。但也有其兩面性,血腥、暴力、情色方面的程式和遊戲如可控制正是留給Android難題之一。
五、無縫結合的Google應用
如今叱詫網際網路的Google已經走過10年度歷史,從搜尋巨人到全面的網際網路滲透,Google服務如地圖、郵件、搜尋等已經成為連線使用者和網際網路的重要紐帶,而Android平臺手機將無縫結合這些優秀的Google服務。
再說Android的5大不足:
一、安全和隱私
由於手機 與網際網路的緊密聯絡,個人隱私很難得到保守。除了上網過程中經意或不經意留下的個人足跡,Google這個巨人也時時站在你的身後,洞穿一切,因此,網際網路的深入將會帶來新一輪的隱私危機。
二、首先開賣Android手機的不是最大運營商
眾所周知,T-Mobile在23日,於美國紐約釋出 了Android首款手機G1。但是在北美市場,最大的兩家運營商乃AT&T和Verizon,而目前所知取得Android手機銷售權的僅有 T-Mobile和Sprint,其中T-Mobile的3G網路相對於其他三家也要遜色不少,因此,使用者可以買賬購買G1,能否體驗到最佳的3G網路服務則要另當別論了!
三、運營商仍然能夠影響到Android手機
在國內市場,不少使用者對購得移動定製機不滿,感覺所購的手機被人塗畫了廣告一般。這樣的情況在國外市場同樣出現。Android手機的另一發售運營商Sprint就將在其機型中內建其手機商店程式。
四、同類機型使用者減少
在不少手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,並分享軟體資源。而對於Android平臺手機,由於廠商豐富,產品型別多樣,這樣使用同一款機型的使用者越來越少,缺少統一機型的程式強化。舉個稍顯不當的例子,現在山寨機氾濫,品種各異,就很少有專門針對某個型號山寨機的討論和群組,除了哪些功能異常搶眼、頗受追捧的機型以外。
五、過分依賴開發商缺少標準配置
在使用PC端的Windows Xp系統的時候,都會內建微軟WindowsMedia Player這樣一個瀏覽器程式,使用者可以選擇更多樣的播放器,如Realplay或暴風影音等。但入手開始使用預設的程式同樣可以應付多樣的需要。在 Android平臺中,由於其開放性,軟體更多依賴第三方廠商,比如Android系統的SDK中就沒有內建音樂 播放器,全部依賴第三方開發,缺少了產品的統一性。
52. 什麼是ANR 如何避免它?
答:ANR:ApplicationNot Responding,五秒
在Android中,活動管理器和視窗管理器這兩個系統服務負責監視應用程式的響應。當出現下列情況時,Android就會顯示ANR對話方塊了:
對輸入事件(如按鍵、觸控式螢幕事件)的響應超過5秒
意向接受器(intentReceiver)超過10秒鐘仍未執行完畢
Android應用程式完全執行在一個獨立的執行緒中(例如main)。這就意味著,任何在主執行緒中執行的,需要消耗大量時間的操作都會引發ANR。因為此時,你的應用程式已經沒有機會去響應輸入事件和意向廣播(Intentbroadcast)。
因此,任何執行在主執行緒中的方法,都要儘可能的只做少量的工作。特別是活動生命週期中的重要方法如onCreate()和onResume()等更應如此。潛在的比較耗時的操作,如訪問網路和資料庫;或者是開銷很大的計算,比如改變點陣圖的大小,需要在一個單獨的子執行緒中完成(或者是使用非同步請求,如資料庫操作)。但這並不意味著你的主執行緒需要進入阻塞狀態已等待子執行緒結束-- 也不需要呼叫Therad.wait()或者Thread.sleep()方法。取而代之的是,主執行緒為子執行緒提供一個控制程式碼(Handler),讓子執行緒在即將結束的時候呼叫它(xing:可以參看Snake的例子,這種方法與以前我們所接觸的有所不同)。使用這種方法涉及你的應用程式,能夠保證你的程式對輸入保持良好的響應,從而避免因為輸入事件超過5秒鐘不被處理而產生的ANR。這種實踐需要應用到所有顯示使用者介面的執行緒,因為他們都面臨著同樣的超時問題。
53. 什麼情況會導致ForceClose ?如何避免?能否捕獲導致其的異常?
答:一般像空指標啊,可以看起logcat,然後對應到程式中 來解決錯誤
54. Android本身的api並未宣告會丟擲異常,則其在執行時有無可能丟擲runtime異常,你遇到過嗎?諾有的話會導致什麼問題?如何解決?
55. 簡要解釋一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver
答:一個activity呈現了一個使用者可以操作的視覺化使用者介面
一個service不包含可見的使用者介面,而是在後臺無限地執行
可以連線到一個正在執行的服務中,連線後,可以通過服務中暴露出來的藉口與其進行通訊
一個broadcastreceiver是一個接收廣播訊息並作出回應的component,broadcast receiver沒有介面
intent:content provider在接收到ContentResolver的請求時被啟用。
activity, service和broadcastreceiver是被稱為intents的非同步訊息啟用的。
一個intent是一個Intent物件,它儲存了訊息的內容。對於activity和service來說,它指定了請求的操作名稱和待運算元據的URI
Intent物件可以顯式的指定一個目標component。如果這樣的話,android會找到這個component(基於manifest檔案中的宣告)並啟用它。但如果一個目標不是顯式指定的,android必須找到響應intent的最佳component。
它是通過將Intent物件和目標的intentfilter相比較來完成這一工作的。一個component的intent filter告訴android該component能處理的intent。intentfilter也是在manifest檔案中宣告的。
56. IntentService有何優點?
答:IntentService的好處
* Acitivity的程式,當處理Intent的時候,會產生一個對應的Service
* Android的程式處理器現在會盡可能的不kill掉你
* 非常容易使用
57. 橫豎屏切換時候activity的生命週期?
1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次
3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法
如何將SQLite資料庫(dictionary.db檔案)與apk檔案一起釋出?
解答:可以將dictionary.db檔案複製到EclipseAndroid工程中的res aw目錄中。所有在res aw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。可以將dictionary.db檔案複製到resaw目錄中
58. 如何將開啟res aw目錄中的資料庫檔案?
解答:在Android中不能直接開啟resaw目錄中的資料庫檔案,而需要在程式第一次啟動時將該檔案複製到手機記憶體或SD卡的某個目錄中,然後再開啟該資料庫檔案。複製的基本方法是使用getResources().openRawResource方法獲得resaw目錄中資源的 InputStream物件,然後將該InputStream物件中的資料寫入其他的目錄中相應檔案中。在AndroidSDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來開啟任意目錄中的SQLite資料庫檔案。
59. Android引入廣播機制的用意?
答:a:從MVC的角度考慮(應用程式內)
其實回答這個問題的時候還可以這樣問,android為什麼要有那4大元件,現在的移動開發模型基本上也是照搬的web那一套MVC架構,只不過是改了點嫁妝而已。android的四大元件本質上就是為了實現移動或者說嵌入式裝置上的MVC架構,它們之間有時候是一種相互依存的關係,有時候又是一種補充關係,引入廣播機制可以方便幾大元件的資訊和資料互動。
b:程式間互通訊息(例如在自己的應用程式內監聽系統來電)
c:效率上(參考UDP的廣播協議在區域網的方便性)
d:設計模式上(反轉控制的一種應用,類似監聽者模式)
60. Android dvm的程式和Linux的程式, 應用程式的程式是否為同一個概念
DVM指dalivk的虛擬機器。每一個Android應用程式都在它自己的程式中執行,都擁有一個獨立的Dalvik虛擬機器例項。而每一個DVM都是在Linux 中的一個程式,所以說可以認為是同一個概念。
61. sim卡的EF 檔案有何作用
sim卡的檔案系統有自己規範,主要是為了和手機通訊,sim本 身可以有自己的作業系統,EF就是作儲存並和手機通訊用的
62. 嵌入式作業系統記憶體管理有哪幾種, 各有何特性
頁式,段式,段頁,用到了MMU,虛擬空間等技術
63. 什麼是嵌入式實時作業系統,Android 作業系統屬於實時作業系統嗎?
嵌入式實時作業系統是指當外界事件或資料產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致執行的嵌入式作業系統。主要用於工業控制、 軍事裝置、 航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而android是基於linux核心的,因此屬於軟實時。
64. 一條最長的簡訊息約佔多少byte?
中文70(包括標點),英文160,160個位元組。
65. android中的動畫有哪幾類,它們的特點和區別是什麼?
兩種,一種是Tween動畫、還有一種是Frame動畫。Tween動畫,這種實現方式可以使檢視元件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
66. handler機制的原理
andriod提供了 Handler 和 Looper 來滿足執行緒間的通訊。Handler 先進先出原則。Looper類用來管理特定執行緒內物件之間的訊息交換(Message Exchange)。
1)Looper:一個執行緒可以產生一個Looper物件,由它來管理此執行緒裡的Message Queue(訊息佇列)。
2)Handler:你可以構造Handler物件來與Looper溝通,以便push新訊息到MessageQueue裡;或者接收Looper從Message Queue取出)所送來的訊息。
3)Message Queue(訊息佇列):用來存放執行緒放入的訊息。
4)執行緒:UI thread 通常就是main thread,而Android啟動程式時會替它建立一個Message Queue。
67. 說說mvc模式的原理,它在android中的運用
MVC(Model_view_contraller)”模型_檢視_控制器”。 MVC應用程式總是由這三個部分組成。Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要 Controller改變了Models的資料或者屬性,所有依賴的View都會自動更新。類似的,只要Contro
68. DDMS和TraceView的區別?
DDMS是一個程式執行檢視器,在裡面可以看見執行緒和堆疊等資訊,TraceView是程式效能分析器。
69. java中如何引用本地語言
可以用JNI(java native interface java 本地介面)介面。
70. 談談Android的IPC(程式間通訊)機制
IPC是內部程式通訊的簡稱, 是共享"命名管道"的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行互動,故在Android中該機制,只適用於Activity和Service之間的通訊,類似於遠端方法呼叫,類似於C/S模式的訪問。通過定義AIDL介面檔案來定義IPC介面。Servier端實現IPC介面,Client端呼叫IPC介面本地代理。
71. NDK是什麼
NDK是一些列工具的集合,NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和java 應用打成apk包。
NDK整合了交叉編譯器,並提供了相應的mk檔案和隔離cpu、平臺等的差異,開發人員只需簡單的修改mk檔案就可以建立出so
相關文章
- Android面試題Android面試題
- Android面試題收集Android面試題
- Android面試題(四)Android面試題
- 【Android面試題】2Android面試題
- Android 面試之某些公司的面試題Android面試題
- Android基礎面試題Android面試題
- Android面試問題整理Android面試
- Android面試題(轉載)Android面試題
- Android面試題記錄Android面試題
- android 面試題總結Android面試題
- Android 面試題彙總Android面試題
- Android 面試題,百度,小米,阿里面試題Android面試題阿里
- Android面試送分題:Android面試真題解析火爆全網,建議收藏Android面試
- 面試題總結-Android部分面試題Android
- Android史上最全面試題Android面試題
- Android面試題——進階篇Android面試題
- Android面試題之Fragment篇Android面試題Fragment
- Android面試題---真實分享Android面試題
- Android拿高薪面試題必看Android高薪面試題
- 安卓面試題 Android interview questions安卓面試題AndroidView
- Android 面試題集 包含答案Android面試題
- 最新Android面試題整理 5月Android面試題
- Android工程師面試題大全Android工程師面試題
- Android面試總結,有了這些中高階面試專題-大廠還會遠嗎?Android面試題及解析Android面試題
- Android面試題之Android中的設計模式Android面試題設計模式
- Android 面試題集合(2018)Android面試題
- 分享幾個重要的Android面試題Android面試題
- Android面試題《思考與解答》11月刊Android面試題
- Android 面試題整理(2018)Android面試題
- Android面試題之Gradle配置篇Android面試題Gradle
- Android面試基礎題總結二Android面試
- 必看Android500道高薪面試題集Android高薪面試題
- Android大廠面試題錦集(BATTMDJD小米)Android面試題BAT
- Android 面試題(附答案) | 掘金技術徵文Android面試題
- Android面試之Java基礎筆試題Android面試Java筆試
- Android面試題收錄及解答10月刊Android面試題
- 2018年Android面試題整理Android面試題
- Android&Java面試題大全—金九銀十面試必備AndroidJava面試題