次のように、アプリのHelpActivityからGooglePlayを起動します。
Uri uri = Uri.parse("market://search?q=pub:\"Some Developer\"");
Intent playIntent = new Intent(Intent.ACTION_VIEW, uri);
playIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY
| Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(playIntent);
このコードを実行する直前に、手動でGoogle Playに入り、最初のページから[アプリ]を選択してから、現在機能しているアプリ(この場合はPandora)を選択します。これにより、Google Playの内部にスタックが確立され、GooglePlayの内部で押すと[戻る]ボタンが戻ります。
上記のコードを実行すると、Google Playが表示され、期待どおりに一部の開発者のアプリケーションのリストに移動します。
問題は、[戻る]ボタンを押すと、Google Playスタックに戻り、Pandoraにアクセスし、次にメインのアプリページ、次にGoogle Playのメインページに移動してから、最終的に自分のアプリに戻ることです(戻るボタンを4回押します)。
私がしたいのは、[戻る]ボタンを使用して、自分のアプリに直接戻して、以前に確立したGooglePlayアプリのスタックをアプリが最初に見つけたままにしておくことです。
インテントフラグのさまざまな組み合わせを試しましたが、役に立ちませんでした。
私のアプリはAPI8をターゲットにしていることを追加する必要があります。
HelpActivity自体は、ユーザーがメインアクティビティのオプションメニューで[ヘルプ]を押すと、メインアクティビティから起動されます。その起動を実行するコードは次のとおりです。
.
.
.
else if(itemID == R.id.menu_help) {
Intent helpIntent = new Intent(this, HelpActivity.class);
helpIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
helpIntent.setAction(Intent.ACTION_MAIN);
startActivity(helpIntent);
}
また、HelpActivityは、私のアプリのマニフェスト内で通常とは異なる方法で宣言されています。
<activity android:name="com.mycompany.HelpActivity"
android:label="@string/app_help"
android:configChanges="keyboardHidden|orientation|keyboard|locale|mcc|mnc|touchscreen|screenLayout|fontScale"
android:launchMode="singleInstance"
android:taskAffinity="com.mycompany.helpactivity"
android:clearTaskOnLaunch="true"
android:alwaysRetainTaskState="true"
android:process=":fbhelp"
android:stateNotNeeded="true"
android:excludeFromRecents="true"
>
これらの属性のいくつかは、この問題に関連しているように見えます。そのため、マニフェストのこの部分を含めています。このアクティビティは、メインアプリ内でヒープを消費しないように、独自のプロセスで実行されます。ユーザーにアプリとは別に表示されたくないため、最近のアプリから除外されています。ユーザーが複数回起動した場合に非表示のインスタンスが蓄積するのを防ぐのはsingleInstanceです。
さまざまなインテントフラグを試しましたが、求めている結果が得られないようです。
この異常な動作は、Android2.3.3を実行しているNexusOneスマートフォンで確実に再現できることがわかりました。
Android 2.2.1、CyanogenMod-6.1.0-Droidを実行しているMoto Droidでも再現しましたが、異常な動作も見られます。GooglePlayではなくAndroidMarketアプリを実行しています。これはテストデバイスであり、ほとんどのユーザーが手動で更新するプロセスを実行しないため、更新する予定はありません。
また、Android 2.2.1、CyanogenMod-6.1.0-DSを実行しているG1でも再現しました。これは、古いAndroidMarketアプリも実行しています。
ただし、2.3.3を実行しているGTabletには完全に存在しません。そのため、OS(CM7のフレーバー)またはGPアプリに固有であり、したがって一般的な関心は低いかもしれませんが、ご覧のとおり、それを示すプラットフォームやデバイスは多数あります。また、異常を示すデバイスを持っていない限り、他の人が再現するのは難しいかもしれません。
詳細については、以下のコメントを参照してください。