標籤:
今天老師講到安卓的就業市場,說的我都想去面試了,想看看市面上咱們到底可以拿到什麼樣的工資,做什麼樣的行業。說來慚愧,我還只是一個安卓開發的新手,今天就和大家一樣,開始我的安卓開發夢想啟航。這個是潭州安卓開發入門教程裡面最基礎的。
從來以為學習安卓的都是為了興趣,原來還可以為了就業,可是好難,就像咱們Android開發入門視頻教程QQ群:175229978裡面很多人一樣,連面試題是哪一些都不懂,不過今天我分享到群裡了,也希望在這裡可以協助更多安卓開發入門的小夥伴們。
1.什麼是Activity?
(1.簡單介紹;2.特點;3.使用;4.注意的事項;-à在回答的過程當中記住:1.結合自己的理解—我認為這樣字眼;2.結合開發經驗和項目;3.揚長避短;)
四大組件之一,一般的,一個使用者互動介面對應一個activity
setContentView() ,// 要顯示的布局
button.setOnclickLinstener{
}
, activity 是Context的子類,同時實現了window.callback和keyevent.callback, 可以處理與表單使用者互動的事件. Attached
2).特點
生命週期;
3).使用;
我開發常用的的有ListActivity , PreferenceActivity ,TabAcitivty等…
如果介面有共同的特點或者功能的時候,還會自己定義一個BaseActivity.
進度對話方塊的顯示與銷毀 doubanservice
4).注意的事項;
a.運行在主線程,所以不能做耗時的操作;---》開子線程+handler發訊息更新介面
b.運用生命週期解決一些問題,activity在後台有可能會被銷毀,銷毀之前儲存資料
在onSaveInstanceState(Bundle b)儲存資料;在onCreate(Bundle b)或者onRestoreInstanceState(Bundle b)方法恢複資料。
- 請描述一下Activity 生命週期。
(如何作答:1.畫圖;2.分別寫出一個1四個0對應的含義;3.注意事項;)
生命週期描述的是一個類 從建立(new出來)到死亡(記憶體回收)的過程中會執行的方法..
在這個過程中 會針對不同的生命階段會調用不同的方法
Activity從建立到銷毀有多種狀態,從一種狀態到另一種狀態時會激發相應的回調方法,這些回調方法包括:oncreate ondestroy onstop onstart onresume onpause
其實這些方法都是兩兩對應的,onCreate建立與onDestroy銷毀;
onStart可見與onStop不可見;onResume可編輯(即焦點)與onPause;
這6個方法是相對應的,那麼就只剩下一個onRestart方法了,這個方法在什麼時候調用呢?
答案就是:在Activity被onStop後,但是沒有被onDestroy,在再次啟動此Activity時就調用onRestart(而不再調用onCreate)方法;
如果被onDestroy了,則是調用onCreate方法。
最後講自己項目中的經驗,比如說豆瓣用戶端每次進入某個介面的時候都要看到最新的資料,這個重新整理列表的操作 就放在onStart()的方法裡面.這樣保證每次使用者看到的資料都是最新的.
多媒體播放, 播放來電話. onStop() 視頻, 視頻聲音設定為0 , 記錄視頻播放的位置 mediaplayer.pause();
onStart() 根據儲存的狀態恢複現場. mediaplayer.start();
在讀文檔的時候 還發現 activity還有兩個方法 onPostResume() 和 OnPostCreate()這兩個生命週期的方法,不過開發的時候沒有用到過.
onSavedInstanceState(Bundle bundle)銷毀之前儲存資料;重新建立恢複資料onRestoreInstanceState(Bundle bundle)
3. 兩個Activity之間跳轉時必然會執行的是哪幾個方法。
一般情況比如說有兩個activity,分別叫A,B ,當在A裡面啟用B組件的時候, A 會調用 onPause()方法,然後B 調用onCreate() ,onStart(), OnResume() ,
這個時候B覆蓋了表單, A會調用onStop()方法. 如果B呢 是個透明的,或者是對話方塊的樣式, 就不會調用onStop()方法
- 橫豎屏切換時候Activity的生命週期。
為什麼預設情況下橫豎屏切換的時候activity會重新建立?
因為有時候我們自己寫的布局或者自訂控制項都是代碼動態實現的(比如一個控制項的寬度是螢幕的一半),這時候系統就預設直接重新建立。
這個生命週期跟資訊清單檔裡的配置有關係
1、不設定Activity的android:configChanges時,切屏會重新調用各個生命週期
預設首先銷毀當前activity,然後重新載入
2、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法(所以在動態布局的情況下,可以在此方法裡面重新計算和重新整理布局)
遊戲開發中, 螢幕的朝向都是寫死的. Android:orientation=”landscap”橫屏 portraint豎屏
5. 如何將一個Activity設定成視窗的樣式。
android:theme="@android:style/Theme.Dialog"
可以自訂一個activity的樣式,詳細見手機衛士的程式詳細資料
android:theme="@style/FloatActivity"
E:\day9\mobilesafe\res\values\style
6. 你背景Activity被系統 回收怎麼辦?如果背景Activity由於某原因被系統回收可了,如何在被系統回收之前儲存目前狀態?
除了在棧頂的activity,其他的activity都有可能在記憶體不足的時候被系統回收,一個activity越處於棧底,被回收的可能性越大.
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
恢複資料回調的方法:(2種)
Public void onRestoreInstanceState(Bundle savedInstanceState)
或者
public void onCreate(Bundle savedInstanceState) {
//判斷 savedInstanceState是不是空.
//如果不為空白就取出來
super.onCreate(savedInstanceState);
}
7. 如何退出Activity?如何安全退出已調用多個Activity的Application?
退出activity 直接調用 finish () 方法 . //使用者點擊back鍵 就是退出一個activity
退出activity 會執行 onDestroy()方法 .
1、拋異常強制退出:
該方法通過拋異常,使程式Force Close。
驗證可以,但是,需要解決的問題是,如何使程式結束掉,而不彈出Force Close的視窗。
//安全結束進程 android.os.Process.killProcess(android.os.Process.myPid());
2.2以前的版本可以用。
2、記錄開啟的Activity:
每開啟一個Activity,就記錄下來。在需要退出時,關閉每一個Activity即可。
List<Activity> lists ; 在application 全集的環境裡面
lists = new ArrayList<Activity>();
lists.add(activity);
for(Activity activity: lists)
{
activity.finish();
}
3、發送特定廣播:
在需要結束應用時,發送一個特定的廣播,每個Activity收到廣播後,關閉即可。
//給某個activity 註冊接受接受廣播的意圖
registerReceiver(receiver, filter)
//如果過接受到的是 關閉activity的廣播 就調用finish()方法 把當前的activity finish()掉
4、遞迴退出
在開啟新的Activity時使用startActivityForResult,然後自己加標誌,在onActivityResult中處理,遞迴關閉。
上面是網上的一些做法.
其實 可以通過 intent的flag 來實現.. intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)啟用一個新的activity,然後在新的activity的oncreate方法裡面 finish掉.
講一講你對activity的理解
把上面的幾點用自己的心得寫出來
8. service是否在main thread中執行, service裡面是否能執行耗時的操作?
(<service
android:process=""></service>)
預設情況,如果沒有顯示的指定service所啟動並執行進程, Service和activity是運行在當前app所在進程的main thread(UI主線程)裡面
service裡面不能執行耗時的操作(網路請求,拷貝資料庫,大檔案 )
在子線程中執行 new Thread(){}.start(); AsyncTask非同步任務; IntentService(onHandleIntent方法裡面做耗時操作)
特殊情況 ,可以在資訊清單檔配置 service 執行所在的進程 ,讓service在另外的進程中執行
9. 兩個Activity之間怎麼傳遞資料?
基礎資料型別 (Elementary Data Type)可以通過. Intent 傳遞資料
在A activity中
Intent intent = new Intent();
intent.putExtra(name, value)
Bundle bundle = new Bundle();
bundle.putBoolean(key, value);
intent.putExtras(bundle);
extras.putDouble(key, value)
// 通過intent putExtra 方法 基礎資料型別 (Elementary Data Type) 都傳遞
Intent i = getIntent();
i.getExtras();
intent.getStringExtra("key","value");
intent.getBooleanExtra("key","value")
Bundle bundle = new Bundle();
bumdle.putShort(key, value);
intent.putExtras(bumdle);
intent.putExtras(bundle)
--------------
Application 全域裡面存放 對象 ,自己去實現自己的application的這個類,
基礎系統的application , 每個activity都可以取到
-----------------
讓對象實現 implements Serializable 介面把對象存放到檔案上.
讓類實現Serializable 介面,然後可以通過 ObjectOutputStream //對象輸出資料流
File file = new File("c:\1.obj");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student stu = new Student();
oos.writeObject(stu);
//從檔案中把對象讀出來
ObjectInputStream ois = new ObjectInputStream(arg0);
Student stu1 = (Student) ois.readObject();
或者實現了parcelable介面
檔案/網路
intent.setData(Uri)
Uri.fromFile(); //大圖片的傳遞
10. 怎麼讓在啟動一個Activity時就啟動一個service?
在activity的onCreate()方法裡面 startService();
11. 同一個程式,不同的Activity是否可以放在不同的Task任務棧中?
比方說在啟用一個新的activity時候, 給intent設定flag
Intent的flag添加FLAG_ACTIVITY_NEW_TASK
這個被啟用的activity就會在新的task棧裡面…
Intent intent = new Intent(A.this,B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
廣播接收者
12. Activity怎麼和service綁定,怎麼在activity中啟動自己應用程式的service(別人的service)?(我沒理解你的意思!)
startService() 一旦被建立 調用著無關 沒法使用service裡面的方法
bindService () 把service 與調用者綁定 ,如果調用者被銷毀, service會銷毀
bindService() 我們可以使用service 裡面的方法
bindService(). 讓activity能夠訪問到 service裡面的方法
構建一個intent對象,
Intent service = new Intent(this,MyService.class);
通過bindService的方法去啟動一個服務,
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
ServiceConnection 對象(重寫onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.
private class myconn implements ServiceConnection
{
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
//可以通過IBinder的對象 去使用service裡面的方法
}
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
這個是前13個會遇到的問題,太多我自己也消化不了,不過希望大家可以變操作邊學習,會好點,第一次用部落格園不知道能不能發附件,具體的我先上傳QQ群:175229978,等我會用了,就發咱們網站。
安卓開發入門與面試題01(潭州安卓開發入門教程)