標籤:通過 ima imp content 請求 上傳 player r.java factor
這些面試是我之前總結的 。覺得還不錯,就貼出來與大家分享一下。當中有不少問題。也是我以前被面試官問過的問題,另一些基礎問題總結(既然是基礎知識 ,必定是成為一名的 Android 開發人員 所必須掌握的 )。
有多個問題,我都替你試過了,這樣回答面試官。還能夠啊,嘿嘿
1、 Android中四大組件及其作用?
1、Activity:activity是使用者和應用程式互動的表單,一個activity相當於我們實際中的一個網頁。當開啟一個螢幕時,之前的那一個螢幕會被置為暫停狀態。而且壓入曆史堆棧中,使用者能夠通過後援動作返回到以前開啟過的螢幕。activity的生命週期:即“產生、運行、銷毀”。可是這當中會調用很多方法onCreate(建立) 、onStart(啟用)、onResume(恢複)、onPause(暫停)、onStop(停止)、onDestroy(銷毀)、onRestart(重新啟動)。
2、Service:Service是一種程式,它能夠運行非常長的時間,相當於背景一個服務。通過startService(Intent service)能夠啟動一個Service,通過Context.bindService()能夠綁定一個Service。
3、BroadCastRecevicer:接受一種或者多種Intent作觸發事件。接受相關訊息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型。能夠使用BroadcastReceiver來讓應用對外一個外部的事件作出響應。Broadcast Receiver通過NotificationManager來通知使用者這些事情發生了,BroadcastReceiver注冊的有兩種方式,一種是能夠在AndroidManifest.xml中注冊,另一種能夠在運行時的代碼中使用Context.registerReceiver()進行注冊。
使用者還能夠通過Context.sendBroadcast()將他們自己的intent broadcasts廣播給其它的應用程式。
4、Content provider:內容提供者,可通過它來共用自己的資料給外部調用,給第三方應用提供資料訪問的介面。
2、ListView的最佳化方案?
1、假設自己定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否為null。假設為null就建立contentView並返回。假設不為null則直接使用。
在這種方法中儘可能少建立view。
2、給contentView設定tag(setTag()),傳入一個viewHolder對象, 用於緩衝要顯示的資料,能夠達到映像資料非同步載入的效果。
3、假設listview須要顯示的item非常多,就要考慮分頁載入。比方一共要 顯示100條或者很多其它的時候,我們能夠考慮先載入20條。等使用者拉到列表 底部的時候再去載入接下來的20條。分頁載入還沒學習。
3、Android中五種資料存放區方式各自是什嗎?他們的特點?
Android提供了五種存取資料的方式
(1)SharedPreference。存放較少的五種類型的資料,僅僅能在同一個包內使
用。產生XML的格式存放在裝置中
(2) SQLite資料庫,存放各種資料,是一個輕量級的嵌入式資料庫
(3) File檔案。通過讀取寫入方式組建檔案存放資料
(4) ContentProvider。主要用於讓其它應用程式使用儲存的資料
(5)通過網路擷取資料和寫入資料到網路儲存空間
4、列舉Android中的主要五種經常使用布局?
最經常使用的布局有下面這幾種:
第一種:幀布局(架構布局)FrameLayout
另外一種:線性布局LinearLayout
第三種:絕對布局AbsoluteLayout
第四種:相對布局RelativeLayout
第五種:表格版面配置TableLayout
5、敘述學過的系統提供的Adapter?說明自己定義Adapter與系統Adapter的差別?
採用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter這些系統內建的適配器,對於事件的響應僅僅能局限在一個行單位。
假設一行裡面有一個button控制項,它們之間的響應操作是不一樣的。若採用系統內建的適配器。就不能精確到每一個控制項的響應事件。這時,我們一般採取自己定義適配器來實現這個比較精確地請求。
6、Android中asset檔案夾和raw檔案夾差別?
res/raw和assets的同樣點:
兩者檔案夾下的檔案在打包後會原封不動的儲存在apk包中。不會被編譯成二進位。
res/raw和assets的不同點:
(1)res/raw中的檔案會被映射到R.java檔案裡,訪問的時候直接使用資源ID即 R.raw.filename;assets檔案夾下的檔案不會被映射到R.java中,訪問的時候須要AssetManager類。
(2)res/raw不能夠有檔案夾結構,而assets則能夠有檔案夾結構,也就是assets檔案夾下能夠再建立檔案夾
(3)讀取檔案資源舉例:
讀取res/raw下的檔案資源,通過下面方式擷取輸入資料流來進行寫操作
InputStream is = getResources().openRawResource(R.raw.filename);
讀取assets下的檔案資源,通過下面方式擷取輸入資料流來進行寫操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open(“filename”);
7、顯式Intent和隱式Intent差別?
Intent是一種在不同組件之間傳遞的請求訊息。是應用程式發出的請求和意圖。對於明白指出了目標組件名稱的Intent,我們稱之為顯式Intent。對於沒有明白指出目標組件名稱的Intent,則稱之為隱式Intent。Android系統使用IntentFilter 來尋找與隱式Intent相關的對象。
顯式Intent直接用組件的名稱定義目標組件。這樣的方式非常直接。可是因為開發人員往往並不清楚別的應用程式的組件名稱,因此,顯式Intent很多其它用於在應用程式內部傳遞訊息。比方在某應用程式內。一個Activity啟動一個Service。
隱式Intent恰恰相反。它不會用組件名稱定義須要啟用的目標組件,它更廣泛地用於在不同應用程式之間傳遞訊息。
8、簡要描寫敘述AIDL的實現步驟?
server端:
1:server端寫AIDL
2:server端繼承Service。重寫3個方法
3:server端執行個體化一個AIDL定義介面的Stub對象,並實現介面的抽象方法;
4:設定檔
client:
1:拷貝AIDL檔案
2:綁定與Service端的服務
3:實現ServiceConnection,在實現的過程中通過Service端傳遞過來的IBinder得到Stub對象;比如:介面名.Stub.asInterface(service);
4:通過Stub對象調用相應方法
9、 談談Service的生命週期,以及兩種方式的差別?
*Service的生命週期由使用Service兩種方式決定,啟動方式不同生命週期不同。
(1)Start方式啟動Service的生命週期:
onCreate()—onStartCommond()—onDestroy()
調用者和服務之間沒有不論什麼的聯絡,即使調用者退出,那麼服務也仍然進行。
(2)Bind方式啟動Service的生命週期:onCreate()->onBind()->–>onUnbind() -> onDestroy()
調用者和服務綁定在一起。調用者退出。服務即便退出。
10、 敘述學過的系統提供的Adapter(說明自己定義Adapter與系統Adapter的差別)?
採用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter這些系統內建的適配器,對於事件的響應僅僅能局限在一個行單位。假設一行裡面有一個button控制項,它們之間的響應操作是不一樣的。若採用系統內建的適配器,就不能精確到每一個控制項的響應事件。
這時。我們一般採取自己定義適配器來實現這個比較精確地請求。
11、寫出ListView最佳化的代碼。已知自己定義ListView中自己定義布局檔案為list_item.xml裡面有ImageView和TextView兩個組件,其id為item_image、item_text。
public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder viewHolder; if(convertView==null){ viewHolder=new ViewHolder(); convertView=LayoutInflater.from(c).inflate(R.layout.list_item, null); viewHolder.text=(TextView) convertView.findViewById(R.id.item_text); viewHolder.image=(ImageView) convertView.findViewById(R.id.item_image); convertView.setTag(viewHolder); } viewHolder=(ViewHolder) convertView.getTag(); viewHolder.text.setText(list.get(position).getText()); viewHolder.image.setImageResource(list.get(position).getImage()); return convertView; } static class ViewHolder{ TextView text; ImageView image; }
12、 描寫敘述通過contentResolver擷取ContentProvider內容的基本步驟 ?
第一:得到ContentResolver類對象
ContentResolver cr=getContentResolver();
第二:定義要查詢的欄位String數組
第三:使用cr.query();返回一個Cursor對象
第四:使用while迴圈得到Cursor裡面的內容
13、 描寫敘述一下自己定義ContentProvider的步驟。
自己定義contentprovider步驟
1)繼承Android的ContentProvider基類實現自己的ContentProvider類。
2)實現 ContentProvider裡的onCreate方法,建立provider的資料,一般為資料庫sqlite,那麼我們在onCreate裡執行個體化一個SqliteOpenHelper。
3)在ContentProvider 裡面重寫insert/delete/update/query增刪改查這些方法。在每一個方法裡面實現相應的功能。
4)在AndroidManifest.xml檔案裡注冊該ContentProvider類。為ContentProvider指定Uri。
14、 怎樣實現一個幀動畫?
在布局檔案裡加入ImageView組件。設定background為res/anim/fram.xml動畫效果
通過ImageView對象的getBackground()方法得到AnimationDrawable對象
通過AnimationDrawable對象的start()來啟動幀動畫。stop()來停止動畫
15、 res/raw與assets檔案夾的差別?
同樣點:
兩者都會原封不動的儲存在apk包中。不會被編譯成二進位碼。
不同點:
1、raw檔案夾下僅僅能存放檔案,不能存放下一級的檔案夾,而assets能夠存放下一級的檔案夾。
2、raw檔案夾下的資源會映射到R.java中產生資源id。
而assets不會。
3、獲得資源的方法不同。代碼例如以下:
this.getAssets().open(“xml/channels.xml”)
this.getResources().openRawResource(R.raw.students)
this.getClassLoader().getResourceAsStream(“student.xml”)
16、 簡述Handler機制原理?
*Andriod提供了 Handler 和 Looper 來滿足線程間的通訊。
Android不同意UI線程之外的線程改變UI組件的值。所以要想在其它線程裡面改變UI組件的值。必須使用Handler來實現。 Looper: 一個線程能夠產生一個Looper對象,由它來管理此線程裡的Message Queue(訊息佇列)。 Handler: 你能夠構造Handler對象來與Looper溝通,以便push(上傳)新訊息到Message Queue裡;或者接收Looper從Message Queue取出的訊息。 Message Queue(訊息佇列,特點:先進先出):用來存放線程放入的訊息。 線程:UI thread 通常就是main thread,而Android啟動程式時會替它建立一個Message Queue。 Handler、Looper、MessageQueue的初始化流程例如以下所看到的。
Hander持有對UI主線程訊息佇列UI_MQ和訊息迴圈Looper的引用,子線程能夠通過Handler將訊息發送到UI線程的訊息佇列UI_MQ中。 Handler處理訊息UI主線程通過Looper迴圈查詢訊息佇列UI_MQ。當發現有訊息存在時會將訊息從訊息佇列中取出。首先分析訊息,通過訊息的參數推斷該訊息相應的Handler,然後將訊息分發到指定的Handler進行處理。
17、在android中怎樣使用SqliteOpenHelper?
1、建立一個類繼承SqliteOpenHelper。聲明一個構造方法,參數包括(Context,name,CursorFactory,version);建立資料庫
2、實現其oncreate() 建立表
3:通過onupgrade() 版本更新時運行;
4、執行個體化所建類對象,對其進行讀寫操作。運行sql語句建立資料庫(當對其使用讀寫時會推斷資料庫是否存在,假設存在,則不運行oncreate,不存在則運行)。
18、使用SqliteOpenHelper和SqliteDatabase進行增刪改查詳細的方法和參數?
1、通過SqliteOpenHelper得到SqliteDataBase的執行個體化對象(分為讀寫兩種);
2、調用execSQL()運行增刪改的SQL語句,傳入SQL語句及須要填充的參數。
調用Cursor cursor = rawQuery()執行查詢的語句
3、對運行SQL語句返回的遊標。進行遍曆;
4、及時關閉SqliteDataBase。
19、Sqlite和sharedPreference的差別
(1)Sqlite是嵌入式SQL資料庫引擎SQLite(SQLite Embeddable SQL Database Engine)的一個擴充。
SQLite是一個實現嵌入式SQL資料庫引擎的 C語言庫(C library)。
用SQLite串連的程式能夠使用SQL資料庫。但不須要運行一個單獨的關係型資料庫管理系統進程(separate RDBMS process)。
SQLite直接讀寫(reads and writes directly)在硬碟上的資料庫檔案。
(2)SharedPreferences也是一種輕型的資料存放區方式,它的本質是基於XML檔案儲存體key-value索引值對資料,通經常使用來儲存一些簡單的配置資訊。其儲存位置在/data/data/<包名>/shared_prefs檔案夾下。SharedPreferences對象本身僅僅能擷取資料而不支援儲存和改動,儲存改動是通過Editor對象實現。
20、為什麼要用ContentProvider?它與sql在實現上有何差別
Sql僅僅能在該project的內部共用資料,ContentProvider能在project之間實現資料共用。
21、描寫敘述ContentProvider URI有哪幾部分組成
URI由是部分組成:
content://com.example.transportation/trains/122
A,標準的首碼: ContentProvider(內容提供者)的scheme已經由Android所規定。 scheme為:content://
B,唯一標識整個Content Provider: 主機名稱(或叫Authority)用於唯一標識這個ContentProvider。外部調用者能夠依據這個標識來找到它。
C,描寫敘述了資料的路徑。確定返回哪類資料: 路徑(path)能夠用來表示我們要操作的資料。路徑的構建應依據業務而定
D。ID唯一標註請求的資料: 我們要請求資料的ID
22、怎樣通過contentResolver掃描sdcard全部多媒體檔案?
1) 通過ContentResolver訪問系統多媒體提供的ContentProvider,得到多媒體音樂的cursor
2) 解析cursor。通過cursor得到相應檔案清單
3) 設定listView,依據格式不同展示不同圖片,進行使用
23、.描寫敘述一下開發ContentProvider的步驟
自己定義contentprovider步驟
繼承Android的ContentProvider基類實現自己的ContentProvider類。 實現 ContentProvider裡的onCreate方法,建立provider的資料,一般為資料庫sqlite。那麼我們在onCreate裡執行個體化一個SqliteOpenHelper。 在ContentProvider 裡面重寫insert/delete/update/query增刪改查這些方法。
在每一個方法裡面實現相應的功能。 在AndroidManifest.xml檔案裡注冊該ContentProvider類,為ContentProvider指定Uri。
24、.Android中怎樣訪問自己定義ContentProvider?
1:得到ContentResolver類對象:ContentResolver cr = getContentResolver();
2:定義要查詢的欄位String數組。
3:使用cr.query(URI,欄位數組。null。 null,null);,返回一個Cursor對象。
4:使用while迴圈得到Cursor裡面的內容。
25、 Android中五種資料存放區方式各自是什嗎?他們的特點?
Android提供了五種存取資料的方式
(1)SharedPreference。存放較少的五種類型的資料,僅僅能在同一個包內使用,產生XML的格式存放在裝置中
(2) SQLite資料庫,存放各種資料,是一個輕量級的嵌入式資料庫
(3) File檔案。通過讀取寫入方式組建檔案存放資料
(4) ContentProvider,主要用於讓其它應用程式使用儲存的資料
(5)通過網路擷取資料和寫入資料到網路儲存空間
26、 android中的動畫有哪幾類。它們的特點和差別是什嗎?
Android中動畫能夠分為兩大類:幀動畫、補間動畫
1)補間動畫:(你定義一個開始和結束。中間的部分由程式運算得到。就是對情境裡的對象不斷的進行映像變化來產生動畫效果(旋轉、平移、放縮和漸層))AlphaAnimation(漸層型動畫)、scaleAnimation(縮放型動畫)、 TranslateAnimation(平移型動畫)、 RotateAnimation(旋轉型動畫)、
2)逐幀動畫:Frame(把一連串的圖片進行系列化連續播放,如同放電影的效果)。它是通過播放一張一張圖片來達到動畫的效果。
27、、 補間動畫的兩種實現方式(四種可選擇一種來舉例)
1、XML配置:
1)在res/anim檔案夾下配置動畫相應標籤,配置相應參數,包括初始值,動畫結束值。以及動畫時間
2)通過AnimationUtils.loadAnimation載入XML動畫檔案
3)調用startAnimation方法開啟動畫
2、代碼實現:
1)直接New出須要的補間動畫的對象,傳遞相應的參數
2)調用startAnimation方法開啟動畫
28、 怎樣用MediaPlayer實現音頻播放功能。音樂播放器的開發需注意什嗎?
*用MediaPlayer實現音頻播放功能主要有兩種方法。
(方法一):在res下建立一個raw包,把檔案放入包中。
在activity中聲明
一個MediaPlayer對象,然後onCreate()方法中用
MediaPlayer.create(context,R.raw.資源名)方法執行個體化該對象。然後調用
MediaPlayer的start()、pause()和stop()方法進行開始、暫停和停止的
操作。
最後在activity的onDestroy()中調用MediaPlayer的release()
方法進行資源的釋放。此方法的缺點是每次運行程式時都要載入raw裡的資
源檔案,使安裝過程速度減慢。
(方法二):資源放在sdcard中。在activity中聲明一個MediaPlayer對象。
執行個體化 MediaPlayer()。使用Environment.getExternalStorageDirectory().getAbsolutePath()方法獲得path。然後path+=File.separator+資源名或”包名/資源名”。
然後調用MediaPlayer的setDataSource(path)進行資源設定。然後先調用prepare()方法。在後再調用start()方法播放,調用pause()方法和stop()方法進行暫停和停止的操作。最後在activity的onDestroy()中用release()方法進行資源的釋放。
注意事項,用法二時,設定完資源路徑後要先調用prepare()方法,調
用start()、pause()、stop()方法前腰先進行一些推斷,不然一次性調用
多次同樣的方法easy出錯。調用stop()後在調用start()方法時要先調用prepare()方法。
29、 Android中播放小的音樂檔案soundpool怎樣使用?
SoundPlayer 播放音訊實現步驟:
1) new出一個執行個體 ; new SoundPool(4, AudioManager.STREAM_MUSIC, 100);第一個參數是同意有多少個聲音流同一時候播放,第2個參數是聲音類型,第三個參數是聲音的品質;
2) loadId = soundPool.load(context, R.raw.himi_ogg, 1);
3) 使用執行個體調用play方法傳入相應的音頻檔案id就可以
30、 Android中視頻播放的三種方式?
1、系統內建android視頻播放(最簡單的視頻播放器)
1) new Intent。配置隱式意圖
2) 通過Uri.parse擷取指定檔案Uri
3) 給Intent加入Uri及type
4) 啟動Intent
2、VideoView android提供給我們的一個供我們進行視頻播放的組件
VideoView 是android 系統提供的一個媒體播放顯示和控制的控制項。
若須要控制欄,須要加上MediaController
3、surfaceView+MediaPlayer
1) 構建surfaceView
2) 擷取surfaceHolder,設定解析度
3) 對surfaceHolder加入回調介面(SurfaceHolder.Callback ) surfaceHolder.addCallback(this);
4) 實現介面內部三個方法
(surfaceCreated ,surfaceChanged,surfaceDestroyed等),對Mediaplayer加入Display(控制管理器)
5) 對button加入點擊事件
31、 Timer及AlertManager
Timer是在一個應用運行期間進行的定時操作,當應用退出則定時操作也同一時候被取消。
AlarmManager是系統級的定時器,主要用來對Activity,Service,BroadCastReciver三大組件進行定時的操作,當應用退出後這個定時操作仍然能夠按時進行,而且通過使用可喚醒的參數能夠達到在系統休眠狀態下仍能夠完畢定時操作。
32、Android中拍照功能怎樣實現?
有兩種方法實現拍照功能:
1、通過camera開啟照相機進行拍照調用系統camera運行拍照:
1)、首先建立surfaceView
2)、得到surfaceView相應控制器,並加入surfaceView的回調事件(surfaceView建立以及銷毀分別啟動並執行操作,當surfaceView建立時,初始化camera,當surfaceView銷毀時。釋放camera的資源)
3)、設定解析度
4)、設定不維護緩衝
5) 點擊調用camera的takePicture傳入回調拍照的執行個體化PictureCallback對象
2、系統拍照:通過Intent啟動,設定ACTION_IMAGE_CAPTURE,startActivity開啟
33、ListView的最佳化方案?
1:推斷contentView是否為null
2:使用viewHolder快取資料,實現一步載入
3:分頁載入:
1)假設自己定義適配器。那麼在getView方法中要考慮方法傳進來的參數contentView是否為null。假設為null就建立contentView並返回。假設不為null則直接使用。
在這種方法中儘可能少建立view。
2)給contentView設定tag(setTag()),傳入一個viewHolder對象。用於緩衝要顯示的資料。能夠達到資料非同步載入的效果。
3)假設listview須要顯示的item非常多。就要考慮分頁載入。
比方一共要顯示100條或者很多其它的時候。我們能夠考慮先載入20條,等使用者拉到列表底部的時候再去載入接下來的20條。分頁載入還沒學習。
34、 MVC設計模式在Android中的應用?
1.模型層(model):對資料庫操作,對網路等操作都應在model中處理,對業務的計算等操作都應在該層。
能夠簡單的理解為Android中的Java源檔案
2.視圖層(view):一般採用XML進行描寫敘述,使用的時候能夠方便的引入,能夠簡單的理解為Android中Layout檔案。
Android中也能夠用JavaScript+HTML 等方式作為view 層。
3.控制層(controller):控制model和view的協調工作。簡單的理解為Android中manifest檔案。
Android 常見面試題