Xamarin Forms (Android) StartForegroundService не работает (сбой приложения) - PullRequest
0 голосов
/ 08 декабря 2018

Формы xamarin должны быть запущены с StartForegroundService на версиях Android 8.0 , как известно, что это делает bacgroudservice.

Но мой сервис не запускается имое приложение падает.

Мой код:

 var intent = new Android.Content.Intent(this, new ServiceScreen().Class);
        if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
        {
            StartForegroundService(intent);
        }
        else
        {
            StartService(intent);
        }

Мой ServiceScreen.cs

 public override IBinder OnBind(Intent intent)
    {
        return null;
    }
    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {
        try
        {
            IntentFilter filter = new IntentFilter();
            filter.AddAction(Intent.ActionScreenOn);
            filter.AddAction(Intent.ActionScreenOff);
            BroadcastReceiver broadcast = new receiverScreen();
            RegisterReceiver(broadcast, filter);
        }
        catch (Exception e)
        {
            Log.Debug("Hata", e.ToString());
        }
        return StartCommandResult.Sticky;
    }
    public override void OnDestroy()
    {
        base.OnDestroy();
        var broadcastIntent = new Android.Content.Intent(this, typeof(RestarterBroadcastReceiver));
        SendBroadcast(broadcastIntent);
    }
}

Мой приемникScreen.cs

[BroadcastReceiver]
public class receiverScreen : BroadcastReceiver
{
    public override void OnReceive(Context context, Intent intent)
    {

        if (intent.Action.Equals(Intent.ActionScreenOn))
        {
            Toast.MakeText(context, "On Screen", ToastLength.Long).Show();
            Log.Debug(TAG, "-------------- on !");
        }
        else if (intent.Action.Equals(Intent.ActionScreenOff))
        {
            Toast.MakeText(context, "Off Screen", ToastLength.Long).Show();
            Log.Debug(TAG, "-------------- off !");
        }
    }
}

МойВыходные данные приложения

12-08 10: 58: 09.089 E / ActivityThread (13002): Сервис md5108cbe39ce2243540ccf5f375034c930.ServiceScreen просочился IntentReceiver com.xxx.xxx.receiverScreen@14a30de, который был первоначально зарегистрирован здесь.Вы пропускаете вызов unregisterReceiver ()?12-08 10: 58: 09.089 E / ActivityThread (13002): android.app.IntentReceiverLeaked: Service md5108cbe39ce2243540ccf5f375034c930.ServiceScreen просочился IntentReceiver com.xxx.xxx.receiverScreen@14a30de, который был первоначально зарегистрирован здесь.Вы пропускаете вызов unregisterReceiver ()?12-08 10: 58: 09.089 E / ActivityThread (13002): на android.app.LoadedApk $ ReceiverDispatcher. (LoadedApk.java:1351) 12-08 10: 58: 09.089 E / ActivityThread (13002): на android.app.LoadedApk.getReceiverDispatcher (LoadedApk.java:1132) 12-08 10: 58: 09.089 E / ActivityThread (13002): atroid.app.ContextImpl.registerReceiverInternal (ContextImpl.java:1421) 12-08 10: 58: 09.089 E/ ActivityThread (13002): в android.app.ContextImpl.registerReceiver (ContextImpl.java:1394) 12-08 10: 58: 09.089 E / ActivityThread (13002): в android.app.ContextImpl.registerReceiver (ContextImpl.java:1382) 12-08 10: 58: 09.089 E / ActivityThread (13002): в android.content.ContextWrapper.registerReceiver (ContextWrapper.java:609) 12-08 10: 58: 09.089 E / ActivityThread (13002): в md5108cbe39ce2243540ccf5f375034cc..n_onStartCommand (собственный метод) 12-08 10: 58: 09.089 E / ActivityThread (13002): в md5108cbe39ce2243540ccf5f375034c930.ServiceScreen.onStartCommand (ServiceScreen.java:39) 12-08 10: 58: 09.089 E / ActivityThread (Android.app.ActivityThread.handleServiceArgs (ActivityThread.java:3474) 12-08 10: 58: 09.089 E / ActivityThread (13002): в android.app.ActivityThread.-wrap20 (неизвестный источник: 0) 12-08 10:58: 09.089 E / ActivityThread (13002): в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1692) 12-08 10: 58: 09.089 E / ActivityThread (13002): в android.os.Handler.dispatchMessage (Handler.java:106) 12-08 10: 58: 09.089 E / ActivityThread (13002): at android.os.Looper.loop (Looper.java:164) 12-08 10: 58: 09.089 E / ActivityThread (13002): в android.app.ActivityThread.main (ActivityThread.java:6494) 12-08 10: 58: 09.089 E / ActivityThread (13002): в java.lang.reflect.Method.invoke (собственный метод) 12-08 10:58: 09.089 E / ActivityThread (13002): на com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:438) 12-08 10: 58: 09.089 E / ActivityThread (13002): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807) 12-08 10: 58: 09.466 I / zygote (13002): поток [3, tid = 13008, WaitingInMainSignalCatcherLoop, поток * = 0xa6b4ec00, peer = 0x12d41350, "Ловец сигналов"]: реагирование на сигнал 3 12-08 10: 58: 09.466 I / zygote (13002): 12-08 10: 58: 09.505 I / zygote (13002): написал трассировки стека в'[tombstoned]' 12-08 10: 58: 10.378 D / AndroidRuntime (13002): завершение работы VM 12-08 10: 58: 10.381 E / AndroidRuntime (13002): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 12-08 10: 58: 10.381E / AndroidRuntime (13002): Процесс: com.xxx.xxx, PID: 13002 12-08 10: 58: 10.381 E / AndroidRuntime (13002): android.app.RemoteServiceException: Context.startForegroundService () тогда не вызывал Service.startForeground () 12-08 10: 58: 10.381 E / AndroidRuntime (13002): at android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1768) 12-08 10: 58: 10.381 E / AndroidRuntime (13002):на android.os.Handler.dispatchMessage (Handler.java:106) 12-08 10: 58: 10.381 E / AndroidRuntime (13002): на android.os.Looper.loop (Looper.java:164)12-08 10: 58: 10.381 E / AndroidRuntime (13002): на android.app.ActivityThread.main (ActivityThread.java:6494) 12-08 10: 58: 10.381 E / AndroidRuntime (13002): на java.lang.refle.Method.invoke (собственный метод) 12-08 10: 58: 10.381 E / AndroidRuntime (13002): в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:438) 12-08 10:58: 10.381 E / AndroidRuntime (13002): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:807) Необработанное исключение:

Android.Util.AndroidRuntimeException:

1 Ответ

0 голосов
/ 08 декабря 2018

первый.Вы можете создать экземпляр Service только для получения класса Java:

new ServiceScreen().Class

Создайте свое намерение, используя перегрузку, которая принимает тип C #, или получите класс Java с помощью Java.Lang.Class.FromType

Пример:

var intent = new Intent(ApplicationContext, typeof(ServiceScreen));
var intent = new Intent(ApplicationContext, Java.Lang.Class.FromType(typeof(ServiceScreen));

Context.startForegroundService () не вызывал Service.startForeground ()

2nd.Вы звоните StartForegroundService, но не звоните StartForeground при создании Сервиса.Это должно быть сделано в течение установленного периода времени, в противном случае ОС прекратит работу Службы.

var notification = ForegroundNotification("Some Title", "Some User notification");
StartForeground(99, notification);

Примечание. Это можно сделать в переопределении OnCreate() Службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...