onCreate未被调用

102

我有两个活动:第一个活动中用户点击按钮,启动第二个活动。第二个活动完成所有工作。

我如下启动第二个活动,在 onClickListener 内部类中,并尝试使用 (FirstActivity.this, Simple.Class) 显式调用它,但发生了相同的事情。

    Intent test = new Intent(arg0.getContext(),Simple.class);
    startActivity(test);

在模拟器上,我看到屏幕移动好像是在调用第二个活动,但我只得到了一个黑屏,从我的布局中没有加载任何内容。我查看了logcat,发现一些binder thread failed的消息。这是我第二个活动的onCreate函数,但是我既没有从屏幕上得到结果,也没有在logcat中看到任何日志函数被调用的结果:

    public void onCreate(Bundle savedState)
    {
       Log.d("SimpleActivity","OnCreate Started");

       super.onCreate(savedState);
   setContentView(R.layout.simple);

       Log.d("SimpleActivity","OnCreate Ended");
    }

注意:在上面的代码中,我已经在OnCreate()方法中使用了super.onCreate(savedState)来调用基础构造函数。


发布更多的代码,以便我们可以看到arg0是什么。你可能不应该使用那个。使用YourActivity.this作为传递给新意图的上下文。 - FoamyGuy
你解决了吗?你的视图中是否直接实例化了一个片段? - Adam Mendoza
8个回答

379

我遇到的问题是我错误地重写了错误的onCreate方法。我应该重写protected void onCreate(@Nullable Bundle savedInstanceState)方法,而不是public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)方法。也许这会帮助其他人解决类似的问题!


26
谢谢,那就是我想要的了! - mrpeardotnet
5
这个愚蠢的bug让我至少花了一个小时才找到...该死的,public void onCreate - Raphael Royer-Rivard
3
onCreate(&进入降落在这里哈哈..自动完成应该使工作更容易,不是吗? - Vihaan Verma
9
感谢Google将"void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)"作为代码自动完成的默认方法。 Grrrrrrr(表示不满或愤怒)。 - Carlos
2
这不是“愚蠢的错误”,而是纯粹的糟糕API设计,呃。 - Zsolt Szatmari
显示剩余8条评论

10

如果活动从未被销毁,或因某种原因停留在那里,下一次实例化它时不会重新创建而是恢复...

至少这是我现在在我的代码中处理的问题...活动的生命周期似乎是一个很好的逻辑解释..然而99%的时间我确实依赖 onCreate 在启动活动时被调用,并且它从未出过错...

编辑:当退出活动时我没有调用 finish() 方法, 因此出现了这种情况。唉。


1
这个答案给了我修复问题的线索。在我的情况下,Activity 在对象标志的条件下完成,并且这个标志放置在处理程序的可运行代码中。但是在执行可运行代码之前,这个对象变成了 null。感谢您的帮助。 - jrh
这就是我的情况,直接进入了onPause,onCreated没有被调用。 - live-love
混乱的是...默认启动模式的文档中写道:"系统总是在目标任务中创建活动的新实例,并将意图路由到它。" - Jeffrey Blattman
就是这样!我在重构期间删除了我的finish()命令。谢谢! - C13

3
这与该问题无关,但当活动未在清单文件中声明时也可能发生此情况。

2
请注意,如果您的方法属于AppCompatActivityActivity,那么取决于您在类中实现的内容。

如果您想添加生命周期或任何重写方法,我建议您按CTRL+O或执行Code > Override methods,然后您可以看到该方法所属的位置。

演示目的的截图 - Android Studio的“要覆盖的方法”对话框


2

从清单中移除android:launchMode ="singleTask"

最初的答案


1

你应该重写 onCreate 方法并在其中添加 super.onCreate()

@Override
public void onCreate(Bundle savedState)
{
   super.onCreate(savedState);

   Log.d("SimpleActivity","OnCreate Started");
   setContentView(R.layout.simple);
   Log.d("SimpleActivity","OnCreate Ended");
}

1

我的情况

(1) mainActivity -> (2) 打开适配器 - startActivity -> (3) mainActivity onCreate() 没有被触发。

我通过在 mainActivity 中添加 finish(); 解决了这个问题。

按照以下步骤检查您的应用程序。

1. 您是否覆盖了正确的方法?如果没有覆盖下面的方法,当您启动 startActivity 时,将会触发该方法。

protected void onCreate(Bundle savedInstanceState) { 
   super.onCreate(savedInstanceState);

2. 确保在manifest.xml中注册了该活动。

2.1 您的活动是否具有android:launchMode="singleInstance"? (如果您的应用程序不需要singleinstance,请考虑删除。 但在我的情况下,我需要singleinstance。因此我转移到了下一步)

  1. use finish()

     public void openSearch(View view) {
     Intent intent = new Intent(this, BookInfoActivity.class);
     intent.putExtra(...);
     startActivity(intent);
     finish(); // add like this.}
    
为什么我们需要使用“finish()”方法?

屏幕A -> 在A上点击按钮 -> 屏幕B -> 在B上点击按钮 -> 屏幕A显示从屏幕B获取的一些新数据。

如果您不调用A按钮中的finish()方法,则表示A仍在后台,即使您正在查看屏幕B。

因此,当您在屏幕B上触发startActivity时,它只会简单地显示运行中的A屏幕。

但是,如果您使用finish()方法(在A按钮中),当您进入B屏幕时,它会销毁A屏幕,因此当您通过点击B方法('StartActivity')返回A屏幕时,它会创建A屏幕并触发onCreate()方法。


0
你需要调用 super.onCreate(savedState) 方法。请查看 Activity doc
 public void onCreate(Bundle savedState)
    {
     super.onCreate(savedState);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接