2011-11-29 12 views
10

私のアプリでは、メディアファイルを再生し、ユーザーが画面を回転させて(アクティビティを破棄しても)再生を続けたいが、ユーザーが別のアクティビティに移動したり別のアクティビティが表示された場合これは、何でも、バックボタンを押します。Froyoで設定変更が発生したことをどのように伝えますか?

これはHoneycombにはAPIがあると思いますが、Android 2.2で動作するものが必要です。

多くの作業や潜在的なバグのように聞こえるコンフィギュレーションの変更をすべて処理するためにonConfigurationChangedを使用するのではなく、onRetainNonConfigurationInstance()の問題はonStopの発生後まで実行されないということです - ただし、onPauseは、適切な場合、メディアを一時停止する論理的な場所です。

onPauseには、設定が変更されたためにアクティビティが一時停止されているかどうかを確認する方法はありますか?

答えて

9

解決策には少なくとも1つの潜在的な問題があります。 Androidのドキュメントによると

一部のデバイス構成が実行時に変更することができます(たとえば、画面の向き、キーボードの可用性、および言語など)。このような変更が発生すると、Androidは実行中のアクティビティを再起動します(onDestroy()が呼び出された後にonCreate()が呼び出されます)。

ローテーションの変更のテストでは、1つのケースのみが処理されます。これが構成変更の最も一般的な原因である可能性が高いので、これは問題ない解決策です。しかし、あなた自身が設定を処理するオーバーヘッドなしに、既存の、または将来のバージョンのAndroidに追加されたすべてのケースを処理できたらどうでしょうか?

onRetainNonConfigurationInstanceに更新されました。

新しい設定に対して新しいインスタンスがすぐに作成されることがわかっている場合、設定の変更によってアクティビティが破棄されるため、システムによって呼び出されます。

また、メディアを停止した後に起こるようにsuper.onDestroy()にチェーンを変更しましたが、それについては完全にはわかりません。メディアの中断が何を意味しているのか、メディアの中断時に破壊がどのような影響を及ぼすのかによって異なります。

private Boolean mConfigurationChange = false; 

public Object onRetainNonConfigurationInstance() { 
    mConfigurationChange = true; 
    return null; 
} 

public void onDestroy() { 
    if (!mConfigurationChange) { 
     // Code to stop media file goes here. 
    } 
    super.onDestroy(); 
}  
+1

興味深い考え方、ジュリアン、詳細な例に感謝します。アンドロイド:configChanges = "オリエンテーション"をマニフェスト内の関連するアクティビティに追加すると、それは効果を発揮しますが、期待通りの効果はありません。 onConfigurationChangedは発火しますが、onPause/onStop/onDestroyは呼び出されません。それは、「画面を回転させるとアクティビティを破壊する」という問題を回避する方法の1つですが、Googleが推奨する方法ではありません。しかし、ありがとう! –

+0

更新された回答を参照してください。マニフェストへの変更やonDestroy()の呼び出されたままではありません。 –

+1

新しい答えがうまくいくようです! OnRetainNonConfigurationInstanceはonStopの後でonDestroyの前に起動し、このコードonDestroyを使用すると、設定変更のためにシャットダウンするかどうかを正確に判断できます。ありがとう! –

0

ACTION_CONFIGURATION_CHANGEDインテントをリッスンし、設定変更による一時停止を示す内部フラグを設定することができます。

時間内にインテントを受信するか、おそらく非同期であるため、時間内に到着することが保証されるかどうかはわかりません。しかし、試してみる価値があるかもしれません。

2

私はついに自分の質問に対する答えを見つけました!

public class MyActivity extends Activity { 

    Display display; 
    int originalRotation; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
     originalRotation = display.getRotation(); 
    } 

    public boolean endingDueToConfigurationChanging() { 
    int newRotation = display.getRotation(); 
    return (newRotation != originalRotation); 
    } 
} 

Display.getRotation()は、デバイスがその天然の回転OFF 0、90、180、または270度であるかどうかを示す定数を返すように設計されています。しかし、デバイスが回転すると、この値はアクティビティが終了する前に更新されます。実際にはonPause()のように早く更新されます!したがって、onPause()(新しい値)の値とonCreate()(元の値)の値を比較すると、画面の回転によってアクティビティがシャットダウンするかどうかを知ることができます。

+0

「endingDueToConfigurationChanging」は何を使用していますか?私はおそらく、これはAPIのAndroidコールの一部だと思っていました。もしあなたがfalseを返すと、それは結局終わらないでしょうが、明らかにそうではありません。 – Michael

+0

これは5年前、いくつかの企業が前に...私は分かりません。私は、間違って、endingDueToConfigurationChangingを呼び出すいくつかのコードを削除したと思います。しかたがない。今より良い答えがあります。 –

0

場合によってはView#onConfigurationChangedを試してみることもできます(メディアプレーヤーのビューがあり、そのビューを参照することができます)。

+0

答えがiLateですが、元の質問で述べたように、onConfigurationChangedを使用するとAndroidの回転処理を自分のコードに置き換えることになります。レイアウトなどを手動で変更する必要があります。構成が変化しているかどうかを知るという私の単純な目標のために行うべき多くの作業。 –

+0

View#onConfigurationChangedではなくActivity#onConfigurationChangedをオーバーライドするように指示しています。このメソッドは、のたびに、の前に呼び出されます。マニフェストファイルで指定した内容に関係なく、設定変更後にアクティビティが再作成されます。 – asenovm

+0

完全な例が私の理解を助けるかもしれません。カスタムViewクラスを作成し、そこにonConfigurationChangedをオーバーライドすることを提案していると思いますか?マニフェストの関連するアクティビティにandroid:configChanges = "orientation"を追加してからonPause/onStop/onDestroyを呼び出さない限り、動作しません。しかし、ありがとう。 –

6

ハニカムの前に、受け入れられた答えに記載されているようなonRetainNonConfigurationInstance()がこれを行うための最善の方法です。ハニカムを皮切り

、それは非推奨が、はるかに簡単な方法があります:あなたのonPause()/onStop()/onDestroy()のいずれかの間に、代わりにisChangingConfigurations()を呼んで。

は最後に、前のハニカムにサポートライブラリFragmentActivity( android.support.v4.app.FragmentActivity)を使用している場合、onRetainNonConfigurationInstance()は最終的に宣言されていますが、同じ効果のために代わりにonRetainCustomNonConfigurationInstance()を上書きすることができます。

関連する問題