如何让我的应用程序接收广播时,其他应用程序安装或拆除如何让我的应用程序接收广播时,其他应用程序安装或

2019-06-14 08:45发布

我想要当安装或删除设备上的其他应用程序能够接收广播的应用程序。

我的代码

一个manifset:

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

但我不能接收任何广播。 我觉得这个问题是由于应用程序的权限,任何想法?

感谢您的帮助。

Answer 1:

在您的清单:

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

意图过滤器标签之前添加行

<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意图,如果它实际上是可用的。



Answer 2:

你必须消除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>



Answer 3:

伟大的答案,只是一个很小的事情留给:

在每一个应用程序更新第一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”



文章来源: How to make my app receive broadcast when other applications are installed or removed