android:name=".MainActivity"指明獲得的名字
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
這兩行指明活動(dòng)為Main活動(dòng)骑脱,當(dāng)應(yīng)用程序運(yùn)行后會(huì)加載這個(gè)活動(dòng)。應(yīng)用程序不聲明任何活動(dòng)為主活動(dòng)也可以運(yùn)行称鳞,這種情況常作為第三方服務(wù)供其他應(yīng)用程序調(diào)用涮较。
1 Activity的聲明周期:
android使用棧來管理Activity,當(dāng)使用Intent打開一個(gè)新的Activity時(shí)候就會(huì)入棧冈止,銷毀活動(dòng)就會(huì)出棧狂票。棧頂?shù)腁ctivity就是顯示在最外面與用戶交互的那個(gè)Activity。
使用Intent來啟動(dòng)一個(gè)新的活動(dòng)NewActivity
//無返回值
Intent intent =new Intent(context,NewActivity.class);
startActivity(intent);
//無返回值熙暴,并且攜帶數(shù)據(jù)
Intent intent =new Intent(context,NewActivity.class);
//使用intent傳遞數(shù)據(jù)
intent.putExtra("key","value");
將數(shù)據(jù)打包進(jìn)Bundle中通過intent傳遞
Bundle bundle=new Bundle();
bundle.putString("bundleKey","bundleValue");
bundle.putFloat("bundleKey2",1.534f);
intent.putExtras(bundle);
startActivity(intent);
// 有返回值
Intent intent =new Intent(context,NewActivity.class);
startActivityForResult(intent,1);//1是請(qǐng)求嗎
.
.
.
//這里是NewActivity中執(zhí)行代碼闺属,將要返回的數(shù)據(jù)加入到intent中
Intent intent =new Intent();
intent.putExtra("key","value");
setResult(RESULT_OK,intent);
//這里是OldActivity慌盯,通過重寫onActivityResult()方法處理返回?cái)y帶的數(shù)據(jù),通過請(qǐng)求嗎requestCode 和 結(jié)果嗎 resultCode來確定 從哪個(gè)activity啟動(dòng)的新activity屋剑,以及從哪個(gè)activity返回的數(shù)據(jù)润匙。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode)
{
case 1:
if(resultCode==RESULT_OK)
{
//這里處理data攜帶的數(shù)據(jù)
}
}
}
這里注意intent傳遞數(shù)據(jù)是有大小限制的,一般來說是1M左右唉匾。
1.Activity的entire lifetime(全部的生命期)發(fā)生在調(diào)用onCreate()和調(diào)用onDestory()之間孕讳。在onCreate()方法中執(zhí)行全局狀態(tài)的建立(例如定義布局),在onDestroy()方法中釋放所有保存的資源巍膘。
2.Activity的visible lifetime(可見的生命期)發(fā)生在調(diào)用onStart()和onStop()之間厂财。在這個(gè)期間,用戶能在屏幕上看見Activity峡懈,和它進(jìn)行交互璃饱。系統(tǒng)在Activity的完整壽命中可能多次調(diào)用onStart()和onStop(),正如Activity交替地對(duì)用戶可見或隱藏。
3Activity的foreground lifetime (前臺(tái)的生命期)發(fā)生在調(diào)用onResume()和onPause()之間肪康。 在這期間荚恶,Activity在屏幕上所有其他Activity的前面,有用戶輸入焦點(diǎn)磷支。 一個(gè)Activity能頻繁的在前臺(tái)進(jìn)入和出去之間轉(zhuǎn)變谒撼。
我們可以使用application注冊(cè)生命周期回調(diào)來監(jiān)聽每一個(gè)Activity的生命周期,如下:
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
這樣當(dāng)每個(gè)Activity對(duì)象被創(chuàng)建使用時(shí)候雾狈,除了回調(diào)自己的內(nèi)部回調(diào)方法外還會(huì)回調(diào)這個(gè)callback中相應(yīng)的方法廓潜。如onCreate()對(duì)應(yīng)onActivityCreated()方法,因此可以通過這個(gè)回調(diào)來對(duì)Activity進(jìn)行統(tǒng)一管理善榛,例如創(chuàng)建一個(gè)靜態(tài)引用List來存儲(chǔ)Activity
List<Activity> activitys=new ArrayList<>();
//在創(chuàng)建activity時(shí)候加入到這個(gè)list中辩蛋,銷毀時(shí)候從list中刪除。
application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
activity.add(activity);
}
·
·
·
@Override
public void onActivityDestroyed(Activity activity) {
activity.remove(activity);
}
});
}
2 臨時(shí)存儲(chǔ)數(shù)據(jù)
當(dāng)活動(dòng)進(jìn)入停止?fàn)顟B(tài)時(shí)候移盆,就可能由于內(nèi)存不足被系統(tǒng)回收悼院,這時(shí)候可以通過onSaveInstanceState()方法來臨時(shí)存儲(chǔ)一些數(shù)據(jù),當(dāng)activity被重建時(shí)候可以通過onCreate()方法中的Bunble參數(shù)來提取到之前存儲(chǔ)的數(shù)據(jù)咒循。
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String saveData="lalala";
outState.putString("key",saveData);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState!=null)
{
String saveData=savedInstanceState.getString("key");
}
}
3 四種啟動(dòng)模式
Activity提供四種啟動(dòng)模式:standard樱蛤、singleTask、singleTop剑鞍、singleInstance昨凡,可以通過AndroidManifest.xml文件中activity標(biāo)間指定android:launchMode=··· 來設(shè)置啟動(dòng)模式
android:launchMode="standard"
standard:這是系統(tǒng)默認(rèn)的啟動(dòng)模式,這種模式下不會(huì)在乎這個(gè)活動(dòng)是否已經(jīng)被創(chuàng)建蚁署,當(dāng)使用intent啟動(dòng)一個(gè)新活動(dòng)時(shí)就會(huì)創(chuàng)建一個(gè)新的Activity對(duì)象壓入棧頂便脊。
singleTop:當(dāng)一個(gè)活動(dòng)處于棧頂時(shí)在啟動(dòng)一個(gè)相同的活動(dòng)時(shí)不會(huì)創(chuàng)建新的實(shí)例,但是會(huì)調(diào)用onNewIntent()方法光戈。
singleTask:顧名思義哪痰,這種模式每個(gè)活動(dòng)只允許棧中存在一個(gè)實(shí)例遂赠,當(dāng)返回棧中存在某種活動(dòng)時(shí),開啟一個(gè)新活動(dòng)不會(huì)創(chuàng)建新的實(shí)例晌杰,只會(huì)將這個(gè)存在實(shí)例上面其他活動(dòng)出棧跷睦,使它成為棧頂活動(dòng),同樣會(huì)調(diào)用onNewIntent()方法肋演。
singleInstance:這種啟動(dòng)模型不適用默認(rèn)的返回棧抑诸,會(huì)啟用一個(gè)新的返回棧來管理這個(gè)活動(dòng)