前言:之前写过接收系统开机广播的内容,做Xamarin很多时候对于平台下的内容都是不求甚解。
这次接收的是第三方App的广播,查了一下广播相关的东西。
广播分为静态和动态的,接收系统开机广播用的是静态注册的,也只能静态的,因为App还没启动,肯定动态调不起来啊。
1. 接收到第三方app的广播。
我抄了下接收开机广播的方法, 结果第三方app广播后,我这边就报错。
静态注册是在AndroidManifest.xml里面application节点下写一下内容,通过action android:name来匹配对应的广播。
Java.lang.RuntimeException: Unable to instantiate receiver “” didn't find class on path dexpathlist
其实能报错,说明广播被触发了,action名称配置什么的应该都对,但是问题在哪还是不知道,后面查资料说是有可能是因为注册的顺序问题,于是改成动态注册。
在MainActivity启动后用代码注册receiver, 就可以正常接收到了。
2. 接收广播参数
一个receiver可以接收多个多个广播内容,通过intent.Action来判断是哪个广播,对应获取参数。
需要根据参数的类型调用不同的方法来获取
获取整数参数的方法intent.GetIntExtra(参数名称,默认值),, 文本intent.GetStringExtra(参数名称)等等。
[BroadcastReceiver(Enabled = true, Exported = true)]
public class BootReceiver1 : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
var action = intent.Action;
//开启定时开关机 :参数 mode ==someday/week/everyday offTime onTime
// int EVERYDAY = 1;
//int SOMEDAY = 2;
// int WEEK = 3;
if (action == "xxxx.action.ACTION_POWER_ON_OFF")
{
var mode = intent.GetIntExtra("mode", -1);
var offTime = intent.GetLongExtra("offTime", -1);
var onTime = intent.GetLongExtra("onTime", -1);
System.DateTime offDateTime = XamarinApp.StandardLib.TimeHelper.UnixMil2DateTime(offTime);
System.DateTime onDateTime = XamarinApp.StandardLib.TimeHelper.UnixMil2DateTime(onTime);
//保存到缓存。
HcData.HcConfig.PowerOnOffMode = mode;
}
//取消定时开关机
if (action == "xxx.action.ACTION_CANCEL_POWER_ON_OFF")
{
HcData.HcSerialPortMgr.SetPowerOnOff(-1, -1);
}
}
}