1. 下列哪些語句關於記憶體回收的說明是正確的? (b) A、 程式員必須創建一個線程來釋放記憶體 B、 記憶體回收程式負責釋放無用記憶體 C、 記憶體回收程式允許程式員直接釋放記憶體 D、 記憶體回收程式可以在指定的時間釋放記憶體對象 2. 下麵異常是屬於Runtime Exception 的是(abcd)(多選 ...
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)
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、 <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 Server Management Studio 中運行下列T-SQL語句,其輸出值(c)。 SELECT @@IDENTITY
A、 可能為0.1
B、 可能為3
C、 不可能為-100
D、 肯定為0
12. 在SQL Server 2005中運行如下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、<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. 下麵關於Android dvm的進程和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 開發的開端
二.文件存儲方式
三.SQLite資料庫方式
四.內容提供器(Content provider)方式
二、Android面試填空題
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=new String("good");
char[]ch={'a','b','c'};
public static void main(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(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}
34. 在android中,請簡述jni的調用過程。(8分)
1)安裝和下載Cygwin,下載 Android NDK
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方式
五. 網路存儲方式
44. 請介紹下ContentProvider是如何實現數據共用的。創建一個屬於你自己的Content provider或者將你的數據添加到一個已經存在的Contentprovider中,前提是有相同數據類型並且有寫入Content provider的許可權。
45. 如何啟用Service,如何停用Service。Android中的service類似於windows中的service,service一般沒有用戶操作界面,它運行於系統中不容易被用戶發覺,
可以使用它開發如監控之類的程式。
一。步驟
第一步:繼承Service類
public class SMSService extends Service { }
第二步:在AndroidManifest.xml文件中的節點里對服務進行配置:
二。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()啟動
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
{
sms[0] =SmsMessage.createFromPdu((byte[])object);
Toast.makeText(context, "來自"+sms.getDisplayOriginatingAddress()+"的消息是:"+sms.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中配置廣播
package="spl.broadCastReceiver"
android:versionCode="1"
android:versionName="1.0">
android:label="@string/app_name">
兩種註冊類型的區別是:
1)第一種不是常駐型廣播,也就是說廣播跟隨程式的生命周期。
2)第二種是常駐型,也就是說當應用程式關閉後,如果有信息廣播來,程式也會被系統調用自動運行。
47. 請解釋下在單線程模型中Message、Handler、MessageQueue、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,broadcast receivers等)和主線程創建的窗體。你可以創建自己的線程,並通過一個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 Interface Define 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類,代碼如下:
為什麼要指定調用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(ComponentName name, IBinderservice)方法中的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平臺手機,由於廠商豐富,產品類型多樣,這樣使用同一款機型的用戶越來越少,缺少統一機型的程式強化。舉個稍顯不當的例子,現在山寨