Xamarin Android中未调用广播接收器OnReceive
我通常不会在这样的论坛上发问,但今天我的沮丧情绪达到了极点 我正在尝试实现一个解决方案,它可以让我每小时/天更新应用程序中的汇率列表(无所谓)。我在很多论坛上寻找我的问题的答案,但即使其他人也有同样的问题,onReceive没有被呼叫,没有一个答案对我有帮助 我目前正在尝试运行AlarmManager的SetRepeating方法触发的广播接收器。我的主活动+接收者+清单的代码如下所示: 主要方法(仅一段启动报警的代码): 接收人:Xamarin Android中未调用广播接收器OnReceive,android,xamarin,xamarin.android,broadcast,receiver,Android,Xamarin,Xamarin.android,Broadcast,Receiver,我通常不会在这样的论坛上发问,但今天我的沮丧情绪达到了极点 我正在尝试实现一个解决方案,它可以让我每小时/天更新应用程序中的汇率列表(无所谓)。我在很多论坛上寻找我的问题的答案,但即使其他人也有同样的问题,onReceive没有被呼叫,没有一个答案对我有帮助 我目前正在尝试运行AlarmManager的SetRepeating方法触发的广播接收器。我的主活动+接收者+清单的代码如下所示: 主要方法(仅一段启动报警的代码): 接收人: public class CurrencyUpdate
public class CurrencyUpdateService : BroadcastReceiver
{
public override void OnReceive (Context context, Intent intent)
{
Toast.MakeText (context, "Running", ToastLength.Short).Show ();
}
}
舱单:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="SplitTheBill.SplitTheBill" android:versionCode="1" android:versionName="1.0">
<uses-sdk android:minSdkVersion="16" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application android:label="SplitTheBill" android:icon="@drawable/groups"></application>
<receiver android:process=":remote" android:name=".CurrencyUpdateService"/>
<provider android:name="mono.MonoRuntimeProvider" android:exported="false" android:initOrder="2147483647" android:authorities="StockService.StockService.mono.MonoRuntimeProvider.__mono_init__" />
我想说的是,我是Xamarin的新用户,由于Xamarin非常成功地让舒尔实现了您不必触摸清单文件,我只添加了一句话:
<receiver android:process=":remote" android:name=".CurrencyUpdateService"/>
我尝试在一个新的解决方案中运行代码,但没有成功。我尝试使用不同类型的报警类型和服务,但没有成功
请随意提出您自己的解决方案,并嘲笑我提出的明显问题;) 1st)使用BroadcastReceiver
属性标记广播接收器类,以便在编译时在AndroidManifest.xml
中生成适当的标记:
[BroadcastReceiver]
public class CurrencyUpdateService : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Toast.MakeText(context, "Running", ToastLength.Short).Show();
}
}
现在,您的接收器将开始每5秒敬酒一次
注意:Xamarin自动生成Android类名标识符,因此,如果您没有为类硬编码名称,则无法手动编辑清单以添加此项
上述代码生成的AndroidManifest.xml(对我而言):
注意:,请使用包含包名的完全限定名,有关详细信息,请参阅链接
AndroidManifest.xml现在包含:
第二)至于您为什么要尝试启动新流程,请记住,BroadcastReceiver
不是Android服务
。。。您可以删除清单中的:process
标记,因为您所做的工作不需要它
如果您确实希望创建并启动本地或后台服务,您应该签出:
BroadcastReceiver
属性标记广播接收器类,以便在编译时在AndroidManifest.xml
中生成适当的标记:
[BroadcastReceiver]
public class CurrencyUpdateService : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Toast.MakeText(context, "Running", ToastLength.Short).Show();
}
}
现在,您的接收器将开始每5秒敬酒一次
注意:Xamarin自动生成Android类名标识符,因此,如果您没有为类硬编码名称,则无法手动编辑清单以添加此项
上述代码生成的AndroidManifest.xml(对我而言):
注意:,请使用包含包名的完全限定名,有关详细信息,请参阅链接
AndroidManifest.xml现在包含:
第二)至于您为什么要尝试启动新流程,请记住,BroadcastReceiver
不是Android服务
。。。您可以删除清单中的:process
标记,因为您所做的工作不需要它
如果您确实希望创建并启动本地或后台服务,您应该签出:
- 谢谢你的回答
我最终通过向CurrencyUpdateService类添加一个intent filter属性实现了它,但我意识到我真正需要的是一个即使应用程序关闭也会运行的粘性服务
我完成了一个每天在指定时间运行的服务(也是应用程序关闭后5秒,因为服务粘性)+BroadcastReceiver用于重新启动系统以重新安排服务+两个其他广播接收器以使应用程序工作更智能
要记住的唯一一件事是,在短时间间隔(<10分钟)进行测试时,不要相信AlarmManager,因为有时它会在超时时发出警报。谢谢您的回答 我最终通过向CurrencyUpdateService类添加一个intent filter属性实现了它,但我意识到我真正需要的是一个即使应用程序关闭也会运行的粘性服务 我完成了一个每天在指定时间运行的服务(也是应用程序关闭后5秒,因为服务粘性)+BroadcastReceiver用于重新启动系统以重新安排服务+两个其他广播接收器以使应用程序工作更智能 要记住的唯一一件事是,在短时间间隔(<10分钟)进行测试时,不要相信AlarmManager,因为有时它会超时触发警报
<receiver android:name="md57db81284125fca721c48509d8e9cea0b.CurrencyUpdateService" />
[BroadcastReceiver(Name = "com.sushihangover.alarmso.Foobar")]
public class CurrencyUpdateService : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Toast.MakeText(context, "Running", ToastLength.Short).Show();
}
}
<receiver android:name="com.sushihangover.alarmso.Foobar" />