【问题标题】:Can't start intent service in xamarin.android无法在 xamarin.android 中启动意图服务
【发布时间】:2017-09-29 13:50:58
【问题描述】:

无法启动意图服务

当应用程序处于前台、后台或睡眠状态时,我每 10 分钟编写一次同步数据的代码。我已经为它编写了weakfulintentservice,它从Alaramreceiver 调用它,但AppService 没有得到调用。

应用服务

 public class AppService : WakefulIntentService
{
    public AppService() : base("AppService")
    {

    }

    protected override void DoWakefulWork(Intent intent)
    {
        Toast.MakeText(this, "In service", ToastLength.Short).Show();
        Log.Info("AppService", "I'm awake! I'm awake!");
    }
}

WeakFulIntentService

abstract public class WakefulIntentService : IntentService
{
    abstract protected void DoWakefulWork(Intent intent);
    public static string NAME = "com.jondouglas.wakeful.WakefulIntentService";
    public static string LAST_ALARM = "lastAlarm";
    private static volatile PowerManager.WakeLock lockStatic = null;

    [MethodImpl(MethodImplOptions.Synchronized)]
    private static PowerManager.WakeLock GetLock(Context context)
    {
        if (lockStatic == null)
        {
            PowerManager manager = (PowerManager) context.GetSystemService(Context.PowerService);

            lockStatic = manager.NewWakeLock(WakeLockFlags.Partial, NAME);
            lockStatic.SetReferenceCounted(true);
        }
        return (lockStatic);
    }

    public static void SendWakefulWork(Context context, Intent intent)
    {
        GetLock(context.ApplicationContext); //Possibly use of acquire here
        context.StartService(intent);
    }

    public static void SendWakefulWork(Context context, Type classService)
    {
        SendWakefulWork(context, new Intent(context, classService));
    }

    public static void ScheduleAlarms(IAlarmListener alarmListener, Context context)
    {
        ScheduleAlarms(alarmListener, context, true);
    }

    public static void ScheduleAlarms(IAlarmListener alarmListener, Context context, bool force)
    {
        ISharedPreferences preferences = context.GetSharedPreferences(NAME, 0);
        long lastAlarm = preferences.GetLong(LAST_ALARM, 0);

        if (lastAlarm == 0 || force ||
            (DateTime.Now.Millisecond > lastAlarm &&
             DateTime.Now.Millisecond - lastAlarm > alarmListener.GetMaxAge()))
        {
            AlarmManager manager = (AlarmManager) context.GetSystemService(Context.AlarmService);
            Intent intent = new Intent(context, typeof(AlarmReceiver));
            PendingIntent pendingIntent = PendingIntent.GetBroadcast(context, 0, intent, 0);
            alarmListener.ScheduleAlarms(manager, pendingIntent, context);
        }
    }

    public static void CancelAlarms(Context context)
    {
        AlarmManager manager = (AlarmManager) context.GetSystemService(Context.AlarmService);
        Intent intent = new Intent(context, typeof (AlarmReceiver));
        PendingIntent pendingIntent = PendingIntent.GetBroadcast(context, 0, intent, 0);
        manager.Cancel(pendingIntent);
        context.GetSharedPreferences(NAME, 0).Edit().Remove(LAST_ALARM).Commit();
    }

    public WakefulIntentService(string name) : base(name)
    {
        SetIntentRedelivery(true);
    }

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {
        PowerManager.WakeLock wakeLock = GetLock(this.ApplicationContext);

        if (!lockStatic.IsHeld || (flags & StartCommandFlags.Redelivery) != 0)
        {
            wakeLock.Acquire();
        }
        return base.OnStartCommand(intent, flags, startId);

        return (StartCommandResult.RedeliverIntent);
    }

    protected override void OnHandleIntent(Intent intent)
    {
        try
        {
            DoWakefulWork(intent);
        }
        finally
        {
            PowerManager.WakeLock wakeLock = GetLock(this.ApplicationContext);

            if (wakeLock.IsHeld)
            {
                try
                {
                    wakeLock.Release();
                }
                catch (Exception ex)
                {
                    Log.Error(Class.SimpleName, "Exception when releasing wakelock", ex);
                    //Log exception when releasing wakelock
                }
            }
        }
    }

    public interface IAlarmListener
    {
        void ScheduleAlarms(AlarmManager manager, PendingIntent pendingIntent, Context context);
        void SendWakefulWork(Context context);
        long GetMaxAge();
    }   

CallToAppService

      public void SendWakefulWork(Context context)
    {
        WakefulIntentService.SendWakefulWork(context, typeof(AppService));
    }

AppService 的调用 context.StartService(intent);从weakfulintentservice完美执行 但 AppService 无法在 xamarin.android 中启动。 请帮我解决这个问题。

【问题讨论】:

  • 它与带有java的原生android完美配合。

标签: xamarin.forms xamarin.android


【解决方案1】:

AppService 的调用 context.StartService(intent);从 weakfulintentservice 执行完美,但 AppService 无法在 xamarin.android 中启动。

您可以参考Started Services,在您想要启动AppService 的Xamarin.Android 代码中,您可以像这样简单地编写代码:

StartService (new Intent (this, typeof(AppService)));

如果你想用intent filter启动服务,可以参考this part

你也可以参考我几天前回答的案例:Xamarin Android : Change UI TextView text from Service or Receiver

【讨论】:

  • @SwapnilWakchaure,您是否在AppService 的顶部添加了属性[Service]
  • @SwapnilWakchaure,我测试了demo,工作正常......
  • 通过从 [Service] 中删除 name 属性解决的问题。谢谢格蕾丝
猜你喜欢
  • 2011-03-27
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2012-08-20
相关资源
最近更新 更多