《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在前台可交互。


猜你喜欢

转载自blog.csdn.net/qq_29092191/article/details/80901610