質問:
ターゲットが構成 (画面サイズ、向きなど) に依存する可能性がある場合に、何を起動するかを決定する方法Activity
。s?Notification
を使用する場合によくあることです。Fragment
詳細:
s を使用して、複数の画面サイズと向きで適切に再生されるアプリを作成する方法を示すNewsReader サンプルについて考えてみましょう。Fragment
このアプリは次のように構成されています。
- A.
HeadlinesFragment
_ - アン
ArticleFragment
。 - 「メイン」アクティビティ (
NewsReaderActivity
)。デュアル ペイン モードでは、このアクティビティには両方のフラグメントが含まれます。単一ペイン モードでは、HeadlinesFragment
. - アン
ArticleActivity
。このアクティビティは、シングル ペイン モードでのみ使用されます。が含まれていArticleFragment
ます。
ここで、このアプリを拡張してService
、ニュースの更新をリッスンし、新しいニュース項目があるたびにステータス バー通知を介してユーザーに通知するバックグラウンドを追加するとします。合理的な要件リストは次のようになります。
- 複数のニュース更新がある場合、通知をクリックすると、ユーザーは常にヘッドライン リストに移動する必要があります。
- 更新が 1 つしかない場合は、通知をクリックすると、最新のニュース記事が開きます。
これらの要件は、現在の構成に応じて異なるターゲット アクティビティに変換されることに注意してください。特に、
- 要件 (1) いずれかのモードで =
NewsReaderActivity
. - 要件 (2) デュアルペイン モード =
NewsReaderActivity
. - 単一ペイン モードでの要件 (2) =
ArticleActivity
。
上記の (2) と (3) を達成するエレガントな方法は何でしょうか? 現在の構成をService
調査して、PendingIntent
.
私が考えた 1 つの解決策は、(2) をスキップして (3) を常に実行することでした。つまり、ArticleActivity
ニュース更新が 1 つしかない場合は常に起動します。ArticleActivity からのこのスニペットは有望に見えました:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
//...
// If we are in two-pane layout mode, this activity is no longer necessary
if (getResources().getBoolean(R.bool.has_two_panes)) {
finish();
return;
}
//...
//...
}
ArticleActivity
このコードは、 を表示している場合に、不要になった構成に切り替えることを保証します (たとえば、縦向きから横向きへ)。その後、アクティビティは単純に閉じます。
ただし、インテントにはFLAG_ACTIVITY_NEW_TASK
フラグが設定されているため、これは私たちの場合には機能しません。新しいタスクを作成し、スタックに「前の」アクティビティはありません。したがって、呼び出しfinish()
はスタック全体をクリアするだけです。
では、起動するアクティビティが画面構成に依存する場合、通知から起動するアクティビティをどのように決定するのでしょうか?