2013-03-14 16 views
5

通常の開発過程で、特定のアクティビティが呼び出されたときに応答を停止したように見えました。アクティビティが起動されたときにonResume()が再度呼び出されない

すなわちmenu->(intent)->activity->(back button)->menu->(intent)

logcatで関連するものは何もありません。

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); 
     } 

と起動され活動中:

私もこれをデバッグを開始する場所もそうここに示すために、どのようなコードを知らないがonClickonResume断片である

@Override 
protected void onResume() { 

    super.onResume(); 

    ... 

珍しいことはありません。

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

私はmContext.startActivity(i)super.onResume()にブレークポイントを設定しました。 onClickListenerでビューをクリックすると、両方のブレークポイントが期待通りにヒットします。私はメニューに戻ってくる戻るボタンを押します。 onPause()が期待通りに呼び出されます。

ビューをタッチして再びアクティビティを起動すると、startActivityのブレークポイントはヒットしますが、ターゲットアクティビティのonResume()には表示されません。画面が黒くなり、もう一度やり直すことができるのは、アプリを再起動することだけです。デバッガを一時停止すると、dalvik.system.NativeStart()で一時停止します。これは、アクティビティが再起動されないことを意味します。

私はIntellij IDEAを使用していますが、すべての出力ディレクトリを削除し、キャッシュを無効にして完全に再構築しました。

ターゲットAPIは8です。私は2.3と4.0.4でテストしました。

アイデア?私は困惑している。

[EDIT]

で、私は環境設定にいくつかのものを保存します。 onResume()の目的は、再びそれらを得ることです:

@Override 
protected void onPause() { 

    super.onPause(); 

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

    } 
+0

は、第2アクティビティのoncreateが正しく呼び出されていますか? – stinepike

+0

@StinePike 'Activity'がバックグラウンドにある場合、呼び出されるべきではありません。 'onPause()'をオーバーライドしてそこに何かするのですか? – codeMagic

+0

@StinePikeこれは呼び出されていませんが、スタックの最上部にあり、Androidが自分の活動を破壊することはないと思われます。 – Simon

答えて

4

私は問題を発見し、それは少し難解です。

私はクラス静的初期化子にロードされる大きな静的データ構造を持っています。データ構造がまだロードされていた場合に、2回目に呼び出された初期化子にバグがあり、無限ループが発生しました。

アクティビティでそのクラスが参照されているため、クラスローダーはonCreate()またはonResume()が呼び出される前に読み込んでいます。

ループは、アクティビティローダーがハングアップしているように見えます。

+0

あなたはそれを理解してうれしいです。 – HalR

+0

私は正確に同じ問題があるので、正確にこの問題を解決しました。 – Rouz

+0

@ルーズ私が言ったように。無限ループを引き起こしていた静的イニシャライザにバグがありました。私はバグを修正し、それはすべて働いた。重要な点は、クラスローダーがonCreate()の前に呼び出されることです。 – Simon

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

私はこれをすべて知っています。質問をお読みください。私は同じインスタンスで働いているとは思っていません。 2回目のアクティビティの起動が同じインスタンスか、新しいインスタンスか、40番目のインスタンスかどうかにかかわらず、私はまだonResumeを呼び出すことを期待しています。ああ、私のアプリケーションがハングしないように); – Simon

+0

さらに明確にするために、 'onResume()'はフォアグラウンドに来るアクティビティのあらゆる可能な状況で呼び出されるべきです。また、私の問題は、アプリケーションがDVMにはっきりとハングすることです.logcatには何も関係ありません。私はデバッグせずにそれを残して、私は最終的にメインスレッドが応答を停止したので、ANRを取得します。 – Simon

+0

あなたの深い疑問に同期して申し訳ありません。あなたの質問に対するあなたのコメントは、あなたが元の活動を取り戻していると思ったと信じてくれました。あなたがi = newIntentでやっているように、新しいアクティビティを作成するたびにonCreate()を取得することがわかっています。この質問はアクティビティのライフサイクルを深く掘り下げてくれて本当にうれしく思いました。本当に感謝しています。 もう1つの提案 - onCreate()が呼び出される前に、アクティビティで初期化が行われます。そこに何か変なことをしていますか?あなたはそれを呼び出すために上書きしましたか? – HalR

関連する問題