unity发送自定义广播传参(参数可以是布尔值、string、double数组等数据类型)、动态注册安卓广播、接收安卓静态广播和动态广播

目录

安卓部分

build.gradle修改为库

配置AndroidManifest

java代码

BroadcastReceiverInterface代码,广播接收接口

 UABroadcastReceiver代码,广播接收器

build moudle 导出aar

Unity部分

导入aar包

配置AndroidManifest,静态注册自定义广播

C#代码

UnityBroadcastProxy,实现java的BroadcastReceiverInterface接口

UnityBroadcastReceiver广播接收器

测试

发送带参数自定义广播,参数可以是布尔值、string、double数组等数据类型,测试代码

安装apk测试系统广播

测试界面,添加两个button

效果

接收动态注册的系统广播

接收静态注册的自定义广播,接收到布尔值、string、double数组


本博文对应资源下载地址

自定义的广播可以收缩到,但是系统广播接收不到;

如果静态广播接收不到,有可能是需要动态注册广播

安卓部分

build.gradle修改为库

修改为library;注释掉ID;没有的都删掉

配置AndroidManifest

java代码

BroadcastReceiverInterface代码,广播接收接口

package com.unity3d.player;

import android.content.Context;
import android.content.Intent;

public abstract interface BroadcastReceiverInterface {
    public abstract void onReceive(Context var1, Intent var2);
}

 UABroadcastReceiver代码,广播接收器

package com.unity3d.player;

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

public class UABroadcastReceiver extends BroadcastReceiver {
    public static BroadcastReceiverInterface receiver;
    String TAG = "unity UABroadcastReceiver";

    public UABroadcastReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "Android has receive broadcast");
        if (receiver != null) {
            receiver.onReceive(context, intent);
        } else {
            Log.e(TAG, "BroadcastReceiverInterface receiver is null");
        }
    }

    public void setReceiver(BroadcastReceiverInterface unityReceiverProxy) {
        Log.d(TAG, "setReceiver");
        receiver = unityReceiverProxy;
    }
}

build moudle 导出aar

Unity部分

导入aar包

配置AndroidManifest,静态注册自定义广播

C#代码

UnityBroadcastProxy,实现java的BroadcastReceiverInterface接口

using UnityEngine;

public class UnityBroadcastProxy : AndroidJavaProxy
{
    public delegate void BroadcastOnReceiveDelegate(AndroidJavaObject context, AndroidJavaObject intent);
    public BroadcastOnReceiveDelegate onReceiveDelegate;

    public UnityBroadcastProxy() : base("com.unity3d.player.BroadcastReceiverInterface") { }

    /// <summary>
    /// public void onReceive(Context context, Intent intent)
    /// </summary>
    /// <param name="context">Context.</param>
    /// <param name="intent">Intent.</param>
    public void onReceive(AndroidJavaObject context, AndroidJavaObject intent)
    {
        if (onReceiveDelegate != null)
        {
            onReceiveDelegate(context, intent);
        }
    }
}

UnityBroadcastReceiver广播接收器

using System;
using UnityEngine;
using AndroidUtility;
public class UnityBroadcastReceiver
{
    public static UnityBroadcastReceiver instance = (UnityBroadcastReceiver)Activator.CreateInstance(typeof(UnityBroadcastReceiver));

    private UnityBroadcastProxy broadcastReceiverInterface;
    private AndroidJavaObject UABroadcastReceiver;
    //private AndroidJavaClass Intent;

    public UnityBroadcastReceiver()
    {
        //Intent = new AndroidJavaClass("android.content.Intent");
        UABroadcastReceiver = new AndroidJavaObject("com.unity3d.player.UABroadcastReceiver");
    }

