1. 程式人生 > >《android開發藝術探索》筆記:Activity介面跳轉到透明主題介面,不呼叫onStop()方法

《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在前臺可互動。