Activity四种启动方式生命周期变化(一)
来源:互联网 发布:logo 设计软件 编辑:程序博客网 时间:2024/06/06 16:31
工作了一年多,虽然写的代码越来越多,但是,发现好多最基础的东西也在一点点淡忘,曾经张口就来的知识,长时间的不用,也需要想很久,甚至遗忘,决定,写一些东西,回忆一些很细节的点,希望和大家一起学习。接下来进入正题。
Activity的四种启动方式
standard:默认启动方式,每次都会创建一个新的activity实例。允许同一个Activity的多个实例出现在task中。
singleTop:允许多个实例出现,但不允许在栈顶出现两个连续的实例,如果2个实例连续出现则复用前一个实例对象,如多不是连续出现,则可以创建多个相同Activity的实例。
singleTask:每个Activity只允许有一个实例出现在栈中,如果启动2个相同的Activity则复用之前的Activity,并且将该Activity之上的其他Activity全部destroy掉。
singleInstance:每个Activity都只能有一个实例,如果创建新的实例则会复用该实例,但是每个标记为singleInstance的实例都会单独运行在一个task中,并且该task不允许出现其他Activity。以上是对四种启动模式的简述,当然,这不是我们今天讲述的重点内容,接下来我们将讲述当一个activity被标记为singleTask时,启动它时,它的生命周期是如何变化的。
当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的一些知识。
第一次更博,写的不好,大家不要喷。
- Activity四种启动方式生命周期变化(一)
- activity四种方式启动
- Activity 四种启动方式
- Activity启动方式四种
- activity四种启动方式
- Activity四种启动方式
- activity 四种启动方式
- activity四种启动方式
- Activity四种启动方式
- activity四种启动方式
- Activity生命周期和四种启动模式
- Activity四种启动模式(一)
- 2015.6.22学习笔记之activity的生命周期和四种启动方式
- Android随笔(一)——Activity的四种启动方式
- Activity的生命周期和Activity的四种启动模式
- Activity生命周期与启动方式
- Android启动过程 && Activity生命周期 && Activity开机自启动 && Activity的四种启动模式
- Activity的四种LaunchMode(启动方式)
- 字符集详解
- Apache配置虚拟主机的坑 本地wampserver调试环境 局域网访问
- jsp页面取后台传的值
- Mybatis 框架 4
- 区块链技术在创造共享经济方面胜过互联网
- Activity四种启动方式生命周期变化(一)
- 关于写javaee数据库的一些规范问题
- oracle远程连接
- LeetCode基础-链表-反转链表
- Ubuntu蓝屏进不了图形界面的解决办法
- 第三课作业3:1!+1/2!+1/3!+1/4!+....的前20项和
- 人工智能专家供不应求,硅谷开启人才争夺 | 聚焦
- 当我们和孩子谈论机器人的时候应该谈什么? | 精选
- Java学习笔记(5)