1

私のコードは、小規模および大規模なデバイス (Motorola Xoom、Samsung Galaxy Player 4.0、Kyocera Digno) で期待どおりに動作しますが、Samsung Galaxy Tab 7.0 では、ACTION_IMAGE_CAPTUREインテントを起動して写真を撮った後、アプリが返されたときにonDestroy()が呼び出され、その後に , が続きonCreate()ます。 then onActivityResult()が呼び出され、最後にonDestroy()andonCreate()が再度呼び出されますが、これはもちろん望ましくありonActivityResult()ません。

可能性のある手がかり:

  • Galaxy Tab 7.0 の画面サイズはマニフェスト ファイルで明示的にサポートされていません (サポートされていない画面サイズでテストしたデバイスはこれだけです)。 . どちらの UI も同じ (悪い) 動作をします。
  • 写真をプレビューすると、カメラ アクティビティの向きが切り替わるようです。私のアプリはポートレート モードのみをサポートします (編集:小さい画面では - 非特大画面では、向きの変更をサポートします)。向きの変化が私の活動を何らかの形で破壊しているのかもしれません。
  • 別のインテント (電子メール インテント) から起動して戻ることを試みましたが、その場合、アプリは破棄されず、再作成されません。

詳細情報やコード サンプルが必要な場合はお知らせください。

編集:問題は向きの変更に絞り込まれました。Karthikの回答によると、設定android:configChanges="orientation"により問題が修正されます。唯一の問題は、私のアプリが特大画面での向きの変更をサポートしていることです。この設定は、これらのデバイスでこの機能を壊します。android:configChanges="@string/config_changes"画面サイズに応じて異なる文字列を使用して提供しようとしましたが、「インストール エラー: INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION」が表示されます。これによると、Android アクティビティ、マニフェストの android:configChanges を Java コードでオーバーライドする方法は? 、プログラムで設定する方法はありません。アプリですべての向きの変更を手動で処理する唯一のオプションはありますか?

4

2 に答える 2

3

アプリが再起動する理由は、カメラアプリの起動時にデバイスのメモリが不足し、OSがメインのアクティビティをリサイクルしたためであることがわかりました。フラグメントベースのレイアウトがonCreate()あり、savedInstanceStateに関係なく、フラグメントの初期化がで行われていたことを除いて、これは問題にはなりません。これにより、フラグメントの自動復元が破棄され、実際には復元しようとしていたときに、アプリが最初から再起動しているように見えました。

元:

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

    // add main menu -- WRONG!
    MainMenuFragment mainMenu = new MainMenuFragment();
    FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
    ft.add(R.id.contents, mainMenu);
    ft.commit();

    if (savedInstanceState != null) {
        // <restore state>
    }
    else {
        // <initialize stuff>
    }
}

これを修正するために、savedInstanceStateがnullでない場合にフラグメントの初期化をスキップし、状態がに正しく保存されonSaveInstanceState()て復元されていることを確認しonCreate()、の通常の処理を実装しましたonActivityResult()

元:

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

    if (savedInstanceState != null) {
        // <restore state>
    }
    else {
        // <initialize stuff>

        // add main menu -- CORRECT!
        MainMenuFragment mainMenu = new MainMenuFragment();
        FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
        ft.add(R.id.contents, mainMenu);
        ft.commit();
    }
}
于 2012-04-17T23:55:37.273 に答える
3

そうです、それは向きの変化によるものです。カメラは、Galaxy タブのランドスケープ モードで動作します。そのため、マニフェスト ファイルのタグに
追加できます。android:configChanges="orientation"<activity>

これで問題は解決します。onDestroy()カメラから戻っても呼び出されonCreate()ません。

于 2011-12-22T04:15:41.100 に答える