Reputation: 11872
I've been attempting to get a toy intent service running for monodroid essentially going off of this source material and I've been having some issues and I've gotten it down to the broadcast receiver. More than anything I'm suspicious of the ACTION_RESP
string. If nothing else I could certainly stand maybe confirmation of that and maybe the correct way to set an action that the receiver can see.
So, this is what I have thus far...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
namespace Mono_For_Android_Intent_Service
{
[Service]
public class TestIntentService : IntentService
{
public static String PARAM_IN_MSG = "imsg";
public static String PARAM_OUT_MSG = "omsg";
#region Constructor
public TestIntentService()
: base("TestIntentService")
{
}
#endregion
protected override void OnHandleIntent(Intent intent)
{
string msg = intent.GetStringExtra(PARAM_IN_MSG);
//Do Stuff
string result = msg + " " + DateTime.Now.ToString();
Intent BroadcastIntent = new Intent(this,typeof(Mono_For_Android_Intent_Service.MainActivity.MyBroadcastReceiver));
BroadcastIntent.SetAction(Mono_For_Android_Intent_Service.MainActivity.MyBroadcastReceiver.ACTION_RESP);
BroadcastIntent.AddCategory(Intent.CategoryDefault);
BroadcastIntent.PutExtra(PARAM_OUT_MSG,result);
SendBroadcast(BroadcastIntent);
}
}
}
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
namespace Mono_For_Android_Intent_Service
{
[Activity(Label = "Mono_For_Android_Intent_Service", MainLauncher = true, Icon = "@drawable/icon")]
public partial class MainActivity : Activity
{
private MyBroadcastReceiver Receiver;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
IntentFilter filter = new IntentFilter(MyBroadcastReceiver.ACTION_RESP);
filter.AddCategory(Intent.CategoryDefault);
Receiver = new MyBroadcastReceiver();
RegisterReceiver(Receiver, filter);
var button = FindViewById<Button>(Resource.Id.start);
button.Click += (s,e)=>
{
Intent msgIntent= new Intent(this,typeof(TestIntentService));
msgIntent.PutExtra(TestIntentService.PARAM_IN_MSG,"Me message, arh");
Toast.MakeText(this, "Starting intent service!", ToastLength.Short).Show();
StartService(msgIntent);
};
TextView txtView = FindViewById<TextView>(Resource.Id.status);
}
public class MyBroadcastReceiver : BroadcastReceiver
{
public static readonly string ACTION_RESP = "Mono_For_Android_Intent_Service.Intent.Action.MESSAGE_PROCESSED";
public override void OnReceive(Context context, Intent intent)
{
Toast.MakeText(context, "Firing On Receive!", ToastLength.Short).Show();
var activity = (MainActivity)context;
TextView txtView = activity.FindViewById<TextView>(Resource.Id.status);
txtView.Text = intent.GetStringExtra(TestIntentService.PARAM_OUT_MSG).ToString();
Toast.MakeText(context, "On Receive complete!", ToastLength.Short).Show();
}
}
}
}
Upvotes: 3
Views: 3145
Reputation: 9982
If you want your broadcast receiver to be registered with the system, you need to add the [BroadcastReceiver] attribute.
Sample:
https://github.com/xamarin/monodroid-samples/blob/master/ApiDemo/App/OneShotAlarm.cs
Upvotes: 4