Служба Android остановлена - PullRequest
       15

Служба Android остановлена

0 голосов
/ 27 января 2019

Я пишу приложение для Android с Xamarin.Это приложение выполняет некоторые длительные задачи, показывает уведомления для пользователя и должно делать это в фоновом режиме.Как я знаю, я должен использовать Сервис для этой цели.Я создал свой сервис, вот его код:

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
    base.OnStartCommand(intent, flags, startId);     

    var thread = new Thread(new Runnable(() => 
    {
        for (int i = 0; i < 10_000; i++)
        {
            ShowNotification("channel", "Search", $"second: {i}, threadId: {id} startId: {startId}");
            Thread.Sleep(1000);
        }                           
        StopSelf(startId);
    }));
    thread.Start();

    return StartCommandResult.StartSticky;
}

И код метода ShowNotification:

protected void ShowNotification(string channel, string title, string message)
{
    Intent resultIntent = new Intent(this, GetType());
    resultIntent.AddFlags(ActivityFlags.NewTask);

    var resultPendingIntent = PendingIntent.GetActivity(this, 0, resultIntent, PendingIntentFlags.UpdateCurrent);

    var mBuilder = new NotificationCompat.Builder(this);
    mBuilder.SetSmallIcon(Resource.Mipmap.ic_launcher)
        .SetContentTitle(title)
        .SetContentText(message)
        .SetAutoCancel(false)
        .SetContentIntent(resultPendingIntent);

    if (!(GetSystemService(NotificationService) is NotificationManager mNotificationManager))
        return;

    if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
    {
        var importance = NotificationImportance.High;
        var notificationChannel = new NotificationChannel(channel, channel, importance);
        notificationChannel.EnableLights(true);
        notificationChannel.LightColor = Color.Red;
        notificationChannel.EnableVibration(true);
        notificationChannel.SetVibrationPattern(new long[] { 100, 200, 300, 400, 500, 400, 300, 200, 400 });
        mBuilder.SetChannelId(channel);
        mNotificationManager.CreateNotificationChannel(notificationChannel);
    }
    mNotificationManager.Notify(0, mBuilder.Build());
}

Этот код работает, но через 2-5 минут сервис останавливается и новыйуведомления не отображаются.Можно ли запретить остановку моего сервиса (или перезапустить его после остановки)?Я слышал, что должен вернуть флаг START_STICKY из метода OnStartCommand, и я им пользуюсь.Но это не работает, и операционная система все равно останавливает мой сервис.Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 27 января 2019

Как уже сказал SushiHangover, вы должны вызвать startForeground() в OnStartCommand (), а при запуске сервера вызвать startForegroundService()

...