Xamarin Forms (Android) StartForegroundService 不工作(应用程序崩溃)
Xamarin Forms (Android) StartForegroundService not work (App crash)
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): Service md5108cbe39ce2243540ccf5f375034c930.ServiceScreen has leaked IntentReceiver com.xxx.xxx.receiverScreen@14a30de that was originally registered here. Are you missing a call to unregisterReceiver()?
12-08 10:58:09.089 E/ActivityThread(13002): android.app.IntentReceiverLeaked: Service md5108cbe39ce2243540ccf5f375034c930.ServiceScreen has leaked IntentReceiver com.xxx.xxx.receiverScreen@14a30de that was originally registered here. Are you missing a call to unregisterReceiver()?
12-08 10:58:09.089 E/ActivityThread(13002): at android.app.LoadedApk$ReceiverDispatcher.(LoadedApk.java:1351)
12-08 10:58:09.089 E/ActivityThread(13002): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:1132)
12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1421)
12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1394)
12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1382)
12-08 10:58:09.089 E/ActivityThread(13002): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:609)
12-08 10:58:09.089 E/ActivityThread(13002): at md5108cbe39ce2243540ccf5f375034c930.ServiceScreen.n_onStartCommand(Native Method)
12-08 10:58:09.089 E/ActivityThread(13002): at md5108cbe39ce2243540ccf5f375034c930.ServiceScreen.onStartCommand(ServiceScreen.java:39)
12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3474)
12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ActivityThread.-wrap20(Unknown Source:0)
12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
12-08 10:58:09.089 E/ActivityThread(13002): at 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): at android.app.ActivityThread.main(ActivityThread.java:6494)
12-08 10:58:09.089 E/ActivityThread(13002): at java.lang.reflect.Method.invoke(Native Method)
12-08 10:58:09.089 E/ActivityThread(13002): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
12-08 10:58:09.089 E/ActivityThread(13002): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
12-08 10:58:09.466 I/zygote (13002): Thread[3,tid=13008,WaitingInMainSignalCatcherLoop,Thread*=0xa6b4ec00,peer=0x12d41350,"Signal Catcher"]: reacting to signal 3
12-08 10:58:09.466 I/zygote (13002):
12-08 10:58:09.505 I/zygote (13002): Wrote stack traces to '[tombstoned]'
12-08 10:58:10.378 D/AndroidRuntime(13002): Shutting down VM
12-08 10:58:10.381 E/AndroidRuntime(13002): FATAL EXCEPTION: main
12-08 10:58:10.381 E/AndroidRuntime(13002): Process: com.xxx.xxx, PID: 13002
12-08 10:58:10.381 E/AndroidRuntime(13002): android.app.RemoteServiceException: Context.startForegroundService() did not then call 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): at android.os.Handler.dispatchMessage(Handler.java:106)
12-08 10:58:10.381 E/AndroidRuntime(13002): at android.os.Looper.loop(Looper.java:164)
12-08 10:58:10.381 E/AndroidRuntime(13002): at android.app.ActivityThread.main(ActivityThread.java:6494)
12-08 10:58:10.381 E/AndroidRuntime(13002): at java.lang.reflect.Method.invoke(Native Method)
12-08 10:58:10.381 E/AndroidRuntime(13002): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
12-08 10:58:10.381 E/AndroidRuntime(13002): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Unhandled Exception:
Android.Util.AndroidRuntimeException:
第一。您可以创建一个服务实例来获取 Java class:
new ServiceScreen().Class
使用接受 C# 类型的重载创建您的意图,或通过 Java.Lang.Class.FromType
获取 Java class
示例:
var intent = new Intent(ApplicationContext, typeof(ServiceScreen));
var intent = new Intent(ApplicationContext, Java.Lang.Class.FromType(typeof(ServiceScreen));
Context.startForegroundService() did not then call Service.startForeground()
第二。您正在调用 StartForegroundService
而不是在服务创建过程中调用 StartForeground
。这必须在规定的时间内完成,否则 OS 将终止服务。
var notification = ForegroundNotification("Some Title", "Some User notification");
StartForeground(99, notification);
注意:您可以在服务的 OnCreate()
覆盖中执行此操作。
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): Service md5108cbe39ce2243540ccf5f375034c930.ServiceScreen has leaked IntentReceiver com.xxx.xxx.receiverScreen@14a30de that was originally registered here. Are you missing a call to unregisterReceiver()? 12-08 10:58:09.089 E/ActivityThread(13002): android.app.IntentReceiverLeaked: Service md5108cbe39ce2243540ccf5f375034c930.ServiceScreen has leaked IntentReceiver com.xxx.xxx.receiverScreen@14a30de that was originally registered here. Are you missing a call to unregisterReceiver()? 12-08 10:58:09.089 E/ActivityThread(13002): at android.app.LoadedApk$ReceiverDispatcher.(LoadedApk.java:1351) 12-08 10:58:09.089 E/ActivityThread(13002): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:1132) 12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1421) 12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1394) 12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1382) 12-08 10:58:09.089 E/ActivityThread(13002): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:609) 12-08 10:58:09.089 E/ActivityThread(13002): at md5108cbe39ce2243540ccf5f375034c930.ServiceScreen.n_onStartCommand(Native Method) 12-08 10:58:09.089 E/ActivityThread(13002): at md5108cbe39ce2243540ccf5f375034c930.ServiceScreen.onStartCommand(ServiceScreen.java:39) 12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3474) 12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ActivityThread.-wrap20(Unknown Source:0) 12-08 10:58:09.089 E/ActivityThread(13002): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692) 12-08 10:58:09.089 E/ActivityThread(13002): at 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): at android.app.ActivityThread.main(ActivityThread.java:6494) 12-08 10:58:09.089 E/ActivityThread(13002): at java.lang.reflect.Method.invoke(Native Method) 12-08 10:58:09.089 E/ActivityThread(13002): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 12-08 10:58:09.089 E/ActivityThread(13002): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 12-08 10:58:09.466 I/zygote (13002): Thread[3,tid=13008,WaitingInMainSignalCatcherLoop,Thread*=0xa6b4ec00,peer=0x12d41350,"Signal Catcher"]: reacting to signal 3 12-08 10:58:09.466 I/zygote (13002): 12-08 10:58:09.505 I/zygote (13002): Wrote stack traces to '[tombstoned]' 12-08 10:58:10.378 D/AndroidRuntime(13002): Shutting down VM 12-08 10:58:10.381 E/AndroidRuntime(13002): FATAL EXCEPTION: main 12-08 10:58:10.381 E/AndroidRuntime(13002): Process: com.xxx.xxx, PID: 13002 12-08 10:58:10.381 E/AndroidRuntime(13002): android.app.RemoteServiceException: Context.startForegroundService() did not then call 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): at android.os.Handler.dispatchMessage(Handler.java:106) 12-08 10:58:10.381 E/AndroidRuntime(13002): at android.os.Looper.loop(Looper.java:164) 12-08 10:58:10.381 E/AndroidRuntime(13002): at android.app.ActivityThread.main(ActivityThread.java:6494) 12-08 10:58:10.381 E/AndroidRuntime(13002): at java.lang.reflect.Method.invoke(Native Method) 12-08 10:58:10.381 E/AndroidRuntime(13002): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 12-08 10:58:10.381 E/AndroidRuntime(13002): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Unhandled Exception:
Android.Util.AndroidRuntimeException:
第一。您可以创建一个服务实例来获取 Java class:
new ServiceScreen().Class
使用接受 C# 类型的重载创建您的意图,或通过 Java.Lang.Class.FromType
示例:
var intent = new Intent(ApplicationContext, typeof(ServiceScreen));
var intent = new Intent(ApplicationContext, Java.Lang.Class.FromType(typeof(ServiceScreen));
Context.startForegroundService() did not then call Service.startForeground()
第二。您正在调用 StartForegroundService
而不是在服务创建过程中调用 StartForeground
。这必须在规定的时间内完成,否则 OS 将终止服务。
var notification = ForegroundNotification("Some Title", "Some User notification");
StartForeground(99, notification);
注意:您可以在服务的 OnCreate()
覆盖中执行此操作。