Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android面試知識(2)

Android面試知識(2)

編輯:關於Android編程

14、頁面上現有ProgressBar控件progressBar,請用書寫線程以10秒的的時間完成其進度顯示工作。

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ProgressBar;

public class ProgressBarTestActivity extends Activity {
    private ProgressBar mProgress;
    private Handler mHandler = new Handler();

    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.progressbar_activity);
        mProgress = (ProgressBar) findViewById(R.id.progress_bar);
        Thread thread = new Thread(new Runnable() {
            public void run() {
                int progressBarMax = mProgress.getMax();
                try {
                    while (progressBarMax != mProgress.getProgress()) {
                        int stepProgress = progressBarMax / 10;
                        int currentprogress = mProgress.getProgress();
                        final int progress = stepProgress + currentprogress;
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                mProgress.setProgress(progress);
                            }
                        });
                        Thread.sleep(1000);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
}

15、請描述下Activity的生命周期

必調用的三個方法:onCreate() –> onStart() –> onResume(),用AAA表示。
- 父Activity(A)啟動,點擊啟動子Activity(B),子Actvity退出,返回父Activity的調用順序如下:
AAA –> onFreeze() –> onPause() –> B onCreate() -> B onStart() -> B onResume –> onStop() –> onRestart() –> onStart()->onResume()
- 用戶點擊Home,Actvity調用順序如下:
AAA –> onFreeze() -> onPause() –> onStop() — Maybe –> onDestroy()
- 用戶點擊back鍵,Activity調用順序如下:
AAA-> onPause() –> onStop() –> onDestroy() ->onCreate()->onStart()->onResume()
- 在Activity上顯示dialog, Activity調用順序如下:
AAA -> onPause()
- 在父Activity上顯示透明的或非全屏的activity,Activity調用順序如下:
AAA –> onFreeze() –> onPause()
- 設備進入睡眠狀態,Activity調用順序如下:
AAA –> onFreeze() –> onPause()

16、如果後台的Activity由於某原因被系統回收了,如何在被系統回收之前保存當前狀態?

onSaveInstanceState()
當你的程序中某一個Activity A在運行時,主動或被動地運行另一個新的Activity B,這個時候A會執行onSaveInstanceState(),如下:

public void onSaveInstanceState(Bundle outState) {    
    super.onSaveInstanceState(outState);    
    outState.putLong("id", 1234567890);
} 

B完成以後又回來找A,這個時候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調用onCreate()方法,不同於直接啟動的是這回onCreate()裡是帶上了參數savedInstanceState;而沒被收回的就直接執行onResume(),跳過onCreate()了。

17、如何將一個Activity設置成窗口的樣式。

在AndroidManifest.xml 中定義Activity的地方加上主題android:theme=”@android:style/Theme.Dialog”或android:theme=”@android:style/Theme.Translucent”就變成半透明的

18、如何退出Activity?如何安全退出已調用多個Activity的Application?

退出Activity直接調用Activity的finish()方法。 退出多個Activity應用:
方法一記錄打開的Activity,每打開一個Activity,就記錄下來,在需要退出時,關閉每一個activity;
方法二發送特定的廣播,在需要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後關閉;
方法三通過Intent的flag來實現,實現intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的 activity。此時如果該任務棧中已經有該 Activity,那麼系統會把這個Activity上面的所有Activity干掉。其實相當於給Activity配置的啟動模式為SingleTop。

19、請介紹下ContentProvider是如何實現數據共享的。

Android提供了ContentProvider,一個程序可以通過實現一個ContentProvider的抽象接口將自己的數據完全暴露出去,而且ContentProviders是以類似數據庫中表的方式將數據暴露,也就是說ContentProvider就像一個“數據庫”。那麼外界獲取其提供的數據,也就應該與從數據庫中獲取數據的操作基本一樣,只不過是采用URI來表示外界需要訪問的“數據庫”。外部訪問通過ContentResolver去訪問並操作這些被暴露的數據。所以,創建一個屬於你自己的Content provider或者將你的數據添加到一個已經存在的Content provider中(前提是有相同數據類型並且有寫入Content provider的權限),就可實現共享。

20、如何啟用Service,如何停用Service。

1)、步驟

第一步:繼承Service類:

public class SMSService extends Service {}

第二步:在AndroidManifest.xml文件中的節點裡對服務進行配置:

2)、Context.startService()和Context.bindService()

服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啟動服務。
- 使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。

使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止。

如果打算采用Context.startService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法。采用startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。

如果打算采用Context.bindService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind()方法,接著調用onDestroy()方法。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就是說onCreate()和onBind()方法並不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()–>onDestroy()方法。

3)、Service的生命周期

onCreate() 該方法在服務被創建時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,服務也只被創建一次。onDestroy()該方法在服務被終止時調用。

與采用Context.startService()方法啟動服務有關的生命周期方法:

onStart() 只有采用Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運行時被調用。多次調用startService()方法盡管不會多次創建服務,但onStart() 方法會被多次調用

與采用Context.bindService()方法啟動服務有關的生命周期方法:

onBind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用

onUnbind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用

21、注冊廣播有幾種方式,這些方式有何優缺點?請談談Android引入廣播機制的用意。

在android下,要想接受廣播信息,就需要自己來實現一個廣播接收器,這裡重寫onReceiver()方法,來實現一個信息防火牆:

public class SmsBroadCastReceiverextendsBroadcastReceiver {  
   @Override  
   public void onReceive(Context context, Intentintent) {   
       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);  
            Toast.makeText(context,"來自" + sms.getDisplayOriginatingAddress()+"的消息是:" + sms.getDisplayMessageBody(),Toast.LENGTH_SHORT).show();   
       }   
       //終止廣播,在這裡我們可以稍微處理,根據用戶輸入的號碼可以實現短信防火牆。   
       abortBroadcast();   
   }   
} 

當實現了廣播接收器,還要設置廣播接收器接收廣播信息的類型,這裡是信息:android.provider.Telephony.SMS_RECEIVED

我們就可以把廣播接收器注冊到系統裡面,可以讓系統知道我們有個廣播接收器。這裡有兩種,一種是代碼動態注冊

//生成廣播處理  
smsBroadCastReceiver = new SmsBroadCastReceiver();   
//實例化過濾器並設置要過濾的廣播  
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
//注冊廣播   
BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,intentFilter); 

一種是在AndroidManifest.xml中配置廣播:

  
 
   
         
              
                  
                  
              
         

         
         
              
                  
              
         

     

     

     
     

   

兩種注冊類型的區別是:

1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。

2)第二種是常駐型,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved