22

デバイス上の他のアプリをインストールまたは削除したときにブロードキャストを受信できるアプリを作成したいと思います。

私のコード

マニフェスト:

<receiver android:name=".apps.AppListener">
    <intent-filter android:priority="100">
         <action android:name="android.intent.action.PACKAGE_INSTALL"/>
         <action android:name="android.intent.action.PACKAGE_ADDED"/>  
         <action android:name="android.intent.action.PACKAGE_REMOVED"/>
    </intent-filter>
</receiver>

AppListenerで:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class AppListener extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent arg1) {
    // TODO Auto-generated method stub
    Log.v(TAG, "there is a broadcast");
    }
}

でも放送が取れません。この問題はアプリの権限が原因だと思いますが、何か考えはありますか?

助けてくれてありがとう。

4

3 に答える 3

46

マニフェスト:

<receiver android:name=".apps.AppListener">
    <intent-filter android:priority="100">
         <action android:name="android.intent.action.PACKAGE_INSTALL"/>
         <action android:name="android.intent.action.PACKAGE_ADDED"/>  
         <action android:name="android.intent.action.PACKAGE_REMOVED"/>
    </intent-filter>
</receiver>

intent-filterタグの前に行を追加します

<data android:scheme="package"/>

したがって、マニフェストは次のようになります。

<receiver android:name=".apps.AppListener">
    <intent-filter android:priority="100">
         <action android:name="android.intent.action.PACKAGE_INSTALL"/>
         <action android:name="android.intent.action.PACKAGE_ADDED"/>  
         <action android:name="android.intent.action.PACKAGE_REMOVED"/>
         <data android:scheme="package"/> 
    </intent-filter>
</receiver>

PACKAGE_REMOVEDインテントが実際に利用可能かどうかは、わかりません。

于 2012-06-28T14:08:28.027 に答える
21

android.intent.action.PACKAGE_INSTALLは非推奨であり、システム専用であるため推奨されなくなったため、削除する必要があります。他のすべては完璧であり、100の代わりに999を入力することをお勧めします。ドキュメントには、使用する最大または最小の数が記載されていません。数が多いほど、その目的のレシーバーの優先度が高くなります。翻訳者に申し訳ありません。私はスペイン語で話し、書きます。 情報

<receiver android:name=".apps.AppListener">
<intent-filter android:priority="999">
     <action android:name="android.intent.action.PACKAGE_ADDED"/>  
     <action android:name="android.intent.action.PACKAGE_REMOVED"/>
     <data android:scheme="package"/> 
</intent-filter>

于 2012-08-22T07:21:27.520 に答える
8

すばらしい答えです。残っているのは1つだけです。

アプリが更新されるたびに、最初にACTION_PACKAGE_REMOVEDが呼び出され、続いてACTION_PACKAGE_ADDEDが呼び出されます。これらのイベントを無視する場合は、onReceive()に追加してください。

if(!(intent.getExtras() != null &&
    intent.getExtras().containsKey(Intent.EXTRA_REPLACING) &&
    intent.getExtras().getBoolean(Intent.EXTRA_REPLACING, false))) {

    //DO YOUR THING
}

これはドキュメントからです:

EXTRA_REPLACING Added in API level 3 String EXTRA_REPLACING Used as a boolean extra field in ACTION_PACKAGE_REMOVED intents to indicate that this is a replacement of the package, so this broadcast will immediately be followed by an add broadcast for a different version of the same package. Constant Value: "android.intent.extra.REPLACING"

于 2017-02-13T18:34:49.373 に答える