    public void initBroadcast()
    {
        broadcastReceiverInterface = new UnityBroadcastProxy();
        broadcastReceiverInterface.onReceiveDelegate = onBroadcastReceive;
        UABroadcastReceiver.Call("setReceiver", broadcastReceiverInterface);

        try
        {
            AndroidJavaObject recevierFilter = new AndroidJavaObject("android.content.IntentFilter");


            recevierFilter.Call("addAction", "android.intent.action.PACKAGE_REMOVED");
            recevierFilter.Call("addAction", "android.intent.action.PACKAGE_ADDED");
            recevierFilter.Call("addAction", "android.intent.action.PACKAGE_REPLACED");
            recevierFilter.Call("addDataScheme", "package");

            AndroidJavaObject _UnityActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");

            _UnityActivity.Call<AndroidJavaObject>("registerReceiver", UABroadcastReceiver, recevierFilter);
        }
        catch (Exception e)
        {
            AndroidTools.AndroidLogI(e.Message.ToString());
            throw;
        }
    }

    void onBroadcastReceive(AndroidJavaObject context, AndroidJavaObject intent)
    {
        AndroidJavaObject action = intent.Call<AndroidJavaObject>("getAction");
        string pkgname = context.Call<string>("getPackageName");
        Debug.Log("pkgname:" + pkgname);
        if (null != action)
        {
            //AndroidTools.AndroidLogI("接收action:" + action.toCString());
            if (action.toCString().Equals("selfdefinereceiver"))
            {
                //TODO 这里自己写相应,上面一句可删除
                "接收到了selfdefinereceiver".showAsToast();

                bool enable = intent.Call<bool>("getBooleanExtra", "enable", true);
                Debug.Log("enable:" + enable);

                bool enable2 = intent.Call<bool>("getBooleanExtra", "enable2", false);
                Debug.Log("enable2:" + enable2);

                string str = intent.Call<string>("getStringExtra", "mystring");
                Debug.Log("str:" + str);

                //  double[] data =intent.getDoubleArrayExtra("args");
                double[] datas = intent.Call<double[]>("getDoubleArrayExtra", "datas");
                Debug.Log("double array data length:" + datas.Length);
                string msg = "";
                for (int i = 0; i < datas.Length; i++)
                {
                    msg += datas[i] + "\r\n";
                }
                Debug.Log(msg);
            }
        }
    }
}

测试

发送带参数自定义广播,参数可以是布尔值、string、double数组等数据类型,测试代码

using AndroidUtility;
using UnityEngine;

public class BroadcastTest : MonoBehaviour
{
    void Start()
    {
        Application.runInBackground = true;
    }

    public void initBroadcast()
    {
        UnityBroadcastReceiver.instance.initBroadcast();
        AndroidTools.AndroidLogI("initBroadcast    ===============================");
    }
    public void SendBroadcastWithArgs()
    {
        SendBroadcastWithArgs("selfdefinereceiver", Application.identifier, "com.unity3d.player.UABroadcastReceiver");
        AndroidTools.AndroidLogI("selfdefinereceiver    ===============================");
    }

    void SendBroadcastWithArgs(string actionName, string packageName, string broadcastName)
    {
        AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent", actionName);

        intentObject.Call<AndroidJavaObject>("putExtra", "enable", false);

        intentObject.Call<AndroidJavaObject>("putExtra", "enable2", true);

        intentObject.Call<AndroidJavaObject>("putExtra", "mystring", "mystring args");

        double[] data = { 4.3f, 45, -78, 10000, 89 };
        intentObject.Call<AndroidJavaObject>("putExtra", "datas", data);

        AndroidJavaObject componentNameJO = new AndroidJavaObject("android.content.ComponentName", packageName, broadcastName);
        intentObject.Call<AndroidJavaObject>("setComponent", componentNameJO);

        AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject context = unity.GetStatic<AndroidJavaObject>("currentActivity").Call<AndroidJavaObject>("getApplicationContext");
        context.Call("sendBroadcast", intentObject);
    }
}

安装apk测试系统广播

测试界面,添加两个button

效果

接收动态注册的系统广播

接收静态注册的自定义广播,接收到布尔值、string、double数组

 

本博文对应资源下载地址

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack Yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值