我通常不会在像这样的论坛上发帖提问,但今天我的挫折感已经到了天空。
我正在尝试实施一个解决方案,让我每隔一小时/每天更新一次应用程序中的汇率列表(无关紧要)。我在很多论坛上都在寻找问题的答案,但即使其他人也有同样的onReceive没有被调用的问题,没有一个答案对我有帮助。
我目前正在尝试运行由AlarmManager的SetRepeating方法触发的广播接收器。我的主要活动+接收器+清单的代码如下所示:
主要方法(只是启动闹钟的代码块):
var lvarManager = (AlarmManager)GetSystemService (Context.AlarmService);
Intent lvarCurrencyIntent = new Intent (this, typeof(CurrencyUpdateService));
var lvarPendingIntent = PendingIntent.GetBroadcast (this, 0, lvarCurrencyIntent, PendingIntentFlags.CancelCurrent);
lvarManager.SetRepeating (AlarmType.Rtc, 1000, 5000, lvarPendingIntent);
接收器:
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的一个新用户,因为它非常成功地使你不会触及Manifest文件,我只添加了一行:
<receiver android:process=":remote" android:name=".CurrencyUpdateService"/>
我尝试在新的解决方案中运行代码,但它无效。我尝试使用不同类型的警报类型和服务而没有运气。
随意提出自己的解决方案并嘲笑我的问题,提出明显的问题;)
答案 0 :(得分:2)
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类名称标识符,因此如果您没有为您的类硬编码名称,则无法手动编辑清单以添加此项目。
<receiver android:name="md57db81284125fca721c48509d8e9cea0b.CurrencyUpdateService" />
现在,如果您手动将Name
添加到Attribute
,则可以控制生成的内容。如果其他Android应用程序需要呼叫您并需要预定义(静态)名称,则需要这样做。
[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();
}
}
注意:Do not use Android-style "dot name",使用包含您的包名称的完全限定名称,有关详细信息,请参阅链接
<receiver android:name="com.sushihangover.alarmso.Foobar" />
第二)至于您尝试开始新流程的原因,请记住BroadcastReceiver
不是Android Service
...您可以删除自己的:process
标记因为你正在做的事情不需要表现出来。
如果您真的想要创建并启动本地或后台服务,则应该结帐:
答案 1 :(得分:0)
谢谢你的回答。
我终于通过向CurrencyUpdateService类添加了intent过滤器属性来实现它,但我意识到我真正需要的是即使应用程序关闭也会运行的粘性服务。
我完成了一项服务,该服务每天在指定时间运行(也就是应用程序因服务粘性而关闭后5秒)+ BroadcastReceiver用于系统重启以重新安排服务+其他几个广播接收器来制作应用程序更聪明地工作。
唯一需要记住的是,在短时间内(<10分钟)进行测试时,不要相信AlarmManager,因为有时它会触发警报。