Xamarin Android 8.0 创建前景服务的个人粗略总结(不是详细教程)

我说的可能有错误

主要的是要想使前景服务不会睡眠,则需要定时更新通知,譬如下载服务更新进度,否则我的测试是一会就不运行了,类似挂起而不是杀死

 

1.前景服务需要创建通知,面向8.0需要事先创建通知管道

2.8.0启动前景服务需要使用StartForegroundService而不是StartServer

3.在服务中需要调用StartForeground传入一个通知对象将自己注册为前景服务

4.要使前景服务不会睡眠,则需要定时更新通知

 

创建最简单最粗略的通知管道的方法,主要的参数是管道id,创建通知时要使用

public static void CreateNotificationChannel(ContextWrapper context, string channelID, string channelName)
        {
            if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
            {
                ((NotificationManager)context.GetSystemService(Context.NotificationService))
                            .CreateNotificationChannel(new NotificationChannel(channelID, channelName, NotificationImportance.Default));
            }
        }

 

下面是创建通知的简化方法, 一个通知标题,文本,图标,一个前景服务貌似必须设置为True的项, 通知管道id在NotificationCompat.Builder构造函数填入

 

public static Notification CreateServerNotification(string contentTitle, string contentText, Context context, string channelID)
        {
            return new NotificationCompat.Builder(context, channelID)
                               .SetContentTitle(contentTitle)
                               .SetContentText(contentText)
                               .SetSmallIcon(Resource.Mipmap.icon)
                               .SetOngoing(true)
                               .Build();
        }

 

发布通知的方法,更新通知只需要通知id(不是管道id)不变重新创建一个Notification对象然后调用便可,

        public static void CreateUpServerNotificationFunc(ContextWrapper context, int notificationID, Notification notification)
        {
            ((NotificationManager)context.GetSystemService(Context.NotificationService))
                           .Notify(notificationID, notification);

        }

 

 

然后android 8.0开启前景服务需要使用StartForegroundService

 public static void StartServer(ContextWrapper context, Intent intent)
        {
            context.StartForegroundService(intent);
        }

然后服务可以这样写

    [Service]
    public sealed class MyServer : Service
    {
        
        public override void OnCreate()
        {
            base.OnCreate();

            
            const int NOTIFICATION_ID = 345;

            const string CHANNEL_ID = "自己起一个id";

            const string CHANNEL_NAME = "自己起一个name";

            CreateNotificationChannel(this, CHANNEL_ID, CHANNEL_NAME);

            var notification = CreateServerNotification("标题", "内容", this, CHANNEL_ID);

            StartForeground(NOTIFICATION_ID, notification);
        }


        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            return StartCommandResult.NotSticky;
        }


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

        public override IBinder OnBind(Intent intent)
        {
            return null;
        }
    }

 

上一篇:xamarin简单数据绑定实例


下一篇:android课程表!大厂offer手到擒来,满满干货指导