生命周期
onCreate:create表示創(chuàng)建,這是Activity生命周期的第一個(gè)方法导饲,也是我們?cè)赼ndroid開(kāi)發(fā)中接觸的最多的生命周期方法蝙泼。它本身的作用是進(jìn)行Activity的一些初始化工作寥粹,比如使用setContentView加載布局,對(duì)一些控件和變量進(jìn)行初始化等轴踱。但也有很多人將很多與初始化無(wú)關(guān)的代碼放在這症脂,其實(shí)這是不規(guī)范的。此時(shí)Activity還在后臺(tái)淫僻,不可見(jiàn)诱篷。所以動(dòng)畫(huà)不應(yīng)該在這里初始化,因?yàn)榭床坏健?/p>
onStart:start表示啟動(dòng)嘁傀,這是Activity生命周期的第二個(gè)方法兴蒸。此時(shí)Activity已經(jīng)可見(jiàn)了,但是還沒(méi)出現(xiàn)在前臺(tái)细办,我們還看不到橙凳,無(wú)法與Activity交互。其實(shí)將Activity的初始化工作放在這也沒(méi)有什么問(wèn)題笑撞,放在onCreate中是由于官方推薦的以及我們開(kāi)發(fā)的習(xí)慣岛啸。
onResume:resume表示繼續(xù)、重新開(kāi)始茴肥,這名字和它的職責(zé)也相同坚踩。此時(shí)Activity經(jīng)過(guò)前兩個(gè)階段的初始化已經(jīng)蓄勢(shì)待發(fā)。Activity在這個(gè)階段已經(jīng)出現(xiàn)在前臺(tái)并且可見(jiàn)了瓤狐。這個(gè)階段可以打開(kāi)獨(dú)占設(shè)備
onPause:pause表示暫停瞬铸,當(dāng)Activity要跳到另一個(gè)Activity或應(yīng)用正常退出時(shí)都會(huì)執(zhí)行這個(gè)方法。此時(shí)Activity在前臺(tái)并可見(jiàn)础锐,我們可以進(jìn)行一些輕量級(jí)的存儲(chǔ)數(shù)據(jù)和去初始化的工作嗓节,不能太耗時(shí),因?yàn)樵谔D(zhuǎn)Activity時(shí)只有當(dāng)一個(gè)Activity執(zhí)行完了onPause方法后另一個(gè)Activity才會(huì)啟動(dòng)皆警,而且android中指定如果onPause在500ms即0.5秒內(nèi)沒(méi)有執(zhí)行完畢的話就會(huì)強(qiáng)制關(guān)閉Activity拦宣。從生命周期圖中發(fā)現(xiàn)可以在這快速重啟,但這種情況其實(shí)很罕見(jiàn),比如用戶切到下一個(gè)Activity的途中按back鍵快速得切回來(lái)鸵隧。
onStop:stop表示停止绸罗,此時(shí)Activity已經(jīng)不可見(jiàn)了,但是Activity對(duì)象還在內(nèi)存中豆瘫,沒(méi)有被銷(xiāo)毀珊蟀。這個(gè)階段的主要工作也是做一些資源的回收工作。
onDestroy:destroy表示毀滅靡羡,這個(gè)階段Activity被銷(xiāo)毀系洛,不可見(jiàn)俊性,我們可以將還沒(méi)釋放的資源釋放略步,以及進(jìn)行一些回收工作。
onRestart:restart表示重新開(kāi)始定页,Activity在這時(shí)可見(jiàn)趟薄,當(dāng)用戶按Home鍵切換到桌面后又切回來(lái)或者從后一個(gè)Activity切回前一個(gè)Activity就會(huì)觸發(fā)這個(gè)方法。這里一般不做什么操作典徊。
pointer
- onStart方法和onResume方法有什么區(qū)別(onStop和onPause)
是否在前臺(tái)杭煎。onStart方法中Activity可見(jiàn)但不在前臺(tái),不可交互卒落,而在onResume中在前臺(tái)羡铲。
- A activity打開(kāi)B activity A 的onpause()和B的onResume哪個(gè)先執(zhí)行
先A onPause()然后再執(zhí)行B的onResume
- onSaveInstanceState和onRestoreInstanceState的作用
橫屏操作發(fā)生,導(dǎo)致activity被銷(xiāo)毀時(shí)儡毕,會(huì)調(diào)用onSaveInstanceState也切,可以在其中存取數(shù)據(jù),恢復(fù)時(shí)會(huì)調(diào)用onRestoreInstanceState獲取bundle數(shù)據(jù)(非空)設(shè)置它腰湾,oncreate中也可以獲取bundle數(shù)據(jù)設(shè)置它雷恃,但是oncreate中不一定是非空的
- 使activity不會(huì)因?yàn)槠聊恍D(zhuǎn)而被重新創(chuàng)建的方法
給activity設(shè)置android:configchanges="orientation|screenSize",configchanges的其他屬性
LaunchMode
Standard:新建一個(gè)實(shí)例,進(jìn)入創(chuàng)建它的activity的棧中
singleTop:棧頂復(fù)用模式费坊,如果在棧頂就不會(huì)被重新創(chuàng)建倒槐,它的onNewIntent方法會(huì)被調(diào)用,這個(gè)activity的onCreate和onStart不會(huì)被調(diào)用
singleTask:棧內(nèi)復(fù)用附井,需要的任務(wù)棧中有該實(shí)例時(shí)讨越,就不創(chuàng)建新實(shí)例(需要的任務(wù)棧指的事TaskAffinity屬性,他可以指定任務(wù)棧的名字永毅,默認(rèn)是包名)
singleInstance:一個(gè)activity獨(dú)自占據(jù)一個(gè)任務(wù)棧
指定LaunchMode的方法
//manifest中的activity配置
android:launchMode="singleTask"
//添加flag標(biāo)簽
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Flags
- FLAG_ACTIVITY_NEW_TASK :
對(duì)應(yīng)singleTask模式
- FLAG_ACTIVITY_SINGLE_TOP:
對(duì)應(yīng)singleTop模式
- FLAG_ACTIVITY_CLEAR_TOP:
如果設(shè)置了此標(biāo)志位把跨,并且被啟動(dòng)的Activity已經(jīng)存在于這個(gè)Task中,則不會(huì)啟動(dòng)一個(gè)該Activity的新的實(shí)例卷雕,而是彈出在Task中节猿,該Activity上的所有Activity。同時(shí),這個(gè)intent作為一個(gè)新的intent會(huì)傳遞給該Activity滨嘱。
- FLAG_ACTIVITY_CLEAR_TASK:
如果設(shè)置了這個(gè)標(biāo)志的intent通過(guò)Context.startActivity()去啟動(dòng)某個(gè)Activity峰鄙,那么該標(biāo)志會(huì)導(dǎo)致任何與此獲得弄個(gè)相關(guān)聯(lián)的task被清空,在這個(gè)活動(dòng)啟動(dòng)之前太雨。然后吟榴,該活動(dòng)就會(huì)變成根Activity,之前的活動(dòng)全被銷(xiāo)毀了囊扳。這個(gè)標(biāo)志只能和FLAG_ACTIVITY_NEW_TASK在一起使用
IntentFilter
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
</intent-filter>
需要同時(shí)匹配action吩翻,category,data才能成功隱式啟動(dòng)activity
action
系統(tǒng)預(yù)定義了一些action锥咸,像android.intent.action.SEND可以用來(lái)分享信息狭瞎,其他應(yīng)用如果也有activity定義了此action時(shí),進(jìn)行隱式調(diào)用android.intent.action.SEND時(shí)搏予,會(huì)談出選擇框?qū)⑺泻薬ction的應(yīng)用列出來(lái)進(jìn)行選擇分享
category
使用android.intent.category.DEFAULT就好了
data
分為uri和mimetype熊锭,像例子一樣就是分享文本和圖片,當(dāng)uri匹配成功才會(huì)被調(diào)用起來(lái)
自定義ActivityManager
public class ActivityManager{
private static final String TAG = "ActivityManager";
private static Stack<Activity> activityStack;
private static ActivityManager instance;
private Activity currActivity;
private ActivityManager(){
}
public static ActivityManager getActivityManager(){
if(instance == null){
instance = new ActivityManager();
}
return instance;
}
//退出棧頂Activity
public void popActivity(Activity activity){
if(activity == null || activityStack == null){
return;
}
if(activityStack.contains(activity)){
activityStack.remove(activity);
}
currActivity = activity;
//activity.finish;
}
public void destoryActivity(Activity activity){
if(activity == null){
return;
}
activity.finish();
if(activityStack.contains(activity)){
activityStack.remove(activity);
}
activity=null;
}
//獲得當(dāng)前棧頂Activity
public Activity currentActivity(){
if(activityStack == null||activityStack.empty()){
return null;
}
return activityStack.lastElement();
}
//將當(dāng)前Activity推入棧中
public void pushActivity(Activity activity){
if(activityStack == null){
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
//退出棧中除指定的Activity外所有
public void popAllActivityExceptOne(Class cls){
while(true){
Activity activity = currentActivity();
if(activity == null){
break;
if(activity.getClass().equals(cls))
break;
destroyActivity(activity);
}
}
//退出棧中所有Activity
public void popAllActivity(){
popAllActivityExceptOne(null);
}
public Activity getCurrentActivity(){
return currActivity;
}
public int getActivityStackSize(){
int size = 0;
if(activityStack != null){
size = activityStack.size();
}
return size;
}
}