9

私の 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 を削除することはできません。そうしないと、アップグレードが成功したときに「開く」オプションと「完了」オプションが得られないからです。

誰かが同様の問題に直面しましたか? それは私を狂わせるので、親切に私を助けてください。

4

1 に答える 1

4

パッケージで追加されたブロードキャスト インテントを使用する必要があります。追加されたブロードキャスト レシーバーリッスンパッケージを作成します。 追加されたパッケージがあなたのパッケージと等しい場合、ユーザーはインストールを確認します。それ以外の場合は、インストール プロセスを閉じます。Android が返すことができるエクストラの種類を尋ねると、android はパッケージに関する EXTRA_UID を返します。PackageManager のメソッドは uid を package.(getPackagesForUid(int uid) に変換します) は文字列配列を返しますが、通常は配列内の 1 つの項目を返します。通常、配列の長さは 1 に等しくなります。

于 2013-10-02T10:21:17.623 に答える