广播接收器OnReceive未在Xamarin Android中调用

时间:2016-05-22 20:12:50

标签: android xamarin xamarin.android broadcast receiver

我通常不会在像这样的论坛上发帖提问,但今天我的挫折感已经到了天空。

我正在尝试实施一个解决方案,让我每隔一小时/每天更新一次应用程序中的汇率列表(无关紧要)。我在很多论坛上都在寻找问题的答案,但即使其他人也有同样的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"/>

我尝试在新的解决方案中运行代码,但它无效。我尝试使用不同类型的警报类型和服务而没有运气。

随意提出自己的解决方案并嘲笑我的问题,提出明显的问题;)

2 个答案:

答案 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类名称标识符,因此如果您没有为您的类硬编码名称,则无法手动编辑清单以添加此项目。

上面代码中的AndroidManifest.xml生成(对我来说):

<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",使用包含您的包名称的完全限定名称,有关详细信息,请参阅链接

AndroidManifest.xml现在包含:

<receiver android:name="com.sushihangover.alarmso.Foobar" />

第二)至于您尝试开始新流程的原因,请记住BroadcastReceiver不是Android Service ...您可以删除自己的:process标记因为你正在做的事情不需要表现出来。

如果您真的想要创建并启动本地或后台服务,则应该结帐:

答案 1 :(得分:0)

谢谢你的回答。

我终于通过向CurrencyUpdateService类添加了intent过滤器属性来实现它,但我意识到我真正需要的是即使应用程序关闭也会运行的粘性服务。

我完成了一项服务,该服务每天在指定时间运行(也就是应用程序因服务粘性而关闭后5秒)+ BroadcastReceiver用于系统重启以重新安排服务+其他几个广播接收器来制作应用程序更聪明地工作。

唯一需要记住的是,在短时间内(<10分钟)进行测试时,不要相信AlarmManager,因为有时它会触发警报。