3

私は最初の Android アプリをプログラミングしますが、Android 開発 (および Java) は初めてです。私は PreferenceActivity を持っていて、アクティビティが表示され、モバイルをオフにすると、その onCreate() がもう一度呼び出されることに気付きました。さらに紛らわしいのは、静的メンバーMyFirstAppActivity.cameraがもう存在しないため、例外が発生することです。そこにnullのチェックを入れることができますが、なぜこれが起こっているのだろうか、それを回避する最善の方法は何ですか?

public class SettingsActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

     // Root
        addPreferencesFromResource(R.xml.preferences);

        // get list of available resolutions

        Object[] previewSizes = MyFirstAppActivity.camera.getParameters()
                .getSupportedPreviewSizes().toArray();

        // split object properties into two arrays

        String[] ps=new String[previewSizes.length];

        for(int i=0;i<previewSizes.length;i++)
        {
            try
            {
                int width=((Size)previewSizes[i]).width;
                int height=((Size)previewSizes[i]).height;
                ps[i]=width+"x"+height;
            }
            catch(Exception ex)
            {}
        }

        // get list of available resolutions

        Object[] recordingSizes = MyFirstAppActivity.camera.getParameters()
                .getSupportedPictureSizes().toArray();

        // split object properties into two arrays

        String[] rs=new String[recordingSizes.length];

        for(int i=0;i<recordingSizes.length;i++)
        {
            try
            {
                int width=((Size)recordingSizes[i]).width;
                int height=((Size)recordingSizes[i]).height;
                rs[i]=width+"x"+height;
            }
            catch(Exception ex)
            {}
        }

        Preference prefPreviewSizes = getPreferenceManager().findPreference("previewSizes");
        Preference prefRecordingSizes = getPreferenceManager().findPreference("recordingSizes");

        ((ListPreference) prefPreviewSizes).setEntries(ps);
        ((ListPreference) prefRecordingSizes).setEntries(rs);

    }
}
4

2 に答える 2

1

Android のライフサイクル情報を確認することをお勧めします。

物事を少し良くするために、アクティビティを変更したり電話を回転させたりするたびに呼び出されるため、 とonPauseを実装する必要があります。onResumeモバイルの電源を切るということは、電源を切るのではなく、ロックすることを意味すると思います。その場合、onCreate携帯電話がバッテリーを節約するためにアクティビティ スタックをクリーニングしているために呼び出される可能性があります。

いずれにせよ、すべてのイベント リスナをonCreateメソッドに追加する必要がありますが、表示されている情報に関連するものはすべてメソッドに追加する必要onResumeがあります (また、 の実行中に情報や状態を保存する必要がありますonPause)。このようにして、アプリケーションの状態が変化するたびに、インターフェースは常に最新のデータを表示します。(EditText とすべての標準ウィジェットはデフォルトで現在の状態を保存しますが、それと異なるものは慎重に考慮する必要があります)。その中にそのカメラを置くことができます。

cameraPS:これが役立つかどうかはわかりませんが、その変数を別のクラス、おそらくSingleton内に配置したい場合があります。複数のアクティビティに関連する情報をアクティビティに格納すると、Android 環境では奇妙に見える場合があります。シングルトンを使用するcameraと、どこで呼び出しても常にアクセスできるようになります (最初に初期化する必要があります)。カメラへの参照を保持する基本的なアクティビティを拡張することもできます。これにより、この変数を必要とするすべてのアクティビティが直接アクセスできるようになります (ただし、これにより、アプリケーションの処理が少し増加します)。繰り返しますが、これは私がこの変数にどのように直面するかについてのアドバイスにすぎません。必ずしも問題の解決に役立つとは限りません。

于 2012-08-09T21:28:35.113 に答える
0

ある種の状態変化(たとえば、画面をオフにしたり回転させたりする)が発生するたびに、onCreateメソッドが呼び出されます。

onSaveInstanceStateメソッドをオーバーライドしてデータをバンドルに保存し、バンドルとしてoutState渡されることは間違いありません 。onCreatesavedInstanceState

詳細については、Androidデベロッパーセンターの「ランタイム変更の処理」をご覧ください。

カメラを作成する前に存在するかどうかを確認することで、カメラが例外を引き起こさないようにすることができる場合があります。

if(MyFirstAppActivity.camera == null)
    MyFirstAppActivity.camera = new Camera(...);

または、で新しいインスタンスを作成するだけですonCreate

于 2012-08-09T21:16:41.730 に答える