Android入门——四大组件之Activity启动模式

转载请注明出处:https://blog.csdn.net/eternally__/article/details/82496515

  • standrad
  • singleTop
  • singleTask
  • singleInstance

在AndroidManifest.xml中通过中设置

 <activity android:name=".MainActivity"
        android:launchMode="singleInstance"></activity>

standrad

standrad是默认的启动模式,每次启动一个Activity都会创建一个新的实例加入到栈中,并处于栈顶的位置,所以在退出的时候,你启动了几次,就需要按几次back键退出程序。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.i(TAG, "onCreate()"+this.toString());
}

通过intent启动当前activity

mStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(MainActivity.this, MainActivity.class));
        }
    });

通过log信息可以看出每次启动this.toString()的值都不一样

I/MainActivity: onCreate()com.demo2.MainActivity@8e696d3
I/MainActivity: onCreate()com.demo2.MainActivity@c5923b1
I/MainActivity: onCreate()com.demo2.MainActivity@3206615

singleTop

如果新启动的activity已经位于栈顶,就不会创建新的实例,并且会回调onNewIntent方法。反之如果新启动的activity不是位于栈顶的,就会重新创建新的实例,并添加到栈顶

//首次启动activity
I/SecondActivity: onCreate()collect.pingshow.com.demo2.SecondActivity@a84877d
//之后多次启动activity都不会再创建新的实例,因为当前activity已经位于栈顶

看下面的log信息,很明显创建了两个MainActivity的实例,因为启动了SecondActivity,MainActivity不再位于栈顶位置,所以在SendActivity中启动MainActivity会重新创建一个新的实例

I/MainActivity: onCreate()collect.pingshow.com.demo2.MainActivity@de85aba
I/SecondActivity: onCreate()collect.pingshow.com.demo2.SecondActivity@be63417
I/MainActivity: onCreate()collect.pingshow.com.demo2.MainActivity@3206615

singleTask

每次启动activity时都会在栈中检查是否存在该activity的实例,如果存在直接使用该实例,并把这个activity之上的其他activity都移出栈,并且会回调onNewIntent方法。如果没有发现该activity的实例,那就创建一个实例

MainActivity 为singleTask模式

I/MainActivity: onCreate()collect.pingshow.com.demo2.MainActivity@5c75d51
I/MainActivity: onStart()
I/MainActivity: onResume()
I/MainActivity: onPause()
//跳转到SecondActivity
I/SecondActivity: onCreate()collect.pingshow.com.demo2.SecondActivity@4d92723
I/SecondActivity: onStart()
I/SecondActivity: onResume()
I/MainActivity: onSaveInstanceState()
I/MainActivity: onStop()
//从SecondActivity启动MainActivity,发现MainActivity并没有重新创建新的实例
I/SecondActivity: onPause()
I/MainActivity: onNewIntent()
I/MainActivity: onRestart()
I/MainActivity: onStart()
I/MainActivity: onResume()
I/SecondActivity: onStop()
I/SecondActivity: onDestroy()           

singleInstance

singleInstance会启动一个新的栈来管理activity。设置为singleInstance启动模式的activity,启动后,系统会为其单独创建一个栈,这个activity独自位于这个栈中,之后不会重复创建它的实例

I/MainActivity: onCreate() task id=585
I/SecondActivity: onCreate() task id=586
I/ThirdActivity: onCreate() task id=585

从log信息可以看出,MainActivity和ThirdActivity都在一个栈中,因为SecondActivity设置为singleInstance模式,所以单独在一个栈中。当我们按下back键返回的时候,ThirdActivity直接返回了MainActivity,再按下back键返回到了SecondActivity,再按back键退出程序。原因是MainActivity和ThirdActivity都在一个栈中,ThirdActiity出栈后,MainActivity就位于栈顶显示在界面。然后MainActivity出栈后,这个栈已经空了,于是就显示了另一个栈中的SecondActivity

欢迎纠错

猜你喜欢

转载自blog.csdn.net/eternally__/article/details/82496515