Activity四种启动方式生命周期变化(一)

来源:互联网 发布:logo 设计软件 编辑:程序博客网 时间:2024/06/06 16:31

工作了一年多,虽然写的代码越来越多,但是,发现好多最基础的东西也在一点点淡忘,曾经张口就来的知识,长时间的不用,也需要想很久,甚至遗忘,决定,写一些东西,回忆一些很细节的点,希望和大家一起学习。接下来进入正题。

  1. Activity的四种启动方式
    standard:默认启动方式,每次都会创建一个新的activity实例。允许同一个Activity的多个实例出现在task中。
    singleTop:允许多个实例出现,但不允许在栈顶出现两个连续的实例,如果2个实例连续出现则复用前一个实例对象,如多不是连续出现,则可以创建多个相同Activity的实例。
    singleTask:每个Activity只允许有一个实例出现在栈中,如果启动2个相同的Activity则复用之前的Activity,并且将该Activity之上的其他Activity全部destroy掉。
    singleInstance:每个Activity都只能有一个实例,如果创建新的实例则会复用该实例,但是每个标记为singleInstance的实例都会单独运行在一个task中,并且该task不允许出现其他Activity。

    以上是对四种启动模式的简述,当然,这不是我们今天讲述的重点内容,接下来我们将讲述当一个activity被标记为singleTask时,启动它时,它的生命周期是如何变化的。

  2. 当Activity被标记为singleTask
    我们先新建2个Activity,命名为FirstActivity和SecondActivity,其中SecondActivity标记为singleTask。

public class FirstActivity extends AppCompatActivity {    private final static String TAG = "firstactivity";    private Button mSecondActivityButton;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_first);        Log.d(TAG,"onCreate");        mSecondActivityButton = (Button)findViewById(R.id.second_activity_button);        mSecondActivityButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);                intent.putExtra("extra","extra_data");                startActivity(intent);            }        });    }    @Override    protected void onStart() {        super.onStart();        Log.d(TAG,"onstart");    }    @Override    protected void onRestart() {        super.onRestart();        Log.d(TAG,"onRestart");    }    @Override    protected void onResume() {        super.onResume();        Log.d(TAG,"onResume");    }    @Override    protected void onStop() {        super.onStop();        Log.d(TAG,"onStop");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.d(TAG,"onDestroy");    }    @Override    protected void onNewIntent(Intent intent) {        super.onNewIntent(intent);        Log.d(TAG,"OnNewIntent");    }}
public class SecondActivity extends AppCompatActivity {    private final static String TAG = "secondactivity";    private Button mFirstActivityButton;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        mFirstActivityButton = (Button)findViewById(R.id.first_activity_button);        mFirstActivityButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(SecondActivity.this,FirstActivity.class);                startActivity(intent);            }        });        Log.d(TAG,"onCreate");        String extralString = getExtralIntentString();        Log.d(TAG,"onCreate ==== "+extralString);    }    @Override    protected void onStart() {        super.onStart();        Log.d(TAG,"onstart");    }    @Override    protected void onRestart() {        super.onRestart();        Log.d(TAG,"onRestart");    }    @Override    protected void onResume() {        super.onResume();        Log.d(TAG,"onResume");    }    @Override    protected void onStop() {        super.onStop();        Log.d(TAG,"onStop");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.d(TAG,"onDestroy");    }    @Override    protected void onNewIntent(Intent intent) {        super.onNewIntent(intent);        Log.d(TAG, "OnNewIntent");        setIntent(intent);        String extralString = getExtralIntentString();        Log.d(TAG,"onNewIntent ==== "+extralString);    }    private String getExtralIntentString (){        Intent extraIntent = getIntent();        return extraIntent.getStringExtra("extra");    }}

我们可以看下2个activity的相关代码,其中FirstActivity是默认的standard启动方式,SecondActivity为singleTask,我们在他们生命周期的相关函数中分别输出。
1.现在先从FirstActivity跳转到SecondActivity
这里写图片描述
我们可以看到此时SecondActivity调用了它的onCreate并且在onCreate中拿到了intent中传递过来的数据。而此时FirstActivity进入了onStop状态,但FirstActivity并没有调用onDestroy而被系统释放掉。

2.再从SecondActivity跳转到FirstActivity
这里写图片描述
当我们再次跳转回FirstActivity时,发现我们的程序并没有复用之前的FirstActivity实例,而是重新创建了一个FirstActivity重新调用了它的onCreate函数。

3.再从FirstActivity跳转到SecondActivity
这里写图片描述
当我们再次跳转回SecondActivity时,我们发现程序并没有重新创建新的SecondActivity实例,而是调用了onRestart函数,重新复用了之前创建的SecondActivity实例,并且从一个叫做onNewIntent的方法中取出了传递的数据去除,并没有从onCreate中取出数据。此时之前创建的第二个FirstActivity进入了onDestroy状态而被释放掉。

在这里我们可以观察到,如果我们只是从onCreate中取出intent传来的数据,那当Activity进行复用时,我们就会得不到数据,所以当我们使用singleTask,singleTop,singleInstance时,一定要注意,如果想从前一个Activity拿到数据,一定要重写onNewIntent方法。而且在onCreate和onNewIntent方法中要进行相同的操作拿出intent中的数据。

在最后我描述一下task中对象的变化,First->Second->First.2,当第二个FirstActivity跳转到SecondActivity时,First.2出栈被释放掉。复用了SecondActivity,对于singleTop和singleInstance大家可以利用上面的代码自己动手试一试。

今天描述的知识点比较基础,下次我会介绍关于Fragment和Activity的一些知识

第一次更博,写的不好,大家不要喷。

原创粉丝点击