Android 70道面試題彙總

来源:http://www.cnblogs.com/ixiongpeng/archive/2016/08/19/5788265.html
-Advertisement-
Play Games

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()啟動

  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
  {
  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平臺手機,由於廠商豐富,產品類型多樣,這樣使用同一款機型的用戶越來越少,缺少統一機型的程式強化。舉個稍顯不當的例子,現在山寨

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一種: 第二種: 第三種: ...
  • 谷歌最近更新了Support Library 24.2.0,而DiffUtil就是在這個版本添加的一個工具類。 DiffUtil是一個查找集合變化的工具類,是搭配RecyclerView一起使用的,如果你還不瞭解RecyclerView,可以閱讀一些資料或者我的博客:RecyclerView使用初探 ...
  • ListFragment繼承了Fragment,顧名思義,ListFragment是一種特殊的Fragment,它包含了一個ListView,在ListView裡面顯示數據。 1. MainActivity Java類文件: xml佈局文件: 可見MainActivity是比較簡單的,在佈局裡面放了 ...
  • Android中常用的5大佈局方式有以下幾種: Android中常用的5大佈局方式有以下幾種: Android中常用的5大佈局方式有以下幾種: 線性佈局(LinearLayout):按照垂直或者水平方向佈局的組件。 幀佈局(FrameLayout):組件從屏幕左上方佈局組件。 表格佈局(TableL ...
  • 該系列教程概述與目錄:http://www.cnblogs.com/chengyujia/p/5787111.html 一、自定義控制項簡介 在本項目中,無論是游戲主區域還是虛擬方向鍵都是通過自定義控制項來實現的,我們有必要先對自定義控制項有個簡單的瞭解。而且通過自定義控制項的學習能更好的理解系統自帶控制項的 ...
  • 什麼是Dagger2 Dagger是為Android和Java平臺提供的一個完全靜態的,在編譯時進行依賴註入的框架,原來是由Square公司維護,現在由Google維護。 我們知道Dagger是一個依賴註入的框架,那麼什麼是依賴註入呢? 我們在activity中有可能會用到很多很多的類,這些類要在a ...
  • 1.參考文獻 http://hi.baidu.com/accpzhangbo/blog/item/52aeffc683ee6ec238db4965.html 2.解析 查看java.lang.System的源代碼,我們可以找到System.exit(status)這個方法的說明,代碼如下: /** ...
  • 一般2D游戲使用SurfaceView足夠,所以不要認為什麼都要使用GLSurfaceView(openGL),而且 GLSurfaceView的弊端在於適配能力差,因為很多機型中是沒有GPU加速的。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...