生命周期
onCreate:create表示創建,這是Activity生命周期的第一個方法,也是我們在android開發中接觸的最多的生命周期方法。它本身的作用是進行Activity的一些初始化工作,比如使用setContentView加載布局,對一些控件和變量進行初始化等。但也有很多人將很多與初始化無關的代碼放在這,其實這是不規范的。此時Activity還在后臺,不可見。所以動畫不應該在這里初始化,因為看不到……
onStart:start表示啟動,這是Activity生命周期的第二個方法。此時Activity已經可見了,但是還沒出現在前臺,我們還看不到,無法與Activity交互。其實將Activity的初始化工作放在這也沒有什么問題,放在onCreate中是由于官方推薦的以及我們開發的習慣。
onResume:resume表示繼續、重新開始,這名字和它的職責也相同。此時Activity經過前兩個階段的初始化已經蓄勢待發。Activity在這個階段已經出現在前臺并且可見了。這個階段可以打開獨占設備
onPause:pause表示暫停,當Activity要跳到另一個Activity或應用正常退出時都會執行這個方法。此時Activity在前臺并可見,我們可以進行一些輕量級的存儲數據和去初始化的工作,不能太耗時,因為在跳轉Activity時只有當一個Activity執行完了onPause方法后另一個Activity才會啟動,而且android中指定如果onPause在500ms即0.5秒內沒有執行完畢的話就會強制關閉Activity。從生命周期圖中發現可以在這快速重啟,但這種情況其實很罕見,比如用戶切到下一個Activity的途中按back鍵快速得切回來。
onStop:stop表示停止,此時Activity已經不可見了,但是Activity對象還在內存中,沒有被銷毀。這個階段的主要工作也是做一些資源的回收工作。
onDestroy:destroy表示毀滅,這個階段Activity被銷毀,不可見,我們可以將還沒釋放的資源釋放,以及進行一些回收工作。
onRestart:restart表示重新開始,Activity在這時可見,當用戶按Home鍵切換到桌面后又切回來或者從后一個Activity切回前一個Activity就會觸發這個方法。這里一般不做什么操作。
pointer
- onStart方法和onResume方法有什么區別(onStop和onPause)
是否在前臺。onStart方法中Activity可見但不在前臺,不可交互,而在onResume中在前臺。
- A activity打開B activity A 的onpause()和B的onResume哪個先執行
先A onPause()然后再執行B的onResume
- onSaveInstanceState和onRestoreInstanceState的作用
橫屏操作發生,導致activity被銷毀時,會調用onSaveInstanceState,可以在其中存取數據,恢復時會調用onRestoreInstanceState獲取bundle數據(非空)設置它,oncreate中也可以獲取bundle數據設置它,但是oncreate中不一定是非空的
- 使activity不會因為屏幕旋轉而被重新創建的方法
給activity設置android:configchanges="orientation|screenSize",configchanges的其他屬性
image
LaunchMode
Standard:新建一個實例,進入創建它的activity的棧中
singleTop:棧頂復用模式,如果在棧頂就不會被重新創建,它的onNewIntent方法會被調用,這個activity的onCreate和onStart不會被調用
singleTask:棧內復用,需要的任務棧中有該實例時,就不創建新實例(需要的任務棧指的事TaskAffinity屬性,他可以指定任務棧的名字,默認是包名)
singleInstance:一個activity獨自占據一個任務棧
指定LaunchMode的方法
//manifest中的activity配置
android:launchMode="singleTask"
//添加flag標簽
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Flags
- FLAG_ACTIVITY_NEW_TASK :
對應singleTask模式
- FLAG_ACTIVITY_SINGLE_TOP:
對應singleTop模式
- FLAG_ACTIVITY_CLEAR_TOP:
如果設置了此標志位,并且被啟動的Activity已經存在于這個Task中,則不會啟動一個該Activity的新的實例,而是彈出在Task中,該Activity上的所有Activity。同時,這個intent作為一個新的intent會傳遞給該Activity。
- FLAG_ACTIVITY_CLEAR_TASK:
如果設置了這個標志的intent通過Context.startActivity()去啟動某個Activity,那么該標志會導致任何與此獲得弄個相關聯的task被清空,在這個活動啟動之前。然后,該活動就會變成根Activity,之前的活動全被銷毀了。這個標志只能和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>
需要同時匹配action,category,data才能成功隱式啟動activity
action
系統預定義了一些action,像android.intent.action.SEND可以用來分享信息,其他應用如果也有activity定義了此action時,進行隱式調用android.intent.action.SEND時,會談出選擇框將所有含此action的應用列出來進行選擇分享
category
使用android.intent.category.DEFAULT就好了
data
分為uri和mimetype,像例子一樣就是分享文本和圖片,當uri匹配成功才會被調用起來
自定義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;
}
//獲得當前棧頂Activity
public Activity currentActivity(){
if(activityStack == null||activityStack.empty()){
return null;
}
return activityStack.lastElement();
}
//將當前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;
}
}