私の Android アプリケーションには、新しいバージョンにアップグレードするオプションがあります。新しいバージョンの APK は、sdcard のパスの下で利用できるようにしています。アップグレードオプションをクリックすると、次のメソッドが呼び出されます。
public static void launchInstaller(Activity act, String apkPath)
{
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(apkPath)), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
act.startActivityForResult(intent, 0);
}
FLAG_ACTIVITY_NEW_TASK を含める理由は、アップグレード後に、このフラグを使用しないと表示されない「開く」および「完了」オプションが必要だからです。
上記のコードがパッケージ インストーラーを起動すると、[OK] と [キャンセル] の 2 つのオプションが表示されます。ユーザーが [キャンセル] を押すと、ユーザーがキャンセルしたことを知りたいです。しかし、onActivityResult が時期尚早に呼び出されるため、私は知ることができません。次の投稿を読んだ後、なぜそれが起こっているのか理由がわかりました。
Android - startActivityForResult はすぐに onActivityResult をトリガーします
onActivityResult() が時期尚早に呼び出されました
アクティビティを起動するために使用しているインテントに FLAG_ACTIVITY_NEW_TASK が設定されていないことを確認するように求められます。ここを参照してください:
http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK
特に注意: 「このフラグは、呼び出し元が起動中のアクティビティの結果を要求している場合は使用できません。」
アクティビティが新しいタスクの一部として起動されている場合、Android はすぐに RESULT_CANCELED を指定して onActivityResult() を呼び出します。これは、あるタスクのアクティビティが別のタスクに結果を返すことができず、同じタスクのアクティビティだけが結果を返すことができるためです。
しかし、私の場合、FLAG_ACTIVITY_NEW_TASK を削除することはできません。そうしないと、アップグレードが成功したときに「開く」オプションと「完了」オプションが得られないからです。
誰かが同様の問題に直面しましたか? それは私を狂わせるので、親切に私を助けてください。