ACTION_MY_PACKAGE_REPLACEDを使用して、アプリの更新または再インストールを受信しています。私の問題は、イベントがトリガーされないことです(Eclipseと実際のデバイスを試しました)。これが私がすることです:
マニフェスト:
<receiver Android:name=".MyEventReceiver" >
<intent-filter Android:priority="1000" >
<action Android:name="Android.intent.action.ACTION_MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
コード:
public class MyEventReceiver extends BroadcastReceiver
{
@Override public void onReceive(Context context, Intent intent)
{
if ("Android.intent.action.ACTION_MY_PACKAGE_REPLACED".equals(intent.getAction()))
{ //Restart services
}
}
}
このコードは単純です。実際には、BOOT_COMPLETEDなどのイベントを使用しましたが、それらは機能しますが、ACTION_MY_PACKAGE_REPLACEDです。ありがとう。
この方法で状況を解決できるすべてのユーザーから情報を取得します。それらはすべて正しく、注意すべき点はほとんどありませんでした。
マニフェスト:
<receiver Android:name=".MyEventReceiver" >
<intent-filter Android:priority="1000" >
<!--other actions I need-->
<action Android:name="Android.intent.action.PACKAGE_REPLACED" />
<data Android:scheme="package"/>
</intent-filter>
</receiver>
そしてコード:
public class MyEventReceiver extends BroadcastReceiver
{
@Override public void onReceive(Context context, Intent intent)
{
if(Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction()))
{ if(intent.getData().getSchemeSpecificPart().equals(context.getPackageName()))
{ //Restart services.
}
}
}
}
私のAndroidリリース(2.3 Gingerbread)では、MY_PACKAGE_REPLACEDを使用できませんでしたが、PACKAGE_REPLACEDを使用して解決しました(すべてのアプリが交換されたことを通知します)。
if(intent.getData().getSchemeSpecificPart().equals(context.getPackageName()))
{
}
ありがとうございます
何らかの理由で、Googleの開発者(「Dianne Hackborn」という名前)は、現在のアプリのみのPACKAGE_REPLACEDインテントに登録できると考えています(リンク こちら )。
ただし、正しく実行する方法が見つからないため、妥協しました。最新のAPIが使用可能な場合はそれを使用します。
残念ながら、デバッグできない理由はわかりませんが、機能します(必要に応じてログに書き込むことができます)。
これがコードです:
マニフェスト:
<receiver
Android:name=".OnUpgradeBroadcastReceiver"
Android:enabled="@bool/is_at_most_api_11" >
<intent-filter>
<action Android:name="Android.intent.action.PACKAGE_REPLACED" />
<data Android:scheme="package" />
</intent-filter>
</receiver>
<receiver
Android:name=".OnUpgradeBroadcastReceiver"
Android:enabled="@bool/is_at_least_api_12" >
<intent-filter>
<action Android:name="Android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
res/values/version_checks.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="is_at_least_api_12" type="bool">false</item>
<item name="is_at_most_api_11" type="bool">true</item>
</resources>
res/values-v12/version_checks.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="is_at_least_api_12" type="bool">true</item>
<item name="is_at_most_api_11" type="bool">false</item>
</resources>
OnUpgradeBroadcastReceiver.Java
public class OnUpgradeBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
if (VERSION.SDK_INT <= VERSION_CODES.HONEYCOMB
&& !context.getPackageName().equals(intent.getData().getSchemeSpecificPart())) {
Android.util.Log.d("AppLog", "other apps were upgraded");
return;
}
Android.util.Log.d("AppLog", "current app was upgraded");
受け入れられた回答 は、Android Studio 1.0+の場合、マニフェストマージの問題が原因で こちら と表示されるため、これ以上機能しません。完全に基づく Android開発者の回答 、次の実装で問題を修正しました:
AndroidManifest.xml:
<receiver Android:name=".UpdateReceiver$LegacyUpdateReceiver" Android:enabled="@bool/shouldUseActionPackageReplaced" >
<intent-filter>
<action Android:name="Android.intent.action.PACKAGE_REPLACED" />
<data Android:scheme="package" />
</intent-filter>
</receiver>
<receiver Android:name=".UpdateReceiver" Android:enabled="@bool/shouldUseActionMyPackageReplaced" >
<intent-filter>
<action Android:name="Android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
/ res/values/resources.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="shouldUseActionPackageReplaced">true</bool>
<bool name="shouldUseActionMyPackageReplaced">false</bool>
</resources>
/ res/values-v12/resources.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="shouldUseActionPackageReplaced">false</bool>
<bool name="shouldUseActionMyPackageReplaced">true</bool>
</resources>
UpdateReceiver.Java:
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.util.Log;
public class UpdateReceiver extends BroadcastReceiver
{
public static class LegacyUpdateReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if (intent != null && intent.getData() != null && context.getPackageName().equals(intent.getData().getSchemeSpecificPart()))
{
onUpdate(context);
}
}
}
@Override
public void onReceive(Context context, Intent intent)
{
onUpdate(context);
}
public static void onUpdate(Context context)
{
Log.d("LOG", "Current app updated");
}
}
これを機能させてデバッグするのに問題があったので、ここに2ペンスの価値を加えたいだけです。私はLollipopデバイスを使用しています。
これは私が使用したコードです:
<receiver Android:name=".services.OnUpdateReceiver">
<intent-filter>
<action Android:name="Android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
それをデバッグするには、あなたの電話にアップデートをインストールしたことを確認する必要があります。Eclipseデバッグだけで問題なく、アプリを少なくとも1回開いた後、デバッグ構成を編集できます。
Eclipse > run > debug configurations > launch action (do nothing) > then F11 like normal
SDカードに小さなファイルを書き込むことで動作することを確認しました
すべてのバージョンで機能するシンプルなマニフェスト:
<receiver
Android:name=".Receiver"
Android:enabled="true"
Android:exported="true" >
<intent-filter>
<action Android:name="Android.intent.action.PACKAGE_REPLACED" />
<data Android:scheme="package"/>
</intent-filter>
<intent-filter>
<action Android:name="Android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
</receiver>
API> = 12デバイス/エミュレーターでそれを試していますか? API 12であるため、このブロードキャストは以前のケースでは送信されません。Pre-ICSと古いハニーコームデバイスでこれを受信するためにアプリが必要な場合は、
試してください:
if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
if (!intent.getData().getSchemeSpecificPart()
.equals(context.getPackageName())) {
return;
}
}
実際、APKをインストールすると、アプリが2回起動します。設定した受信機ごとに1回。
_Android.intent.action.PACKAGE_REPLACED
_をリッスンしているときは、intent.getData()
でパッケージ名を確認する必要があります
_Android.intent.action.MY_PACKAGE_REPLACED
_からの場合、intent.getData()
はNullになることに注意してください。
そのうちの1つを使用するだけで十分だと思います。
Android Studioからアプリをビルドしてインストールしているときにこの問題に遭遇しました。