-1

基本的に、私のアプリには 2 つのアクティビティがあります。「A」と「B」と言ってください。A が B を起動します。

アクティビティ B は (サービス内で) 音楽を再生し、通知も行います。

ビューがアクティビティBにあり、戻るボタンを押して通知をクリックすると、アクティビティBが開かれ、アクティビティの状態が完全に失われ、音楽も停止します(望ましくない)......私は作っています戻るボタンを押すとアクティビティが明示的に破棄されるため、そのビューをプログラムで復元する必要があると思いますか??

最初に頭に浮かぶのは、 onSavedInstanceState を使用することです

しかし、ユーザーが戻るボタンを押したときに onSavedInstanceState が呼び出されないため (私はドキュメントでそれを読んだ)、それは役に立たないので、私の代替手段は何ですか??

4

2 に答える 2

1

あなたが書いたように、アクティビティが破棄されて再作成されるため、 onSavedInstanceState は役に立ちません。アプリのライフサイクルでアクティビティの状態を保存する必要がある場合は、データを外部 (データベースなど) に保存する必要があります。小さなデータの場合は、共有設定を使用できます。

于 2013-11-14T21:40:50.110 に答える
1

最も簡単な方法は、データを に保存しonPause()、 に復元することですonResume()。次の質問は、データをどこに保存するかです。それを行ういくつかの方法があります:

  1. カスタム アプリケーション コンテキストの使用

クラスを拡張android.app.Applicationしてマニフェスト ファイルに登録するには、次のようにします。

<application android:name="your.application.class" ...

これにより、`Context.getApplicationContext() を呼び出して、クラスのシングルトン インスタンスを取得できます。

作成できる例については、

public class MyContext extends Application {
Bundle mySavedData = null;

public void setSavedData(Bundle data){
    mySavedData = data;
}

public Bundle getSavedData() {
    return mySavedData;
}
}

そして、このように使用します

@overide
public void onResume(){
    ...
    Bundle state = ((MyContext) getApplicationContext()).getSavedData();
    if(state != null) {
        /* restore states */
    }
    ...
}

@overide
public void onPause(){
    ...
    Bundle state = new Bundle();
    ...
    /* save your data here and save it into the context or set null otherwise*/
    ((MyContext) getApplicationContext()).setSavedData(state);
    ...
}
  1. シングルトン パターンの使用

コンテキストを定義する代わりに、シングルトン インスタンスを作成できます

public class MySingleton {
    static MySingleton instance;

    public static MySingleton getInstance() {
        if(instance == null){
            instance = new MySingleton();
        } 
        return instance;
    }

    public Bundle mySavedData = null;
    void setSavedData(Bundle data){
        mySavedData = data;
    }

    public Bundle getSavedData() {
        return mySavedData;
    }
}

そしてあなたはそれを使うことができます

@overide
public void onResume(){
    ...
    Bundle state = MySingleton.getInstance().getSavedData();
    if(state != null) {
        /* restore states */
    }
    ...
}

@overide
public void onPause(){
    ...
    Bundle state = new Bundle();
    ...
    /* save your data here and save it into the context or set null otherwise*/
    MySingleton.getInstance().setSavedData(state);
    ...
}

アプリケーションが強制終了されると、コンテキストとシングルトンが破棄されることに注意してください。アプリケーションドキュメントフォルダーまたはデータベースを使用するよりもデータを永続的に保存したい場合は、お勧めしますが、それはあなたが探しているものではないと思います.

これがお役に立てば幸いです....

于 2013-11-14T21:33:16.857 に答える