基礎總結之Activity

1、萬事開頭的序

  網上看見大牛們的博客寫的那樣精彩,各類羨慕之情溢於言表。幾回衝動均想效仿牛人寫些博客來記錄下本身的心得體會,但均無感亦或是感受容易被噴,相信不少菜鳥和我同樣都有過這樣的擔心。萬事開頭難,不逼一下本身怎麼知道本身能不能飛起來。因爲本人處於初學階段,寫此博客僅是對前輩總結的review,對本身記憶的加深及後續使用的方便查找。請各位看官將就看看,手下留情。在此謝過!有錯的地方或者更好的心得體會歡迎隨時騷擾!java

2、Activity介紹

Android中常說的四大組件包括:Activity、Service、Broadcast、Content Providerandroid

其中最基礎也是最多見的就是今天review的主題:Activityide

Activity存在的意義:用戶與Android系統的交互的途徑佈局

3、Activity的生命週期

老套路先上經典的生命週期圖:動畫

(1)正常狀況下的生命週期

Activity的生命週期主要由上述8個方法組成this

  • onCreate表示Activity已經被建立(初始化)

在該方法中咱們能夠作一些初始化的相關操做spa

  1. 加載佈局資源文件:setContentView(R.layout.XX);
  2. 初始化數據:findViewById(R.id.XX);
  • onRestart 一般在Activity從不可見, 從新變爲可見時, 在onStart以前調用
  • onStart 表示Activity已經顯示出來, 可是不能進行交互
  • onResume 表示Activity不只僅顯示出來, 並且已經在前臺活動
  • onPause 表示Activity退出前臺活動

在該方法中能夠作如下操做:
1: 儲存數據
2: 中止動畫
onStop:表示Acitivity正在中止或者即將被銷燬
onDestroy:表示Activity的銷燬, 所作的操做和onCreate正好相反
PS: 耗時操做不要放到onPause或onStop中3d

  1. 首次打開:onCreate()->onStart()->onResume()
  2. 按back鍵結速應用程序:onPause()->onStop()->onDestory()
  3. 按home鍵隱藏應用程序:onPause()->onStop()//此時程序未銷燬
  4. 再次啓動應用程序:onRestart()->onStart()->onResume()
  5. 從Activity(A)跳轉到Activity(B):onPause(A)->onCreate(B)->onStart(B)->onResume(B)->onStop(A)

 (2)異常狀況下的生命週期

 當用戶轉動屏幕時,Activity銷燬並重建的過程以下:code

onPause()->onSaveInstanceState()->onStop()->onDestory()->onCreate()->onStart()->onRestoreInstanceState()->onResume()xml

系統自帶的控件, 如TextView的文本內容Android系統會幫咱們保存和恢復
App的狀態, 則須要咱們本身在onSaveInstanceState和onRestoreInstanceState中保存和恢復

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.i(TAG, "onSaveInstanceState");
    
    outState.putString(BUNDLE_DATA, "xyz");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    Log.i(TAG, "onRestoreInstanceState: " + savedInstanceState.getString(BUNDLE_DATA));
}
View Code

咱們可否在系統配置更新時, 本身對Activity的生命週期進行控制呢?
答案是能夠的, android提供了這樣的機制
咱們在AndroidManifest.xml中的Activity描述中添加以下配置
android:configChanges="orientation|screenSize"
再次旋轉屏幕看看, Activity並無銷燬和重建了

4、Activity啓動模式

與Activity生命週期息息相關的是Activity啓動模式,不一樣的啓動模式,致使的Activity生命週期則不一樣。

Activity有以下4種啓動模式:

  • standard
  • singleTop
  • singleTask
  • singleInstance

1: standard

Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (standard launch)SecondActivity Current Task Stack: ++++SecondActivity ++++FirstActivity
Step 3: (standard launch)FirstActivity Current Task Stack: ++++FirstActivity ++++SecondActivity ++++FirstActivity

standard下: 老是會新建一個Activity入棧

Standard,默認的啓動模式,只要激活了Activity,就會建立一個新的實例,並放入任務棧中,這樣任務棧中可能同時存在一個Activity的多個實例。

2: singleTop

Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (standard launch)SecondActivity Current Task Stack: ++++SecondActivity ++++FirstActivity
Step 3: (singleTop launch)SecondActivity Current Task Stack: ++++SecondActivity ++++FirstActivity

singleTop下: 若是棧頂是該Activity, 則不新建, 若是棧頂不是該Activity, 則新建該Activity

SingleTop,激活Activity時,若是棧頂是Activity,就不會建立新的實例,若是棧頂不是這個Activity,則會建立新的實例對象。

3: singleTask

Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (standard launch)SecondActivity Current Task Stack: ++++SecondActivity ++++FirstActivity
Step 3: (singleTask launch)FirstActivity Current Task Stack: ++++FirstActivity

