Xamarin Android VS - Сбой на телефоне 8.0 - PullRequest
0 голосов
/ 02 июля 2018

С тех пор, как я начал тестировать приложение с android oreo OS, происходит странное падение.

В течение некоторого времени (иногда день, а другие занимает 2-3 дня) служба переднего плана будет аварийно завершать работу без остановки. Из отладки, которую я получил, написано android.runtime.JavaProxyThrowable, но я не уверен, кто на самом деле виновник. Странно также то, что происходит сбой после его запуска, но функция, которая говорит, что является причиной сбоя, должна вызываться только один раз при запуске службы (OnStartCommand).

Из того, что я видел, виновником является OnStartCommand, или так говорит ошибка, но я не совсем уверен в том, что является реальной проблемой и как ее исправить. Удаление всего нового кода, добавленного после начала работы с 8.0 Oreo, не дало никаких результатов.

Кто-нибудь еще имел эту проблему и есть решение?

Код:

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

            LoadSet();//load settings
            accumulatedTrafficDown += intent.GetLongExtra("aDownBootup", 0);
            accumulatedTrafficUp += intent.GetLongExtra("aUpBootup", 0);

            connectivityManager = (ConnectivityManager)(Application.Context.GetSystemService(ConnectivityService));
            wifiManager = (WifiManager)(Application.Context.GetSystemService(WifiService));
            notificationManager = (NotificationManager)GetSystemService(NotificationService);

            builder = new Notification.Builder(this)
                .SetSmallIcon(Resource.Drawable.ITMIcon)
                .SetOngoing(true)//API 11
                .SetShowWhen(false)//API 17
                .SetVisibility(NotificationVisibility.Public)
                ;

            if ((int)Build.VERSION.SdkInt >= 26)
            {
                string chanName = GetString(Resource.String.noti_chan_normal);
                var importance = NotificationImportance.Low;

                NotificationChannel chan = new NotificationChannel(DEF_CHANNEL, chanName, importance)
                {
                    LockscreenVisibility = NotificationVisibility.Public
                };
                chan.EnableLights(false);
                chan.EnableVibration(false);
                chan.SetShowBadge(false);
                chan.SetBypassDnd(true);

                notificationManager.CreateNotificationChannel(chan);
                builder.SetChannelId(DEF_CHANNEL);

                chan.Dispose();
            }

            //open main app when notification is clicked
            using (Intent intentMA = new Intent(this/*Application.ApplicationContext*/, typeof(MainActivity)))
            {
                intentMA.AddFlags(ActivityFlags.ReceiverForeground);

                using (PendingIntent pendingIntent = PendingIntent.GetActivity(this, 0, intentMA, PendingIntentFlags.UpdateCurrent))
                {
                    builder.SetContentIntent(pendingIntent);
                }
            }

            StartForeground(notificationId/*(int)NotificationFlags.ForegroundService*/, builder.Build());

            lastNetworkTrafficDown = TrafficStats.TotalRxBytes;
            lastNetworkTrafficUp = TrafficStats.TotalTxBytes;

            //for drawing to tray
            bm = Bitmap.CreateBitmap(bitmapSize, bitmapSize, Bitmap.Config.Argb4444, true);
            canvas = new Canvas(bm);
            bounds = new Rect();
            paint = new Paint(PaintFlags.LinearText) { Color = Color.White };
            paint.SetStyle(Paint.Style.Fill);
            paint.SetShadowLayer(4f, 2f, 2f, Color.Black);//(int)(bitmapSize * 0.03125f), (int)(bitmapSize * 0.015625f), (int)(bitmapSize * 0.015625f)
            paint.TextAlign = Paint.Align.Center;
            using (Typeface bold = Typeface.Create(paint.Typeface, TypefaceStyle.Bold))
            {
                paint.SetTypeface(bold);
            }

            UpdateNotification();

            return StartCommandResult.Sticky;
        }

Ошибка:

android.runtime.JavaProxyThrowable: at ITM.NotificationService.OnStartCommand (Android.Content.Intent intent, Android.App.StartCommandFlags flags, System.Int32 startId) [0x00016] in <8eb370332be94963ab6dd55bf21270bf>:0
at Android.App.Service.n_OnStartCommand_Landroid_content_Intent_II (System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_intent, System.Int32 native_flags, System.Int32 startId) [0x0000f] in <5714ccdc0ab84d74bb3e08064f494a0a>:0
at (wrapper dynamic-method) System.Object.f8a85e62-c1d3-4a9f-baf4-1379f6e1f4f1(intptr,intptr,intptr,int,int)
  at com.nevaran.ITMNotificationService.n_onStartCommand (Native Method)
  at com.nevaran.ITMNotificationService.onStartCommand (ITMNotificationService.java:31)
  at android.app.ActivityThread.handleServiceArgs (ActivityThread.java:3679)
  at android.app.ActivityThread.-wrap21 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1801)
  at android.os.Handler.dispatchMessage (Handler.java:105)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6944)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...