【问题标题】:Broadcast receiver OnReceive not being called in Xamarin AndroidXamarin Android 中未调用广播接收器 OnReceive
【发布时间】:2016-09-19 15:16:15
【问题描述】:

我通常不会在像这样的论坛上发布问题,但今天我的挫败感蔓延到了天空。

我正在尝试实施一种解决方案,让我每隔一小时/一天(没关系)更新我的应用程序中的汇率列表。我在许多论坛上寻找我的问题的答案,但即使其他人也有同样的问题 onReceive 没有被调用,但没有一个答案对我有帮助。

我目前正在尝试运行由 AlarmManager 的 SetRepeating 方法触发的广播接收器。我的 Main Activity + Receiver + Manifest 代码如下所示:

Main方法(只是一段启动闹钟的代码):

    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"/>

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

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

【问题讨论】:

    标签: android xamarin xamarin.android broadcast receiver


    【解决方案1】:

    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" />
    

    2nd) 至于您尝试启动新进程的原因,请记住 BroadcastReceiver 不是 Android Service... 您可以删除清单中的 :process 标记,因为它不需要因为你正在做的事情。

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

    【讨论】:

      【解决方案2】:

      谢谢你的回答。

      我终于通过向 CurrencyUpdateService 类添加一个意图过滤器属性来让它工作,但我意识到我真正需要的是即使应用程序关闭也能运行的粘性服务。

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

      唯一要记住的是,在进行短时间间隔(

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-06
        相关资源
        最近更新 更多