2013-03-14 86 views
5

在正常的开发过程中,我注意到特定的活动在第二次调用时似乎停止了响应。onResume()未被第二次调用活动

menu->(intent)->activity->(back button)->menu->(intent)

没有什么在logcat的相关性。

我甚至不知道从哪里开始调试这也不是什么代码,所以这里显示是onClickonResume片段:

if (!dictionary.getClassName().equals("")) { 

      this.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 

        Intent i; 

        i = new Intent(mContext, NVGlobeNavigatorVC.class); 
        i.putExtra("PAGE_TITLE", title); 
        i.putExtra("TITLE", _dictionary._title); 

        mContext.startActivity(i); 

      }); 
     } else { 
      findViewById(R.id.greaterthan).setVisibility(View.GONE); 
     } 

,并在活动正在展开:

@Override 
protected void onResume() { 

    super.onResume(); 

    ... 

清单中没有任何异常:

<activity 
    android:name=".NVViews.NVGlobeNavigatorVC" 
    android:theme="@style/WindowTitleBackground" 
    android:label="GlobeNavigator"/> 

对于clar ity,我在mContext.startActivity(i)super.onResume()上设置了断点。我点击onClickListener的视图,并且两个断点均按预期击中。然后按下返回按钮,返回到菜单。按预期调用onPause()

我触摸视图以再次启动该活动,并且目标活动中的startActivity中的断点被击中,但不在onResume()中。屏幕变黑,我可以重新开始的唯一方法就是重新启动应用程序。如果我暂停调试器,它暂停在dalvik.system.NativeStart(),这意味着该活动永远不会重新启动。

我不认为它是相关的,但我使用Intellij IDEA并删除了所有的输出目录,使缓存失效并完成了重建。

目标API是8.我已经测试过2.3和4.0.4。

任何想法?我很难过。

[编辑]

在,我一些东西保存到首选项。的onResume()目的是为了再次让他们:

@Override 
protected void onPause() { 

    super.onPause(); 

    SCPrefs.setGlobeViewViewPoint(globeView.getViewPoint()); 
    SCPrefs.setGlobeViewZoom(globeView.getZoom()); 
    SCPrefs.setGlobeViewScale(globeView.getScale()); 

    } 
+0

是否正确地调用了第二个活动的oncreate? – stinepike 2013-03-14 22:01:45

+0

@StinePike如果'Activity'在后台不应该被调用。你重写'onPause()'并在那里做任何事情? – codeMagic 2013-03-14 22:02:37

+0

@StinePike它没有被调用,但我不期望它是因为它在堆栈的顶部,Android不太可能会破坏我的活动。 – Simon 2013-03-14 22:07:01

回答

4

我发现这个问题,这是一个有点深奥。

我有一个很大的静态数据结构,它被加载到一个类的静态初始化程序中。如果数据结构仍然被加载,则该初始化程序中存在一个错误,导致无限循环第二次被调用。

因为该类在我的Activity中被引用,所以类加载器在调用onCreate()onResume()之前加载它。

该循环给出了活动加载器已挂起的外观。

+0

我很高兴你明白了。 – HalR 2013-03-20 21:04:59

+0

所以,你究竟是否解决了这个问题,因为我有完全相同的问题。 – Rouz 2014-10-16 19:57:34

+0

@Rouz正如我所说。静态初始化程序中存在一个导致无限循环的错误。我修复了这个错误,然后它全部奏效了。关键是在onCreate()之前调用类加载器。 – Simon 2014-10-19 11:19:55

3

此代码:

i = new Intent(mContext, NVGlobeNavigatorVC.class); 

创建一个新的意图。意图是类NVGlobeNavigatorVC.class

如果您只需调用一次,就会创建一个新的活动,我们称之为“iTheFirst”。如果您退出活动,它会在“暂停”时执行。当您再次运行上面的代码时,您将创建另一个同一类的新活动,但具有不同的活动性。因此它不会恢复你的其他活动,而是创建一个我们可以称之为“iTheSecond”的新活动。它看起来就像iTheFirst,但是很独特。

如果您想恢复上述操作,退出之后,您需要在菜单中保留对其的引用。然后,在您的onClick中,查看该活动是否存在,如果不存在,则创建一个新活动并开始活动,如果活动存在,则恢复活动。

这里是记住并重新启动活动的样本活动:

Intent savedCueCardActivity = null; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState, R.layout.landing); 
} 

public void goToNextScreen(View v) { 
    if (savedCueCardActivity == null) { 
     savedCueCardActivity = new Intent().setClass(this, CueCardActivity.class); 
     startActivity(savedCueCardActivity); 
     //  lastActivity.finish(); 
    } else { 
     savedCueCardActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     startActivity(savedCueCardActivity); 
    } 
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 
} 
+0

我知道所有这一切。请阅读这个问题。我不希望与同一个实例一起工作。无论第二次启动Activity是否是同一实例,新实例还是第40个实例,我仍然期望onResume被调用。哦,并且我的应用程序不会挂起;) – Simon 2013-03-15 06:11:30

+0

要更加清楚,应在每个可能的情况下调用“onResume()”。此外,我的问题是,应用程序挂起,显然在DVM中,没有任何相关的logcat。如果我不做调试就离开它,我最终会得到一个ANR,因此主线程已停止响应。 – Simon 2013-03-15 07:55:07

+0

对不起您的深层问题。你对你的问题的评论让我相信你认为你已经恢复了原来的活动。因为我知道每次创建新活动时都会得到一个onCreate(),就像您在使用i = newIntent时所做的那样。这个问题对我深入挖掘活动生命周期非常有用,所以我真的很感激它。 另一个建议 - 在调用onCreate()之前,初始化发生在活动中。你在那里做什么奇怪的事情?你有没有覆盖onCreate看到它叫? – HalR 2013-03-15 17:17:56

相关问题