【问题标题】:Xamarin Forms (Android) StartForegroundService not work (App crash)Xamarin Forms (Android) StartForegroundService 不起作用(应用程序崩溃)
【发布时间】:2018-12-08 11:11:21
【问题描述】:

xamarin 表单应在 Android 8.0 版本上使用 StartForegroundService 服务启动,因为它以执行 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);
    }
}

我的receiverScreen.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): 在 android.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):在 md5108cbe39ce2243540ccf5f375034c930.ServiceScreen.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(13002): 在 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): 在 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(Native Method) 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,Thread*=0xa6b4ec00,peer=0x12d41350,“信号捕捉器”]:对信号 3 做出反应 12-08 10:58:09.466 I/合子 (13002): 12-08 10:58:09.505 I/zygote (13002):将堆栈跟踪写入“[墓碑]” 12-08 10:58:10.378 D/AndroidRuntime(13002): 关闭虚拟机 12-08 10:58:10.381 E/AndroidRuntime(13002): 致命异常: main 12-08 10:58:10.381 E/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): 在 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.reflect.Method.invoke(Native Method) 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:

【问题讨论】:

  • 如果this is the code you're running 仍然是您获得的堆栈跟踪,那么您的startForeground() 方法中的某些东西似乎正在引发异常,但您基本上忽略了它。要么在日志中的其他地方查找 Log.Debug("Error", e.ToString()); 日志,要么删除 try-catch 以便 Exception 导致它崩溃,然后这将是堆栈跟踪中的主要异常。

标签: android xamarin xamarin.forms xamarin.android android-service


【解决方案1】:

第一。您可以创建一个 Service 实例来获取 Java 类:

new ServiceScreen().Class

使用接受 C# 类型的重载创建您的意图或通过 Java.Lang.Class.FromType 获取 Java 类

例子:

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

Context.startForegroundService() 没有调用 Service.startForeground()

第二。您正在调用 StartForegroundService,但在创建服务时未调用 StartForeground。这必须在设定的时间内完成,否则操作系统将终止服务。

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

注意:您可以在服务的 OnCreate() 覆盖范围内执行此操作。

【讨论】:

  • 不起作用:/我到处搜索,但找不到明确的来源,请您帮帮我吗?一种来源,一种方式...
  • @UfukŞahin 您是否按照我的回答在您的服务中添加了对StartForeground 的调用?
  • @UfukŞahin 您发布的错误表明您在调用 StartForegroundService 后没有调用 StartForeground :Context.startForegroundService() did not then call Service.startForeground()
  • 感谢您的支持,您是个好人。我的所有服务代码codeshare.io/UbKVU
猜你喜欢
  • 2021-05-26
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
相关资源
最近更新 更多