8

最近、Android アプリの更新プロセスの問題に直面しています。

簡単に言えば、アプリは、より高いバージョン コードの更新プログラムがサーバーにアップロードされたかどうかを確認できます。その場合、ユーザーは更新するかどうかを決定します。そのアプリがロードされ、標準のインストールが開始された後:

final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK)), "application/vnd.android.package-archive");
startActivity(intent)

問題は、アンドロイドのインテントがインストールを完了すると、「理論的には」「アプリケーションがインストールされました」という情報と「完了」、「開く」という2つのボタンを持つアクティビティです。これまでのところ、以下のシナリオに出くわしたため、「理論的に」書きました。

  1. アプリがインストールされ、「アプリケーションがインストールされました」というメッセージのアクティビティが表示され、ユーザーが [開く] をクリックしても何も起こらない (Android 2.3.*) またはアプリ自体が正しく開く - この動作はランダムです。

  2. アプリがインストールされ、「アプリケーションがインストールされました」というメッセージのアクティビティが表示されますが、突然消えます。

このバグ (?) を回避しようとすると、http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_REPLACEDが見つかりました。私が実装したBroadcastReceiverは、Launch Activityを開始し、何とか適切な解決策だったとしましょう。

         <receiver android:name=\".MyReceiver\" >
          <intent-filter>
              <action android:name="android.intent.action.ACTION_PACKAGE_REPLACED" />
              //Or from API 12 <action android:name="android.intent.action.ACTION_MY_PACKAGE_REPLACED" />
           </intent-filter>
         </receiver>

API が低い (12 未満) のアプリケーションは ACTION_MY_PACKAGE_REPLACED を処理できなかったため、このソリューションを変更する必要があったため、API に依存する動作を実装しました。

  • udpate アプリを通常どおりインストールし、「完了」/「開く」ボタンを使用してアクティビティからアプリを起動できるようになりました (API < 12)

  • ACTION_MY_PACKAGE_REPLACED の通知後、MyReceiver 経由で更新アプリを起動しました。

これが私の現在の解決策です。

私の質問は次のとおりです。

  • API が 12 未満の Android にインストールした後、[開く] をクリックすると、更新されたアプリがランダムに開くのはなぜですか?

  • 上位の API を搭載したデバイスで「完了」/「開く」ボタンのアクティビティが消えるのはなぜですか?

インストールする前にアプリケーションを終了しようとしましたが、役に立ちませんでした。

私の説明は、インストール プロセスの後、新しいパッケージが古いパッケージを上書きする必要があるため、古いパッケージを単純に削除する必要があり、これが起動アクティビティが消える主な原因であるということです。

私が書いたように、これは私の現在の解決策であり、満足していません。誰かが問題を明確にすることができれば、私は非常に感謝しています.

読んでくれてありがとう。

編集:

OK、解決策は非常に簡単です。更新を成功させるには、インテントを新しいタスクとして起動する必要があります (arrrgh...):

final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(PATH_TO_APK)), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
4

1 に答える 1

0

まず、次のようにマニフェストに「intent-filter」を追加します。

`<activity android:name="com.package.MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="file" />
        <data android:mimeType="application/vnd.android.package-archive" />
    </intent-filter>
</activity>`

次に、新しいタスクのインテント フラグを設定します。

intentAPK.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

于 2015-07-07T04:10:02.027 に答える