2

onCreate メソッドで Init 関数が呼び出されるアクティビティがあります (この関数は、多くの要素と openSLES オーディオ API への呼び出しを含むネイティブ コードを呼び出します)。要点は、この Init 関数が再度呼び出されたときにアプリをクラッシュさせることです。これは、画面の回転時、または [戻る] ボタンを使用してアクティビティを閉じて再度起動したときに発生します (ただし、その間にプロセスが強制終了された場合、問題はありません)。 )。Init 関数の動作を変更できません。

アクティビティが破棄されたときにプロセスが強制終了されないことがわかりました。ドキュメントを読んだ後、これを期待していました。オーディオ信号が再生されている場合、アクティビティが破棄された後も再生が継続されるため、これは良いことです。私の目的に適しています。

onSaveInstanceState を使用して初期化状態のチェックを実行しようとしましたが、onSaveInstanceState が呼び出されたときの画面の回転でのみうまく機能します。[戻る] ボタンを押してもコールバックが呼び出されません。

そこで、onPause で状態保存を行い、Shared Preferences を使用しようとしました。しかし、この時点で私は反対の問題を抱えています: プロセスが強制終了された場合、共有設定の値は保持されますが、その場合、アプリが正しく動作するためには Init を再度実行する必要があります。

プロセスの強制終了後にアクティビティが作成されたかどうかを確実に知る方法が必要だと思いますが、現時点では方法がわかりません。onPause メソッドで bundle インスタンスを使用することを考えましたが、これが可能かどうか、およびその方法がわかりません。どんな種類のヒントも本当にありがたいです。

4

3 に答える 3

1
  1. プロセスの pid を共有設定に保存できます。YourActivity.onCreate で現在の pid と保存されている pid を比較すると、いつ OpenSLES を初期化する必要があるかを判断できます。
  2. YourApplication.onCreate の Application 派生クラスで OpenSLES を初期化できます。一度だけ呼び出されます。

編集:

つまり、次のクラスを宣言します。

public class YourApplication extends Application {
  static private native synchronized void InitOpenSLES();

  public YourApplication() {}

  // see http://developer.android.com/reference/android/app/Application.html#onCreate() for details
  @Override
  public void onCreate() {
    super.onCreate();
    InitOpenSLES();
  }
}
于 2012-04-23T17:21:12.000 に答える
0

この問題には簡単な解決策があります。これを実現するために、SharedPreferencesに保存する必要はありません。静的(クラス)変数を使用するだけです。このような:

public class Globals {
    public static boolean initialized = false;
}

クラスがロードされると、変数initializedはfalseに設定されます。1回だけ。次に、コードで次のように変数を確認して設定します。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Initialize (but only once per process)
    if (!Globals.initialized) {
        init(); // Call init function that does things one time per process
        Globals.initialized = true; // Remember we are initialized so we don't
                                    //  do it again
    }
    ...
}

すべてのアクティビティが終了した場合でも、OSがプロセスを強制終了しないinitialized場合、アプリケーションを再度起動すると、変数は「true」のままになります。OSがプロセスを強制終了すると、次にアプリケーションが起動して新しいプロセスが作成されたときに、変数が「false」に設定されます。

于 2012-06-13T14:56:13.300 に答える
0

プロセスごとに、pidまたはプロセスIDがあります。init 関数では、スレッド ID を簡単に取得して、任意の整数値で保存できます。

Thread.currentThread().getId()));

アクティビティが再開するたびに、スレッド ID が同じか異なるかを確認してください。スレッド ID が異なる場合は、関数 init 関数を呼び出します。それ以外の場合は、既に行っています。

于 2012-04-23T17:07:20.973 に答える