Xamarin 中未调用广播接收器 OnReceive Android
Broadcast receiver OnReceive not being called in Xamarin Android
我通常不会在这样的论坛上发帖,但今天我的挫败感达到了顶峰。
我正在尝试实施一种解决方案,让我每隔 hour/day 更新我的应用程序中的汇率列表(无关紧要)。我在许多论坛上寻找我的问题的答案,但即使其他人也有同样的问题,即没有调用 onReceive,none 的答案帮助了我。
我目前正在尝试 运行 一个由 AlarmManager 的 SetRepeating 方法触发的广播接收器。我的 Main activity + Receiver + Manifest 代码如下所示:
主要方法(只是一段启动闹钟的代码):
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"/>
我尝试 运行在新的解决方案中修改代码,但没有成功。我尝试使用不同类型的警报类型和服务,但没有成功。
请随意提出您自己的解决方案,并嘲笑我提出明显的问题;)
1st) 使用 BroadcastReceiver
属性标记您的广播接收器 class,以便在编译时在您的 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 class 名称标识符,因此如果您不为 class 硬编码名称, 无法手动编辑清单来添加此项。
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();
}
}
注意:,请使用包含您的包名称的完全限定名称,详情请参阅link
AndroidManifest.xml 现在包含:
<receiver android:name="com.sushihangover.alarmso.Foobar" />
2nd) 至于为什么要尝试启动新进程,请记住 BroadcastReceiver
不是 Android Service
... 您可以删除 :process
标记在你的清单中,因为你正在做的事情不需要它。
如果您真的想创建和启动本地或后台服务,您应该查看:
谢谢您的回答。
我终于通过向 CurrencyUpdateService class 添加一个 intent 过滤器属性来让它工作,但我意识到我真正需要的是一个粘性服务,它会 运行 即使申请已关闭。
我完成了一项每天在指定时间 运行ning 的服务(由于服务粘滞,应用程序关闭后 5 秒)+ BroadcastReceiver 用于系统重启以重新安排服务 + 几个其他广播接收器,使应用程序更智能地工作。
唯一要记住的是,当涉及到短时间间隔(< 10 分钟)的测试时,不要相信 AlarmManager,因为有时它会触发警报。
我通常不会在这样的论坛上发帖,但今天我的挫败感达到了顶峰。
我正在尝试实施一种解决方案,让我每隔 hour/day 更新我的应用程序中的汇率列表(无关紧要)。我在许多论坛上寻找我的问题的答案,但即使其他人也有同样的问题,即没有调用 onReceive,none 的答案帮助了我。
我目前正在尝试 运行 一个由 AlarmManager 的 SetRepeating 方法触发的广播接收器。我的 Main activity + Receiver + Manifest 代码如下所示:
主要方法(只是一段启动闹钟的代码):
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"/>
我尝试 运行在新的解决方案中修改代码,但没有成功。我尝试使用不同类型的警报类型和服务,但没有成功。
请随意提出您自己的解决方案,并嘲笑我提出明显的问题;)
1st) 使用 BroadcastReceiver
属性标记您的广播接收器 class,以便在编译时在您的 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 class 名称标识符,因此如果您不为 class 硬编码名称, 无法手动编辑清单来添加此项。
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();
}
}
注意:
AndroidManifest.xml 现在包含:
<receiver android:name="com.sushihangover.alarmso.Foobar" />
2nd) 至于为什么要尝试启动新进程,请记住 BroadcastReceiver
不是 Android Service
... 您可以删除 :process
标记在你的清单中,因为你正在做的事情不需要它。
如果您真的想创建和启动本地或后台服务,您应该查看:
谢谢您的回答。
我终于通过向 CurrencyUpdateService class 添加一个 intent 过滤器属性来让它工作,但我意识到我真正需要的是一个粘性服务,它会 运行 即使申请已关闭。
我完成了一项每天在指定时间 运行ning 的服务(由于服务粘滞,应用程序关闭后 5 秒)+ BroadcastReceiver 用于系统重启以重新安排服务 + 几个其他广播接收器,使应用程序更智能地工作。
唯一要记住的是,当涉及到短时间间隔(< 10 分钟)的测试时,不要相信 AlarmManager,因为有时它会触发警报。