singleTask下: 若是棧裏已經存在該Activity, 即pop到該Activity, 若是棧裏沒有該Activity, 則新建Activity

singleTask,若是棧中存在Activity的實例,則將棧中該實例以上的其餘Activity的實例移除,讓該Activity的實例處於棧頂,若是棧中不存在該實例,則建立新的實例。

4: singleInstance

Step 1: (standard launch)FirstActivity
Current Task Stack:
++++FirstActivity
Step 2: (singleInstance launch)ThirdActivity Current Task Stack: ++++FirstActivity ++++ThirdActivity
Step 3: (standard launch)SecondActivity Current Task Stack: ++++SecondActivity ++++FirstActivity ++++ThirdActivity

singleInstance下: 會新開一個棧, 單獨放置該Activity

多個應用共享Activity的一個實例,不管是否是同一個應用,只要是激活該Activity,都重用這個實例。

5、Activity實例

1.Activity註冊

1 // in AndroidManifest.xml
2 <activity android:name=".SecondActivity" >
3 </activity>
View Code

2.Activity之Intent

 1 // in FirstActivity.java
 2 @Override
 3 protected void onCreate(Bundle savedInstanceState) {
 4     super.onCreate(savedInstanceState);
 5     setContentView(R.layout.activity_first);
 6     Button standardButton = (Button) findViewById(R.id.standard_button);
 7     standardButton.setOnClickListener(new OnClickListener() {
 8         @Override
 9         public void onClick(View arg0) {
10             Intent intent = new Intent(FirstActivity.this,
11                     SecondActivity.class);
12             startActivity(intent);
13         }
14     });
15 }
View Code

3.Activity之Intent-Filter

1 //in mainifest.xml
2 <intent-filter>
3     <action android-name="android.intent.action.MAIN" />
4     <category android-name="android.intent.category.LAUNCHER" />
5 </intent-filter>
View Code

4.Activity間通訊: FirstActivity -> SecondActivity

 1 // in FirstActivity.java
 2 public static final String EXTRA_DATA = "extra_data";
 3 @Override
 4 protected void onCreate(Bundle savedInstanceState) {
 5     super.onCreate(savedInstanceState);
 6     setContentView(R.layout.activity_first);
 7     Button standardButton = (Button) findViewById(R.id.standard_button);
 8     standardButton.setOnClickListener(new OnClickListener() {
 9         @Override
10         public void onClick(View arg0) {
11             Intent intent = new Intent(FirstActivity.this,
12                     SecondActivity.class);
13             intent.putExtra(EXTRA_DATA, "cba");
14             startActivityForResult(intent, REQUEST_CODE);
15         }
16     });
17 }
18 // in SecondActivity.java
19 @Override
20 protected void onCreate(Bundle savedInstanceState) {
21     super.onCreate(savedInstanceState);
22     setContentView(R.layout.activity_second);
23     Intent intent = getIntent();
24     Toast.makeText(
25             SecondActivity.this,
26             "Data from FirstActivity: "
27                     + intent.getStringExtra(FirstActivity.EXTRA_DATA),
28             Toast.LENGTH_LONG).show();
29 }
View Code

5.Activity間通訊: SecondActivity -> FirstActivity

 1 // in FirstActivity.java
 2 protected void onCreate(Bundle savedInstanceState) {
 3     super.onCreate(savedInstanceState);
 4     setContentView(R.layout.activity_first);
 5     Button standardButton = (Button) findViewById(R.id.standard_button);
 6     standardButton.setOnClickListener(new OnClickListener() {
 7         @Override
 8         public void onClick(View arg0) {
 9             Intent intent = new Intent(FirstActivity.this,
10                     SecondActivity.class);
11             startActivityForResult(intent, REQUEST_CODE);
12         }
13     });
14 }
15 // in SecondActivity.java
16 @Override
17 protected void onResume() {
18     super.onResume();
19     Intent intent = new Intent();
20     intent.putExtra(EXTRA_DATA, "abc");
21     setResult(Activity.RESULT_OK, intent);
22 }
23 // in FirstActivity.java
24 @Override
25 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
26     if (resultCode != Activity.RESULT_OK) {
27         return;
28     }
29     switch (requestCode) {
30     case REQUEST_CODE:
31         Toast.makeText(
32                 FirstActivity.this,
33                 "Result from SecondActivity: "
34                         + data.getStringExtra(SecondActivity.EXTRA_DATA),
35                 Toast.LENGTH_LONG).show();
36         break;
37     default:
38         break;
39     }
40 }
View Code

6.配置Activity啓動模式
靜態方式
即在AndroidManifest.xml中配置

android:launchMode="singleTop"
android:launchMode="singleTask"
android:launchMode="singleInstance"

動態方式
即在源碼中配置

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
相關文章
相關標籤/搜索