目录
BroadcastReceiverInterface代码,广播接收接口
UnityBroadcastProxy,实现java的BroadcastReceiverInterface接口
发送带参数自定义广播,参数可以是布尔值、string、double数组等数据类型,测试代码
接收静态注册的自定义广播,接收到布尔值、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数组