哎呀呀 ,立刻就要面臨找工做了,媛媛內心緊張呀.html
做爲一個即將畢業的Android程序媛,開始面臨找工做了,本媛媛仍是有點小緊張,因而收集了一些Android面試的題目.但願可以用上.若是你們有Android面試的經驗,但願能給我一些建議呀.很少廢話,直接上題。
複製代碼
四大組件之一,通常的,一個用戶交互界面對應一個activityjava
setContentView() ,// 要顯示的佈局linux
button.setOnclickLinstener{android
}web
, activity 是Context的子類,同時實現了window.callback和keyevent.callback, 能夠處理與窗體用戶交互的事件.面試
我開發經常使用的的有FragmentActivitiy,ListActivity ,PreferenceActivity ,sql
TabAcitivty等…數據庫
若是界面有共同的特色或者功能的時候,還會本身定義一個BaseActivity.瀏覽器
進度對話框的顯示與銷燬, 聯網, 退出.緩存
生命週期描述的是一個類從建立(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()這兩個生命週期的方法,不過開發的時候沒有用到過.
通常狀況好比說有兩個activity,分別叫A,B ,當在A裏面激活B組件的時候, A 會調用 onPause()方法,而後B 調用onCreate() ,onStart(), OnResume() ,
這個時候B覆蓋了窗體, A會調用onStop()方法. 若是B呢 是個透明的,或者是對話框的樣式, 就不會調用onStop()方法
這個生命週期跟清單文件裏的配置有關係
一、不設置Activity的android:configChanges時,切屏會從新調用各個生命週期
默認首先銷燬當前activity,而後從新加載
二、設置Activity的android:configChanges="orientation|keyboardHidden|screenSize"時,切屏不會從新調用各個生命週期,只會執行onConfigurationChanged方法
遊戲開發中, 屏幕的朝向都是寫死的.
能夠自定義一個activity的樣式
android:theme="@android:style/Theme.Dialog"
除了在棧頂的activity,其餘的activity都有可能在內存不足的時候被系統回收,一個activity越處於棧底,被回收的可能性越大.
protectedvoidonSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
publicvoidonCreate(Bundle savedInstanceState) {
//判斷 savedInstanceState是否是空.
//若是不爲空就取出來
super.onCreate(savedInstanceState);
}
也能夠每隔一段時間保存一次, 保存到本地, 下次啓動時恢復.
退出activity 直接調用 finish () 方法 . //用戶點擊back鍵 就是退出一個activity
退出activity 會執行 onDestroy()方法 .
一、拋異常強制退出:
該方法經過拋異常,使程序Force Close。
驗證能夠,可是,須要解決的問題是,如何使程序結束掉,而不彈出Force Close的窗口。
100/0
//安全結束進程android.os.Process.killProcess(android.os.Process.myPid());
二、記錄打開的Activity:
每打開一個Activity,就記錄下來。在須要退出時,關閉每個Activity便可。
List lists ;在application 全集的環境裏面
lists = new ArrayList();
lists.add(this);
for(Activity activity: lists)
{
activity.finish();
}
ondestory
lists.remove(this);
三、發送特定廣播:
在須要結束應用時,發送一個特定的廣播,每一個Activity收到廣播後,關閉便可。
//給某個activity 註冊接受接受廣播的意圖
registerReceiver(receiver, filter)
//若是過接受到的是 關閉activity的廣播 就調用finish()方法 把當前的activity finish()掉
四、遞歸退出
在打開新的Activity時使用startActivityForResult,而後本身加標誌,在onActivityResult中處理,遞歸關閉。
上面是網上的一些作法.
還能夠經過intent的flag 來實現.. intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一個新的activity,而後在新的activity的oncreate方法裏面 finish掉, 可是一個應用能夠有多個任務棧, 這樣可能會有問題.
講一講你對activity的理解
把上面的幾點用本身的心得寫出來
默認狀況,若是沒有顯示的指定service所運行的進程,Service和activity是運行在當前app所在進程的main thread(UI主線程)裏面
service裏面不能執行耗時的操做(網絡請求,拷貝數據庫,大文件 )
在子線程中執行new Thread(){}.start();
Thread.currentThread().getName();
特殊狀況,能夠在清單文件配置 service 執行所在的進程 ,讓service在另外的進程中執行
ActivityManagerService
基本數據類型能夠經過.Intent 傳遞數據
extras.putDouble(key,value)
intent.putExtra(name, value)
//經過intent putExtra方法 基本數據類型 都傳遞
intent.getStringExtra("key","value");
intent.getBooleanExtra("key","value")
Bundlebundle= new Bundle();
bumdle.putShort(key, value);
intent.putExtras(bumdle);
intent.putExtras(bundle)
Application 全局裏面存放 對象 ,本身去實現本身的application的這個類,基礎系統的application , 每一個activity均可以取到
讓對象實現implementsSerializable接口把對象存放到文件上.
讓類實現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();
Paceable:存入內存
文件/網絡
intent.setData(Uri)
Uri.fromFile(); //大圖片的傳遞
在activity的onCreate()方法裏面 startService();
11.同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中?
Singleinstance 運行在另外的單獨的任務棧裏面
比方說在激活一個新的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);
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 .什麼是Service以及描述下它的生命週期。Service有哪些啓動方法,有什麼區別,怎樣停用Service?
在Service的生命週期中,被回調的方法比Activity少一些,只有onCreate, onStart, onDestroy,onBind和onUnbind。
一般有兩種方式啓動一個Service,他們對Service生命週期的影響是不同的。
1 經過startService
Service會經歷 onCreate 到onStart,而後處於運行狀態,stopService的時候調用onDestroy方法。
若是是調用者本身直接退出而沒有調用stopService的話,Service會一直在後臺運行。
2 經過bindService
Service會運行onCreate,而後是調用onBind, 這個時候調用者和Service綁定在一塊兒。調用者退出了,Srevice就會調用onUnbind->onDestroyed方法。
所謂綁定在一塊兒就共存亡了。調用者也能夠經過調用unbindService方法來中止服務,這時候Srevice就會調用onUnbind->onDestroyed方法。
須要注意的是若是這幾個方法交織在一塊兒的話,會出現什麼狀況呢?
一個原則是Service的onCreate的方法只會被調用一次,就是你不管多少次的startService又bindService,Service只被建立一次。
若是先是bind了,那麼start的時候就直接運行Service的onStart方法,若是先是start,那麼bind的時候就直接運行onBind方法。
若是service運行期間調用了bindService,這時候再調用stopService的話,service是不會調用onDestroy方法的,service就stop不掉了,只能調用UnbindService, service就會被銷燬
若是一個service經過startService 被start以後,屢次調用startService 的話,service會屢次調用onStart方法。屢次調用stopService的話,service只會調用一次onDestroyed方法。
若是一個service經過bindService被start以後,屢次調用bindService的話,service只會調用一次onBind方法。
屢次調用unbindService的話會拋出異常。
遇到問題, 能夠隨機應變,靈活發揮,多考慮些細節,好比說這個題就能夠這樣說,說說你對startActivityForResult的理解()
A開啓B的時候,用startActivityForResult()方法, B返回的時候把播放的狀態信息返回給A ,A繼續播放音樂.
普通的service ,默認運行在ui main 主線程
Sdk給咱們提供的方便的,帶有異步處理的service類,
必須有無參構造方法
OnHandleIntent() 處理耗時的操做
16.何時使用Service?
擁有service的進程具備較高的優先級
官方文檔告訴咱們,Android系統會盡可能保持擁有service的進程運行,只要在該service已經被啓動(start)或者客戶端鏈接(bindService)到它。當內存不足時,須要保持,擁有service的進程具備較高的優先級。
前臺, 可見, 服務, 後臺, 空
1. 若是service正在調用onCreate, onStartCommand或者onDestory方法,那麼用於當前service的進程至關於前臺進程以免被killed。
2. 若是當前service已經被啓動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,可是比那些不可見的進程更重要,這就意味着service通常不會被killed.
3. 若是客戶端已經鏈接到service (bindService),那麼擁有Service的進程則擁有最高的優先級,能夠認爲service是可見的。
4.Service長期在後臺運行, 時間長了可能被系統殺死,可使用startForeground(int, Notification)方法來將service設置爲前臺狀態,那麼系統就認爲是對用戶可見的,並不會在內存不足時killed。
若是有其餘的應用組件做爲Service,Activity等運行在相同的進程中,那麼將會增長該進程的重要性。
1.Service的特色可讓他在後臺一直運行,能夠在service裏面建立線程去完成耗時的操做.
2.Broadcast receiver捕獲到一個事件以後,能夠起一個service來完成一個耗時的操做.
3.遠程的service若是被啓動起來,能夠被屢次bind, 但不會從新create. 索愛手機X10i的人臉識別的service能夠被圖庫使用,能夠被攝像機,照相機等程序使用.
Android 中經過 Intent 對象來表示一條消息,一個 Intent 對象不只包含有這個消息的目的地,還能夠包含消息的內容,這比如一封 Email,其中不只應該包含收件地址,還能夠包含具體的內容。對於一個 Intent 對象,消息「目的地」是必須的,而內容則是可選項。
經過Intent 能夠實現各類系統組件的調用與激活.
data/system/package.xml
Intent filter: 能夠理解爲郵局或者是一個信箋的分揀系統…
這個分揀系統經過3個參數來識別
Action: 動做 view
Data: 數據uri uri
Category : 而外的附加信息
Action 匹配
Action 是一個用戶定義的字符串,用於描述一個 Android 應用程序組件,一個 Intent Filter 能夠包含多個 Action。在 AndroidManifest.xml 的 Activity 定義時能夠在其 節點指定一個 Action 列表用於標示 Activity 所能接受的「動做」,例如:
……
若是咱們在啓動一個Activity時使用這樣的Intent對象:
Intent intent =new Intent();
intent.setAction("cn.itcast.action");
那麼全部的Action列表中包含了「cn.itcast」的Activity都將會匹配成功。
Android預約義了一系列的Action分別表示特定的系統動做。這些Action經過常量的方式定義在android.content. Intent中,以「ACTION_」開頭。咱們能夠在Android 提供的文檔中找到它們的詳細說明。
URI 數據匹配
一個Intent 能夠經過 URI 攜帶外部數據給目標組件。在 節點中,經過 節點匹配外部數據。
mimeType 屬性指定攜帶外部數據的數據類型,scheme 指定協議,host、port、path 指定數據的位置、端口、和路徑。以下:
android:host="host" android:port="port" android:path="path"/>
電話的uri tel: 12345
http://www.baidu.com
本身定義的uri itcast://cn.itcast/person/10
若是在Intent Filter 中指定了這些屬性,那麼只有全部的屬性都匹配成功時 URI 數據匹配纔會成功。
Category 類別匹配
節點中能夠爲組件定義一個 Category 類別列表,當 Intent 中包含這個列表的全部項目時 Category 類別匹配纔會成功。
默認是DEFAULT
1.通常的基本數據類型 Intent .putextra() intent.getextra();
2.數據的uri, intent.setData() intent.getData();
麥當勞和麥當娜的關係是什麼關係?
這種問題,就講下activity,講一下service,說一下 經過intent去激活組件,傳遞數據.
說本身項目中有這樣一個網絡更新的功能,顯示界面就用的activity, 後臺有個service每隔半小時都去訪問下服務器獲取更新的數據…
開啓服務用的是intent來開啓
有不少廣播接收者,系統已經實現了.
廣播分兩種有序廣播
無序廣播
指定接收者的廣播. 是不能夠被攔截掉的
abortBroadcast();
用於接收系統的廣播通知, 系統會有不少sd卡掛載,手機重啓,廣播通知,低電量,來電,來短信等….有些應用經過這些廣播啓動後臺服務, 避免被殺死
電量改變廣播, 必須動態註冊
來獲取短信到來的廣播, 根據黑名單來判斷是否攔截該短信.
畫畫板生成圖片後,發送一個sd掛載的通知,通知系統的gallery去獲取到新的圖片.
Intent intent =newIntent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory()));
sendBroadcast(intent);
能夠做爲組件間通訊工具. EventBus
設置廣播接收者的優先級,設置廣播接受者的action名字 等…
詳細見工程代碼.
文件訪問權限. sdcard /
數據庫sqlite
SharedPreference //shared_preps
網絡socket tcp udp , http httpurlconnection
把本身的數據經過uri的形式共享出去
android 系統下 不一樣程序 數據默認是不能共享訪問
須要去實現一個類去繼承ContentProvider
public class PersonContentProvider extends ContentProvider{
Static{ }
public boolean onCreate(){
//..SqliteOpenHelper
}
query(Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])
}
屏蔽數據存儲的細節,對用戶透明,用戶只須要關心操做數據的uri就能夠了
不一樣app之間共享,操做數據
Sql也有增刪改查的方法.
可是contentprovider 還能夠去增刪改查本地文件. xml文件的讀取,更改,
網絡數據讀取更改
FrameLayout(幀佈局),LinearLayout (線性佈局),AbsoluteLayout(絕對佈局),RelativeLayout(相對佈局),TableLayout(表格佈局)
FrameLayout
從屏幕的左上角開始佈局,疊加顯示, 實際應用 播放器的暫停按鈕.
LinearLayout
線性佈局,這個東西,從外框上能夠理解爲一個div,他首先是一個一個從上往下羅列在屏幕上。每個LinearLayout裏面又可分爲垂直佈局
(android:orientation="vertical")和水平佈局(android:orientation="horizontal"
)。當垂直佈局時,每一行就只有一個元素,多個元素依次垂直往下;水平佈局時,只有一行,每個元素依次向右排列。
AbsoluteLayout
絕對佈局猶如div指定了absolute屬性,用X,Y座標來指定元素的位置android:layout_x="20px"
android:layout_y="12px"
qq鬥地主 qq遊戲大廳 800480 800480.apk fwvga 854*480
指定平板機型的遊戲開發中常常用到絕對佈局widget 絕對佈局
指定機型的平板遊戲開發機頂盒開發。. 2.3 3.0
1.界面佈局任務管理器gridview
2.手機任務管理listview
RelativeLayout
相對佈局能夠理解爲某一個元素爲參照物,來定位的佈局方式。主要屬性有:
相對於某一個元素
android:layout_below="@id/aaa" 該元素在 id爲aaa的下面
android:layout_toLeftOf="@id/bbb" 改元素的左邊是bbb
相對於父元素的地方
android:layout_alignParentLeft="true" 在父元素左對齊
android:layout_alignParentRight="true" 在父元素右對齊
TableLayout
表格佈局相似Html裏面的Table。每個TableLayout裏面有表格行TableRow,TableRow裏面能夠具體定義每個元素,設定他的對齊方式 android:gravity="" 。
每個佈局都有本身適合的方式,另外,這五個佈局元素能夠相互嵌套應用,作出美觀的界面。
oa 自動化 生成報表 ,圖標 表示
能夠說一下屏幕適配
PercentRelativeLayout、PercentFrameLayout
Padding 文字對邊框, margin是控件對父窗體.android:layout_xxx, android:xxx
widget能夠理解成桌面小控件,
也能夠理解成某個button, imageview這樣的控件…
onCreate, onStart, onResume,都得不到
1.在onWindowFocusChanged 能夠獲得
mTv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
System.out.println("onGlobalLayout: "+mTv.getHeight());
mTv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
mTv.post(new Runnable() {
@Override
public void run() {
System.out.println("run: "+mTv.getHeight());
}
});
onmeasure() // 計算控件的寬高, 只要這個方法執行完, 控件的寬高就有了
某個view 要顯示在界面 ondraw 被顯示到界面上的 .
onSizeChanged
請解釋下在單線程模型中Message、Handler、MessageQueue、Looper之間的關係。
AIDL的全稱是什麼?如何工做?
Android interface definition language (android接口定義語言) , 用來跨進程的訪問方法,
訪問遠程的服務的方法. 如何工做 day7 queryStudent .
手機衛士Itelephony 接口掛斷電話.
Android程序執行須要讀取到安全敏感項必需在androidmanifest.xml中聲明相關權限請求, 打電話,訪問網絡,獲取座標,讀寫sd卡,讀寫聯繫人等..安裝的時候會提示用戶…
drwx
文件系統的權限是linux權限. 好比說sharedpreference裏面的Context.Mode.private Context.Mode.world_read_able Context.Mode_world_writeable
777本身 同組 其餘rwxrwxrwx
找到對應的瀏覽器的意圖(Action),傳遞數據URI , 激活這個意圖
Intent intent =newIntent();
intent.setClassName(packageName,className);
intent.seturi()
主ui線程不能執行耗時的操做,main方法, 死循環
虛擬機很小,空間很小,談談移動設備的虛擬機的大小限制 16M ,不少ROM都修改了, 小米3,128MB
談談加載圖片的時候怎麼處理大圖片的,d
垃圾回收,沒有引用的對象,在某個時刻會被系統gc掉.
手動調用System.gc()有用嗎? 有用!可是會致使界面卡, 放在合適的位置.
反射, 配置文件
能夠講下activity的源碼,好比說 每一個activity裏面都有window.callback和keyevent.callback,一些回調的接口或者函數吧. 框架把activity建立出來就會調用裏面的這些回調方法,會調用activity生命週期相關的方法.
Activity建立一個view是經過 ondraw 畫出來的, 畫這個view以前呢,還會調用onmeasure方法來計算顯示的大小.
這個問題問的有問題, apk包大小限制很差說,
極品飛車有100M 仍是能裝到手機上,
世面google market 上大程序 主程序 很小 5~10M 下載sdcard
15分鐘以內 申請退款
apk包,精簡包, 素材存放在服務器. 遊戲程序.
讀大文件的時間限制應該是main線程裏面的時間限制吧.
Activity 不要超過5秒.
Service 不要超過20秒
Android提供mediascanner,mediaStore等接口, 音樂文件的信息都會存放到系統的數據庫表中,能夠經過content provider獲取,
顯示出來,改善效率,是個常見問題, 能夠從如下幾個方面做答,
分批加載數據, 延時加載數據, 合理使用緩存等...
複用convertview , 歷史的view對象
減小子孩子查詢的次數viewholder
異步加載數據, 分頁加載數據,
使用靜態的view對象 避免建立過多的view.
setTag, 局部刷新.
38.啓動應用後,改變系統語言,應用的語言會改變麼?
2.3有bug, 不會, 後面版本能夠.
區別是根據activity在manifest裏面的配置,這個activity可能會放在不一樣的task棧裏面.intent設置的flag flag_new_task
Android程序用android sdk開發,java程序用javasdk開發.
Android SDK引用了大部分的Java SDK,少數部分被Android SDK拋棄,好比說界面部分,java.awt swing package除了java.awt.font被引用外,其餘都被拋棄,在Android平臺開發中不能使用。 android sdk 添加工具jar httpclient , pull opengl
將Java 遊戲或者j2me程序移植到Android平臺的過程當中,
Android SDK 與Java SDK的區別是很須要注意的地方。
sampledataadpter()
首先咱們來看下Task的定義,Google是這樣定義Task的:a task is what the user experiences as an "application." It's a group of related activities, arranged in a stack. A task is a stack of activities, not a class or an element in the manifest file. 這意思就是說Task其實是一個Activity棧,一般用戶感覺的一個Application就是一個Task。從這個定義來看,Task跟Service或者其餘Components是沒有任何聯繫的,它只是針對Activity而言的。
Activity有不一樣的啓動模式, 能夠影響到task的分配
Task,簡單的說,就是一組以棧的模式彙集在一塊兒的Activity組件集合。它們有潛在的先後驅關聯,新加入的Activity組件,位於棧頂,並僅有在棧頂的Activity,纔會有機會與用戶進行交互。而當棧頂的Activity完成使命退出的時候,Task會將其退棧,並讓下一個將跑到棧頂的Activity來於用戶面對面,直至棧中再無更多Activity,Task結束。
如上表所示,是一個實例。從用戶從進入郵箱開始,到回覆完成,退出應用整個過程的Task棧變化。這是一個標準的棧模式,對於大部分的情況,這樣的Task模型,足以應付,可是,涉及到實際的性能、開銷等問題,就會變得殘酷許多。
好比,啓動一個瀏覽器,在Android中是一個比較沉重的過程,它須要作不少初始化的工做,而且會有不小的內存開銷。但與此同時,用瀏覽器打開一些內容,又是通常應用都會有的一個需求。設想一下,若是同時有十個運行着的應用(就會對應着是多個Task),都須要啓動瀏覽器,這將是一個多麼殘酷的場面,十個Task棧都堆積着很雷同的瀏覽器Activity,
是多麼華麗的一種浪費啊。
因而你會有這樣一種設想,瀏覽器Activity,可不能夠做爲一個單獨的Task而存在,無論是來自那個Task的請求,瀏覽器的Task,都不會歸併過去。這樣,雖然瀏覽器Activity自己須要維繫的狀態更多了,但總體的開銷將大大的減小,這種舍小家爲你們的行爲,仍是很值得歌頌的
standard", "singleTop", "singleTask", "singleInstance"。
standard模式, 是默認的也是標準的Task模式,在沒有其餘因素的影響下,使用此模式的Activity,會構造一個Activity的實例,加入到調用者的Task棧中去,對於使用頻度通常開銷通常什麼都通常的Activity而言,standard模式無疑是最合適的,由於它邏輯簡單條理清晰,因此是默認的選擇。
而singleTop模式,基本上於standard一致,僅在請求的Activity正好位於棧頂時,有所區別。此時,配置成singleTop的Activity,再也不會構造新的實例加入到Task棧中,而是將新來的Intent發送到棧頂Activity中,棧頂的Activity能夠經過重載onNewIntent來處理新的Intent(固然,也能夠無視...)。這個模式,下降了位於棧頂時的一些重複開銷,更避免了一些奇異的行爲(想象一下,若是在棧頂連續幾個都是一樣的Activity,再一級級退出的時候,這是怎麼樣的用戶體驗...),很適合一些會有更新的列表Activity展現。一個活生生的實例是,在Android默認提供的應用中,瀏覽器(Browser)的書籤Activity(BrowserBookmarkPage),就用的是singleTop。
singleTask,和singleInstance,則都採起的另闢Task的蹊徑。
標誌爲singleTask的Activity,最多僅有一個實例存在,而且,位於以它爲根的Task中。全部對該Activity的請求,都會跳到該Activity的Task中展開進行。singleTask,很象概念中的單件模式,全部的修改都是基於一個實例,這一般用在構形成本很大,但切換成本較小的Activity中。最典型的例子,仍是瀏覽器應用的主Activity(名爲Browser...),它是展現當前tab,當前頁面內容的窗口。它的構形成本大,但頁面的切換仍是較快的,於singleTask相配,仍是挺天做之合的。
singleInstance顯得更爲極端一些。在大部分時候singleInstance與singleTask徹底一致,惟一的不一樣在於,singleInstance的Activity,是它所在棧中僅有的一個Activity,若是涉及到的其餘Activity,都移交到其餘Task中進行。這使得singleInstance的Activity,像一座孤島,完全的黑盒,它不關注請求來自何方,也不計較後續由誰執行。在Android默認的各個應用中,不多有這樣的Activity,在我我的的工程實踐中,曾嘗試在有道詞典的快速取詞Activity中採用過,
是由於我以爲快速取詞入口足夠方便(從notification中點選進入),而且會在各個場合使用,應該作得徹底獨立。
默認任務棧名字爲包名, 能夠本身配置
Activity的android:affinity屬性
1.配置後當啓動這個activity時就先去找有沒有activity的親和力屬性相同有就加入這個activity所在的任務中沒有就新開任務棧
2.affinity起做用須要的條件兩者具有一個:
1.intent包含FLAG_ACTIVITY_NEW_TASK標記
2.activity元素啓用了allowTaskReparenting屬性.
回收已經使用的資源,
合理的使用緩存
合理設置變量的做用範圍…application 對象
//將來的某一段時間執行
System.gc();
能夠,列舉aidl訪問遠程服務的例子.
44.在Android中是如何實現判斷區分電話的狀態,去電,來電、未接來電?
去電有廣播, 來電沒有, TelephonyManager, PhoneStateListener
Dvm的進程是dalivk虛擬機進程,每一個android程序都運行在本身的進程裏面,
每一個android程序系統都會給他分配一個單獨的liunx uid(user id),
每一個dvm都是linux裏面的一個進程.因此說這兩個進程是一個進程.
配置文件中有sd卡的權限, 經過environment的靜態方法,
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
中文70(包括標點),英文160,160個字節 這個說法不許確,
要跟手機制式運營商等信息有關.
作實驗,看源碼
ArrayList msgs = sms.divideMessage(message);
for (String msg : msgs) {
sms.sendTextMessage(phoneNumber, null, msg, pi, null);
}
native develop kit 只是一個交叉編譯的工具 .so
1.何時用ndk, 實時性要求高,遊戲,圖形渲染, opencv (人臉識別) , ffmpeg , rmvb mp5 avi 高清解碼. ffmpeg, opencore.
2.爲何用ndk,ndk的優勢 ,缺點 ,
咱們項目中那些地方用到了ndk,祕鑰
一、開放性,開源 ophone 阿里雲( 徹底兼容android)
二、掙脫運營商束縛
三、豐富的硬件選擇 mtk android
四、不受任何限制的開發商
五、無縫結合的Google應用
缺點:
一、安全問題、隱私問題
二、碎片化
三、過度依賴開發商,缺少標準配置
檢測內存泄露工具
mat
C:\Users\lenovo\Desktop\prof>hprof-conv com.example.testmat.hprof convert-com.ex
ample.testmat.hprof
致使內存泄漏主要的緣由是,先前申請了內存空間而忘記了釋放。若是程序中存在對無用對象的引用,那麼這些對象就會駐留內存,消耗內存,由於沒法讓垃圾回收器GC驗證這些對象是否再也不須要。若是存在對象的引用,這個對象就被定義爲"有效的活動",同時不會被釋放。要肯定對象所佔內存將被回收,咱們就要務必確認該對象再也不會被使用。典型的作法就是把對象數據成員設爲null或者從集合中移除該對象。但當局部變量不須要時,不需明顯的設爲null,由於一個方法執行完畢時,這些引用會自動被清理。
Java帶垃圾回收的機制,爲何還會內存泄露呢?
Vector v = new Vector(10);
for (int i = 1; i < 100; i++) {
Object o = new Object();
v.add(o);
o = null;
}//此時,全部的Object對象都沒有被釋放,由於變量v引用這些對象。
觀察者模式解除註冊
Java 內存泄露的根本緣由就是保存了不可能再被訪問的變量類型的引用
在主線程中拿到view調用invalide()方法
在子線程裏面能夠經過postInvalide()方法;
requestLayout
Android 數字簽名
在Android系統中,全部安裝到系統的應用程序都必有一個數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係
Android系統要求每個安裝進系統的應用程序都是通過數字證書籤名的,數字證書的私鑰則保存在程序開發者的手中。Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,不是用來決定最終用戶能夠安裝哪些應用程序。
這個數字證書並不須要權威的數字證書籤名機構認證(CA),它只是用來讓應用程序包自我認證的。
同一個開發者的多個程序儘量使用同一個數字證書,這能夠帶來如下好處。
(1)有利於程序升級,當新版程序和舊版程序的數字證書相同時,Android系統纔會認爲這兩個程序是同一個程序的不一樣版本。若是新版程序和舊版程序的數字證書不相同,則Android系統認爲他們是不一樣的程序,併產生衝突,會要求新程序更改包名。
(2)有利於程序的模塊化設計和開發。Android系統容許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視爲同一個程序。因此開發者能夠將本身的程序分模塊開發,而用戶只須要在須要的時候下載適當的模塊。
在簽名時,須要考慮數字證書的有效期:
(1)數字證書的有效期要包含程序的預計生命週期,一旦數字證書失效,持有改數字證書的程序將不能正常升級。
(2)若是多個程序使用同一個數字證書,則該數字證書的有效期要包含全部程序的預計生命週期。
(3)Android Market強制要求全部應用程序數字證書的有效期要持續到2033年10月22日之後。
Android數字證書包含如下幾個要點:
(1)全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序
(2)Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證
(3)若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。
(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。
在Android上,若是你的應用程序有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱做應用程序無響應(ANR:Application Not Responding)對話框。用戶能夠選擇讓程序繼續運行,可是,他們在使用你的應用程序時,並不但願每次都要處理這個對話框。所以,在程序裏對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。
Activity 5秒 broadcast10秒, service20秒
耗時的操做worker thread裏面完成, handler message…AsynTask , intentservice.等…
Data/anr/traces.txt
兩種,一種是Tween動畫、還有一種是Frame動畫。
Tween動畫,這種實現方式可使視圖組件移動、放大、縮小以及產生透明度的變化;
能夠經過佈局文件,能夠經過代碼
一、控制View的動畫
a)alpha(AlphaAnimation)
漸變透明
b)scale(ScaleAnimation)
漸變尺寸伸縮
c)translate(TranslateAnimation)
畫面轉換、位置移動
d)rotate(RotateAnimation)
畫面轉移,旋轉動畫
二、控制一個Layout裏面子View的動畫效果
a)layoutAnimation(LayoutAnimationController)
b)gridAnimation(GridLayoutAnimationController)
另外一種Frame動畫,傳統的動畫方法,經過順序的播放排列好的圖片來實現,相似電影。
屬性動畫ObjectAnimator, ValueAnimator, TypeEvaluator
Nineoldandroids.jar, 和真正的屬性動畫仍是不同.
scrollTo/scrollBy
MVC英文即Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分紅三個層——模型層、視圖層、控制層。
Android中界面部分也採用了當前比較流行的MVC框架,在Android中M就是應用程序中二進制的數據,V就是用戶的界面。Android的界面直接採用XML文件保存的,界面開發變的很方便。在Android中C也是很簡單的,一個Activity能夠有多個界面,只須要將視圖的ID傳遞到setContentView(),就指定了以哪一個視圖模型顯示數據。
在Android SDK中的數據綁定,也都是採用了與MVC框架相似的方法來顯示數據。在控制層上將數據按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就能夠直接在視圖模型上顯示了,從而實現了數據綁定。好比顯示Cursor中全部數據的ListActivity,其視圖層就是一個ListView,將數據封裝爲ListAdapter,並傳遞給ListView,數據就在ListView中顯示。
MVP
MVVM
Day11 AddJavascriptInterface, Java/JS互相調用
new Object{
callphone();
installapk();
}
http://1.vduntest.sinaapp.com/webview/WebView%E8%AF%A6%E8%A7%A3.html
57,Service和Activity在同一個線程嗎
默認狀況同一線程main主線程 ui線程
58,java中的soft reference是個什麼東西
StrongReference 是 Java 的默認引用實現, 它會盡量長時間的存活於 JVM 內, 當沒有任何對象指向它時 GC 執行後將會被回收
SoftReference 會盡量長的保留引用直到 JVM 內存不足時纔會被回收(虛擬機保證), 這一特性使得 SoftReference 很是適合緩存
應用詳細見客戶端圖片的緩存
LruCache
59,udp鏈接和TCP的不一樣之處
Tcp三次握手. 面向鏈接 流
udp 不關心數據是否達到,是否阻塞 面向無鏈接
畫面優先. tcp
流暢優先udp
http基於tcp
60, android開發中怎麼去調試bug
邏輯錯誤
1.斷點 debug
界面佈局,ActivityManager,hierarchyview
61.service裏面能夠彈土司麼
能夠, 對於對話框, 須要加權限
AlertDialog dialog = new AlertDialog.Builder(this).setTitle("標題").setMessage("內容").setPositiveButton("肯定", null).create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();
Stk
顯示懸浮窗
62.寫10個簡單的linux命令
cat ls ps psw wc mv rm cd ping tracert find grep tail vi gcc make ifconfig
startup dhcp
63,JNI調用經常使用的兩個參數
JNIEnv *env, jobject javaThis
src
android. jar
asset
res
gen
manifest
daivilk debug manager system
1.在應用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字");
2.一樣在主activity的onStop方法中加入Debug.stopMethodTracing();
3.同時要在AndroidManifest.xml文件中配置權限
3.從新編譯,安裝,啓動服務,測試完成取對應的traceview文件(adb pull /sdcard/xxxx.trace)。
4.直接在命令行輸入traceview xxxxtrace,彈出traceview窗口,分析對應的應用便可。
traceview 分析程序執行時間和效率
KPI : key performance information : 關鍵性能指標:
splash界面不能超過5秒
從splash 界面加載mainactivity 不能超過0.7秒
1)重構前的代碼Bmi.java:
packagecom.demo.android.bmi;
importjava.text.DecimalFormat;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.TextView;
publicclassBmiextendsActivity {
/** Called when the activity is first created. */
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Listen for button clicks
Button button = (Button) findViewById(R.id.submit);
button.setOnClickListener(calcBMI);
}
privateOnClickListenercalcBMI=newOnClickListener() {
@Override
publicvoidonClick(View v) {
DecimalFormat nf =newDecimalFormat("0.00");
EditText fieldheight = (EditText) findViewById(R.id.height);
EditText fieldweight = (EditText) findViewById(R.id.weight);
doubleheight = Double.parseDouble(fieldheight.getText().toString()) / 100;
doubleweight = Double.parseDouble(fieldweight.getText().toString());
doubleBMI = weight / (height * height);
TextView result = (TextView) findViewById(R.id.result);
result.setText("Your BMI is "+ nf.format(BMI));
// Give health advice
TextView fieldsuggest = (TextView) findViewById(R.id.suggest);
if(BMI > 25) {
fieldsuggest.setText(R.string.advice_heavy);
}elseif(BMI < 20) {
fieldsuggest.setText(R.string.advice_light);
}else{
fieldsuggest.setText(R.string.advice_average);
}
}
};
}
Step1:抽取全部界面元件的聲明和定義,整合到單獨一個函數findViews()中;
//聲明view
privateButtonbutton_calc;
privateEditTextfield_height;
privateEditTextfield_weight;
privateTextViewview_result;
privateTextViewview_suggest;
//定義
privatevoidfindViews() {
button_calc= (Button) findViewById(R.id.submit);
field_height= (EditText) findViewById(R.id.height);
field_weight= (EditText) findViewById(R.id.weight);
view_result= (TextView) findViewById(R.id.result);
view_suggest= (TextView) findViewById(R.id.suggest);
}
此部分便是MVC中的V:View視圖。
Step2:抽取程序的邏輯(即界面元件的處理邏輯),整合到函數setListensers()中;
//Listen for button clicks
privatevoidsetListensers() {
button_calc.setOnClickListener(calcBMI);
}
此部分便是MVC中的C:Controller控制器。
接着,onCreate()就顯得很是簡潔、明瞭了:
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
Step3:修改按鈕監聽器calcBMI中相應的部分(主要是變量已經在視圖部分定義了);
privateOnClickListenercalcBMI=newOnClickListener() {
@Override
publicvoidonClick(View v) {
DecimalFormat nf =newDecimalFormat("0.00");
doubleheight = Double.parseDouble(field_height.getText().toString()) / 100;
doubleweight = Double.parseDouble(field_weight.getText().toString());
doubleBMI = weight / (height * height);
// Present result
view_result.setText("Your BMI is "+ nf.format(BMI));
// Give health advice
if(BMI > 25) {
view_suggest.setText(R.string.advice_heavy);
}elseif(BMI < 20) {
view_suggest.setText(R.string.advice_light);
}else{
view_suggest.setText(R.string.advice_average);
}
}
};
總之,此重構的目的無非是使程序的脈絡更加清晰,即讓人一眼望去,就能很容易地分辨出界面(View)應該寫在哪裏,程序邏輯(Controller)應該寫在哪裏,最終使維護和擴展代碼變得更加容易!
其實,重構很簡單,通讀代碼,感受哪邊不太爽,就改那邊吧!(我目前的感覺)
一個良好的代碼應該是能讓人感到舒服的!
2)重構後的代碼Bmi.java:
packagecom.demo.android.bmi;
importjava.text.DecimalFormat;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.TextView;
publicclassBmiextendsActivity {
privateButtonbutton_calc;
privateEditTextfield_height;
privateEditTextfield_weight;
privateTextViewview_result;
privateTextViewview_suggest;
/** Called when the activity is first created. */
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
setListensers();
}
//定義
privatevoidfindViews() {
button_calc= (Button) findViewById(R.id.submit);
field_height= (EditText) findViewById(R.id.height);
field_weight= (EditText) findViewById(R.id.weight);
view_result= (TextView) findViewById(R.id.result);
view_suggest= (TextView) findViewById(R.id.suggest);
}
// Listen for button clicks
privatevoidsetListeners() {
calcbutton.setOnClickListener(calcBMI);
}
privateButton.OnClickListenercalcBMI=newButton.OnClickListener() {
publicvoidonClick(View v) {
DecimalFormat nf =newDecimalFormat("0.0");
doubleheight = Double.parseDouble(field_height.getText().toString()) / 100;
doubleweight = Double.parseDouble(field_weight.getText().toString());
doubleBMI = weight / (height * height);
// Present result
view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
// Give health advice
if(BMI > 25) {
view_suggest.setText(R.string.advice_heavy);
}elseif(BMI < 20) {
view_suggest.setText(R.string.advice_light);
}else{
view_suggest.setText(R.string.advice_average);
}
}
};
}
總結:
關於項目
在就是你項目經驗,必定要突出你遇到什麼難點,而後是怎麼解決的!把問題引導到你熟悉的領域,或者知識點上,儘可能將每一個技術點細節凸顯出來,