《android開發藝術探索》筆記:Activity介面跳轉到透明主題介面,不呼叫onStop()方法
《探索》上說跳轉透明主題的activity屬於特殊情況,不呼叫當前activity的onstop()方法,當返回介面時候又會直接呼叫onResume()。這裡做一個簡單例子以增加對這種情況的理解:
正常介面跳轉情況下activity跳轉生命週期函式的呼叫(SecActivity為新介面):
MainActivity.onPause()->SecActivity.onCreate()->Sectivity.OnStart()->Sectivity.OnResume()->MainActivity.onStop();
新介面載入後點擊返回鍵:
SecActivity.onPause()->MainActivity().onRestart()->MainActivity().onStart()->MainActivity().onResume()->SecActivity.onStop()->SecActivity.onDestroy();
跳轉透明主題介面:
MainActivity.onPause()->SecActivity.onCreate()->Sectivity.OnStart()->Sectivity.OnResume();//未呼叫MainActivity.onStop();
新介面載入後點擊返回鍵:
SecActivity.onPause()->MainActivity().onResume()->SecActivity.onStop()->SecActivity.onDestroy();//未呼叫Mainactivity的 onRestart()和onStart();
跳轉示例程式碼:
在AndroidManifest.xml中註冊新介面,令新介面主題為透明的程式碼:
android:theme="@android:style/Theme.Translucent.NoTitleBar"
註冊程式碼: <activity android:name=".SecActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
</activity>
MainActivity:
package com.example.lyx.test; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(MainActivity.this, SecActivity.class); startActivity(i); } }; private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("testApp", "MainActivity onCreate"); btn = (Button) findViewById(R.id.StartSec_btn); btn.setOnClickListener(listener); } @Override protected void onStart() { super.onStart(); Log.i("testApp", "MainActivity onStart"); } @Override protected void onRestart() { super.onRestart(); Log.i("testApp", "MainActivity onRestart"); } @Override protected void onResume() { super.onResume(); Log.i("testApp", "MainActivity onResume"); } @Override protected void onPause() { super.onPause(); Log.i("testApp", "MainActivity onPause"); } @Override protected void onStop() { super.onStop(); Log.i("testApp", "MainActivity onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.i("testApp", "MainActivity onDestroy"); } }
SecActivity:
package com.example.lyx.test;
import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
public class SecActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sec_activity);
Log.i("testApp", "SecActivity onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.i("testApp", "SecActivity onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i("testApp", "SecActivity onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.i("testApp", "SecActivity onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.i("testApp", "SecActivity onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.i("testApp", "SecActivity onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("testApp", "SecActivity onDestroy");
}
}
效果
啟動app載入MainActivity:
跳轉到SecActivity
點選返回按鈕:
刪除透明主題效果,即登出掉以下程式碼:
android:theme="@android:style/Theme.Translucent.NoTitleBar"
跳轉到SecActivity(呼叫了MainActivity.onStop):
返回鍵:
總結其他細節:
1.每次開啟新介面,當前activity的onPause方法優先呼叫後,進行新介面的生命週期方法,最後呼叫當前activity的其他生命週期方法,我認為是為了更快的顯示新介面才這樣設計的;
2.onStop()方法呼叫後表示當前介面必定不可見了。所以當跳轉透明介面或者顯示dialog時候,不會呼叫onStop()方法,因為當前介面可見。
3.onResume()方法表示activity在前臺可互動。