11

マニフェストに放送受信機を登録しています:

<application ...>
    <receiver android:name="com.some.pkg.NewAppReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_ADDED" />
        </intent-filter>
    </receiver>
</appcication>

そして受信機:

public class NewAppReceiver extends BroadcastReceiver {

    private static final String TAG = "NewAppReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "Intent: " + intent.getAction());
    }
}

また、 APKを手動またはAndroidマーケットからインストールしても、何も受信されません。なんで?

4

6 に答える 6

31

他のアプリをインストールする前に、このbroadcastReceiverを含むアプリを実行しましたか?

一部のAPIバージョン以降、broadcastReceiversはアプリを実行するまで機能しません。アクティビティを入れて実行します。

また、broadcastReceiverに以下を追加することを忘れないでください。

<data android:scheme="package" />

編集:Android 8以降では、アプリがAPI 27以上をターゲットにしている場合、部分的に機能するため、マニフェストではなくコードでこれらのイベントに登録する必要があります。マニフェストで引き続き安全に使用できるインテントのリストは次のとおりです:https ://developer.android.com/guide/components/broadcast-exceptions.html 。

残りはコードで使用する必要があります。詳細はこちら

于 2012-06-04T22:32:48.937 に答える
8

android.intent.action.PACKAGE_ADDEDはシステムインテントであるため(独自のアプリはインストール時に受信しないことに注意してください)、BroadcastReceiverはアプリ外のソースからメッセージを受信します。したがって、次のように入力していないことを確認してください:android:exported = "false"

また、以下を追加する必要がある場合があります。

<data android:scheme="package" />

したがって、AndroidManifest.xmlのBroadcastReceiverは次のようになります。

<application ...>
    <receiver android:name=".NewAppReceiver" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_ADDED" />
            <data android:scheme="package" />
        </intent-filter>
    </receiver>
</appcication>

それでも機能しない場合は、次のように優先度を高くしてみてください:android:priority = "1000"

ご覧ください:http://developer.android.com/guide/topics/manifest/receiver-element.html

于 2013-09-16T13:49:15.053 に答える
6

マニフェストからのレシーバーの登録は、API 26(android 8)では機能しません。古いバージョンではパフォーマンスに影響があったためです。

ただし、Javaコードからレシーバーを登録し、削除および追加されたアプリケーションの更新を受信することはできます。

    val intentFilter = IntentFilter()
    intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED)
    intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED)
    intentFilter.addDataScheme("package")
    registerReceiver(YourBroadcastReceiver(), intentFilter)
于 2020-07-24T13:11:13.580 に答える
4

インストールしているアプリケーションでインテントを受信しようとしていますか?ACTION_PACKAGE_ADDEDのドキュメントには次のように書かれています。

新しくインストールされたパッケージはこのブロードキャストを受信しないことに注意してください。

もう1つの可能性は、このインテントがマニフェストを介して登録されたコンポーネントに配信されず、手動でのみ配信される可能性があることです(MarkMurphyによるStackOverflowの質問への回答で説明されているようにPACKAGEインテントのブロードキャストを受信できません)。

于 2012-06-04T22:03:19.017 に答える
0

あなたが他のパッケージを受け取ろうとするならば、それは働かなければなりません。

(@Savvasが指摘したように)あなたがあなた自身のパッケージの追加を受け取ろうとすると、あなたはそれを受け取ることができません。ブロードキャストレシーバーにが含まれていてもaction.PACKAGE_ADDED、レシーバーのonReceiveメソッドはトリガーされません

この場合、最善の策はこのデータを保存することです。を使用してsharedPreferences、「appIsWorkedBefore」のようなキーを追加し、ランチャーアクティビティのonCreateメソッドでこの変数を「true」に設定します。そして、あなたはこのブール値に関してあなたの作品を作ることができます。

于 2013-11-13T15:45:24.890 に答える
0

このインテントアクションは、アプリケーションでは使用できなくなりました。

This is a protected intent that can only be sent by the system.

https://developer.android.com/reference/android/content/Intent#ACTION_PACKAGE_ADDED

于 2020-12-07T16:18:41.810 に答える