1

私の Android アプリには 2 つのアクティビティがあります。Java で記述された FrontEnd と、NativeActivity であるゲームです。Android NDK サンプル (samples\native-activity\jni\main.c) を参考にして、ゲームのメイン C++ モジュールを作成しました。ユーザーが Game から FrontEnd に戻りたい場合は、 を呼び出しますANativeActivity_finish(g_state->activity)。その後、私が観察したことは次のとおりです。

  1. APP_CMD_TERM_WINDOWengine_handle_cmdコールバックに入る
  2. 私は電話で反応しengine_term_displayます(サンプルのように)
  3. FrontEnd アクティビティが表示されます。そして、「プレイ」ボタンを押すと、ゲームが再び起動しますが、待ち続けます....
  4. APP_CMD_STOPengine_handle_cmdコールバックに入る
  5. APP_CMD_DESTROYengine_handle_cmdコールバックに入る
  6. if (state->destroyRequested != 0)main.cpp のメインループで発火
  7. サンプルと同じように、android_main戻ります。ようやく、安全にゲームを再開できるようになりました...

ステップ 3 と 4 の間の時間間隔が約 10 秒であることを強調したいと思います (少なくとも DEBUG モードでは)! また、ステップ 3 と 4 の間でフロントエンドからゲームを再起動すると、新しいアクティビティではなく「瀕死の」アクティビティが開始されます。

APP_CMD_TERM_WINDOW と APP_CMD_STOP の間で何が起こっているのか、なぜそんなに時間がかかるのかわかりません。同じアーキテクチャの別のアプリがあり、ステップ 3 と 4 の間で約 0.3 秒かかります。最初のアプリで GC にもっと多くの仕事があるかもしれません...わかりません。だから私の質問は:

  1. NativeActivity が終了プロセスを完了するのに非常に時間がかかるのは正常ですか?
  2. ユーザーがフロントエンドからゲームを再起動したときに、ダイイング アクティビティが発生しないようにするにはどうすればよいですか?

アップデート

私はLogCatに入ります:

05-29 18:27:17.729: W/ActivityManager(476): 起動タイムアウトが期限切れになり、ウェイク ロックが放棄されました! 05-29 18:27:17.739: W/ActivityManager(476): ActivityRecord{4209b2d0 u0 blah.blah.MainActivity} のアクティビティ アイドル タイムアウト

ステップ3と4の間です。

グーグルで調べたところ、このメッセージは「危険ではない」と見なされていることがわかりましたが、何か説明できるでしょうか?

4

1 に答える 1

0

その理由は、FrontEnd アクティビティが onGlobalLayout をリッスンする無限ループにあったためです。ANR ではありませんが、UI スレッドに大きな負荷がかかります。そのため、Android は約 1 秒待ちました。10 秒でゲーム アクティビティを終了します。

于 2013-05-29T16:39:39.753 に答える