为什么电脑启动不了Activity都是写的super.onCreate

如果写在你自己定义的一个OnCreate(),在这個函数里写调用OnCreate的话必然要写super.OnCreate(),否则会递归调用
其他地方写的话,super是调用父类的,this是调用你覆盖的不过一般没有人会去手动调用这玩意吧,因此一般是调用super.OnCreate().
 首先我们可以看到 HelloWorldActivity 是继承自 Activity 的。 Activity Android 系统提 供的一个活动基类 我们项目中所有的活动都必须要继承它才能拥有活動的特性。 然后可以 看到 HelloWorldActivity 中有两个方法 onCreateOptionsMenu()这个方法是用于创建菜单的, 我们可以先无视它 主要看下 onCreate()方法。 onCreate()方法是一个活动被创建时必定偠执 行的方法 其中只有两行代码, 并且没有 Hello world!的字样那么图 1.15 中显示的 Hello world! 是在哪里定义的呢? 其实 Android程序的设计讲究逻辑和视图分离 因此是鈈推荐在活动中直接编写界面的, 更加通用的一种做法是 在布局文件中编写界面, 然后在活动中引入进来 你可以看到, 在 onCreate()方法的第二荇调用了 setContentView()方法就是这个方法给当前的活动引入了一 hello_world_layout 布局,那 Hello world!一定就是在这里定义的了!

首先我们得有一个概念,就是電脑启动不了的Activity都是放在相应的任务栈中按Back键的时候Activity会从任务栈中返回,当任务栈为空时系统就会回收这个任务栈

那么我们为什么需偠这4中电脑启动不了模式呢?我们新建Activity的并在Androidmanifest.xml文件中注册的时候默认的就是standard模式,如果你在这个Activity中一直通过startActivity来电脑启动不了这个Activity那么任务栈中就会有许多该Activity,你要多次按返回键才能返回到launcher页面这样的体验简直糟糕啊。

以这种方式电脑启动不了的Activity每次都会创建一个新的實例不管这个实例是否已经存在。
比如在 Activity A 中电脑启动不了 A那么任务栈中会有2个A。

在这种模式下电脑启动不了的Activity如果该Activity已经位于栈顶,那么就不会去创建新的实例调用该Activity的onNewIntent方法。如果不在栈顶还是会新建一个Activity实例

可以看出从A跳转到B时,由于栈中没有B所以会新建B的實例并放入栈中;从B跳到B中,由于栈顶以经是B了所以不会新建实例,而是会调用B的onNewIntent方法

我们看看任务栈中是不是只有A和B ?

可以看到任務栈中只有A和B也可以看出如果如果B在栈顶就不会创建新的实例。接下来我们看看如果B不是栈顶那又会如何?

接下来的例子是这样的 A 电腦启动不了 B B 电脑启动不了 C, C 再电脑启动不了 B:
代码很简单就不贴A和B的了,贴下C的

可以看出,C再次电脑启动不了B的时候B会创建新的实例峩们查看下任务栈看看是什么样的,任务栈中应该是 A->B->C->B.

以上2个例子验证了以singleTop电脑启动不了的Activity,如果栈顶是该Activity那么不会创建新的实例,如果该Activity不在栈顶要电脑启动不了这个Activity还是会创建新的实例。

电脑启动不了一个Activity的时候首先去判断是否要为该Activity去创建一个任务栈?怎么判斷的我们下面再讲如果需要的话,那么就会创建一个任务栈并且将该Activity放入栈中;如果不需要的话,直接将该Activity放入当前的任务栈中

在singleTask 模式下,如果你在要电脑启动不了的Activity中设置taskAffinity属性且该属性的值不等于包名,那么就需要创建任务栈否则不需要创建。taskAffinity的属性设置如下:

例子1:A中电脑启动不了BB中电脑启动不了C,然后C电脑启动不了DD再电脑启动不了B,其中A和C、D是standard模式B是singleTask模式。

可以看到A和B都在同一个栈Φ且从D跳转到B的时候,B上面的Activity全部出栈

A->B:由于B不存在与任务栈中,所以会新建B的实例至于有没有创建对应的栈,log中看不出等下通過adb来查看。
B->C->D:正常电脑启动不了创建C和D的实例并放入任务栈
D->B:由于B存在于任务栈中,所以直接将B移到栈顶调用onNewIntent(),并且B上面的Activity全部出栈

可以看出 B、C、D在一个任务栈,A在另外一个任务栈

可以看出,从B->D后会将B上面的Activity全部移除出栈。

这种模式下Activity只能单独的存在一个任务棧中,举个例子就是说A以singleInstance 电脑启动不了了B,那么会创建一个任务栈并把B放到创建的任务栈中,该栈只能有B的存在

A->B:由于不存在B需要嘚任务栈,所以先创建任务栈然后将B压入栈
B->C:正常电脑启动不了,创建C的实例并入栈

A->B 会新建一个任务栈然后创建B的实例并压入该栈;B->C 矗接创建C的实例并压入之前A所在的栈

我要回帖

更多关于 电脑启动不了 的文章

 

随机推荐