《探索》上说跳转透明主题的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在前台可交互。