从Xamarin forms启动Android服务

6
在Visual Studio中,我创建了一个新的类库(Xamarin Forms):- Xamarin类库 在这里,我添加了我的服务,并为启动服务提供了最基本的实现(注意 - 不是绑定服务。期望 - 在应用程序启动/停止时显示toast消息:-
namespace AndroidBatteryService
{
    public class AndroidBatteryService : Service
    {

        public AndroidBatteryService()
        {

        }

        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent,    [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            Toast.MakeText(this, "The Battery Service was just started",  ToastLength.Long).Show();
            return base.OnStartCommand(intent, flags, startId);
        }

        public override void OnCreate()
        {
            base.OnCreate();
        }

        public override void OnDestroy()
        {
            base.OnDestroy();
            Toast.MakeText(this, "The Battery Service has been stopped",     ToastLength.Long).Show();
        }

        public override IBinder OnBind(Intent intent)
        {
            //started service, NOT a binded service - return null...
            return null;
        }
   }
}

在另一个项目中,我通过运行以下代码调用此服务:-
public void StartBatteryService()
{
    Intent intent = new Intent(Android.App.Application.Context, typeof(AndroidBatteryService.AndroidBatteryService));
    Android.App.Application.Context.StartService(intent);
}

代码能够运行(我可以逐步执行它),但实际服务中的OnStartCommand方法未运行,而我希望它能够运行。有任何想法吗?

1
我在可移植类库中看到了你的服务定义。这应该是不可能的,因为“服务”不是可移植类,应该在Android项目中。你能解释一下吗? - Yuri S
还有,为什么你需要GeneratedEnum? - Yuri S
从我的最新实验来看,OnDestroy函数可能不会被调用。 - Yuri S
1个回答

7
我认为问题出在您需要使用以下语句装饰服务类:-
[Service (Label = "AndroidBatteryService", Icon = "@drawable/Icon") ]

这会导致Xamarin在构建过程中将以下内容放入生成的AndroidManifest.xml文件中(您可以在 \obj\Debug\android 目录中找到该文件)。
<service android:icon="@drawable/icon" android:label="AndroidBatteryService" android:name="md55...1a.AndroidBatteryService" />

我在我的应用中使用了非常相似的代码,并且它很好地运行了。(虽然你现在可能已经解决了这个问题。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接