【问题标题】:broadcast receiver to get Toast after install specific app安装特定应用程序后广播接收器获取 Toast
【发布时间】:2018-01-05 19:10:18
【问题描述】:

我正在开发 Android 应用程序。首先,我不熟悉 BroadcastReceiver。我需要创建一个应用程序,如果安装应用程序具有特定的包,如“com.whatsapp”,广播接收器将显示Toast

public class PackageAddedReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Package Installed: ", Toast.LENGTH_LONG).show();
    }
}

清单

<receiver android:name=".receiver.PackageAddedReceiver" android:label="Package added Receiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_ADDED" />
        <action android:name="android.intent.action.PACKAGE_REMOVED"/>
        <data android:scheme="package"/>
    </intent-filter>
</receiver>

如何为特定的包添加BroadcastReceiver

【问题讨论】:

    标签: java android


    【解决方案1】:

    试试这个

    public class PackageAddedReceiver extends BroadcastReceiver {
    
        public void onReceive(Context context, Intent intent) {
    
    
    
            Uri data = intent.getData();
            String mypkg="package:com.pck.name";
    
            Log.e("DATA",data+"");
            Log.e( "Action: " ,intent.getAction());
    
            if(mypkg.equals(data.toString())){
                Toast.makeText(context, "Package Installed: ", Toast.LENGTH_LONG).show();
            }else {
                Toast.makeText(context, "not match ", Toast.LENGTH_LONG).show();
            }
    
        }
    

    清单代码

     <receiver android:name=".PackageAddedReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_INSTALL" />
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>
    

    【讨论】:

    • 我有 2 个问题: 1- 为什么需要 Activity? 2- 你能像深度链接一样直接从 Manifest 中过滤包名吗?
    • 在哪里添加特定的包?
    • @Eselfar 我有 3 个活动,所有活动都有我想要安装的 apk
    • 抱歉,我想了解@Prem 的答案。
    • @Prem 根据this answer,你可以。但需要进行测试,因为它似乎不适用于所有版本的 API(似乎需要 API 19)。
    【解决方案2】:

    A.创建BroadcastReceiver类(实现onReceive):可以提取包相关的数据

    import android.content.*;
    import android.net.Uri;
    import android.util.Log;
    
    public class PackageChangeReceiver extends BroadcastReceiver {
       @Override
       public void onReceive(Context ctx, Intent intent) {
         Uri data = intent.getData();
         Log.d(TAG, "Action: " + intent.getAction());
         Log.d(TAG, "The DATA: " + data);
       }
    }
    

    B.在 AndroidManifest.xml 中使用 intent-filter 声明接收者:

    <receiver android:name="PackageChangeReceiver">
        <intent-filter>
         <action android:name="android.intent.action.PACKAGE_ADDED"/>
         <action android:name="android.intent.action.PACKAGE_REPLACED"/>
         <action android:name="android.intent.action.PACKAGE_REMOVED"/>
         <data android:scheme="package"/>
      </intent-filter>
    </receiver> 
    

    【讨论】:

    • 我试试这个,但安装应用程序后没有得到任何吐司
    【解决方案3】:

    接收器应以编程方式注册如下:

    val packageAddedReceiver = PackageAddedReceiver()
        val intentFilter = IntentFilter()
        intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED)
        intentFilter.addAction(Intent.ACTION_PACKAGE_FIRST_LAUNCH)
        intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL)
        intentFilter.addDataScheme("package")
        registerReceiver(packageAddedReceiver, intentFilter)
    

    如需进一步解释,请查看链接中的 CommonsWare 答案 Can't receive broadcasts for PACKAGE intents

    【讨论】:

    • 奇怪的是,当您添加此操作“android.intent.action.PACKAGE_FULLY_REMOVED”时,即使您仅在 AndroidManifest 中注册您的接收器,您也会收到广播。
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2014-03-06
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多