web-dev-qa-db-ja.com

他のアプリケーションがインストールまたは削除されたときにアプリがブロードキャストを受信するようにする方法

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

私のコード

マニフェスト内:

<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");
    }
}

でも放送が受けられない。この問題はアプリの権限によるものだと思いますが、何か考えはありますか?

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

20
bmavus

あなたのマニフェストで:

<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インテントが実際に利用可能であるかどうかはわかりません。

44
t0mm13b

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>
19
Heberth

すばらしい答え、あと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 APIレベル3で追加されました。文字列EXTRA_REPLACING ACTION_PACKAGE_REMOVEDインテントのブール型の追加フィールドとして使用され、これがパッケージの置き換えであることを示します。このため、このブロードキャストの直後に、同じパッケージの異なるバージョンの追加ブロードキャストが続きます。定数値:「Android.intent.extra.REPLACING」

7
Gal Rom