.net开发安卓入门 - Service (服务)

news2024/11/25 10:19:02

.net开发安卓入门 - Service

  • Android Service 概述
  • Service VS Thread (服务和线程之间进行选择)
  • 前台服务
    • 代码
    • 启动前台服务方法
    • 运行效果
  • 后台服务
    • 代码
    • 启动代码
  • 绑定服务
    • AIDL
  • 同系列文章推荐


Android Service 概述

移动应用不像桌面应用。 桌面具有大量资源,如屏幕空间、内存、存储空间和连接的电源,移动设备不会。 这些约束强制移动应用的行为方式不同。 例如,移动设备上的小屏幕通常意味着一次只显示一个应用 (,即活动) 可见。 其他活动将移动到后台,并推送到无法执行任何工作的挂起状态。 但是,仅仅因为 Android 应用程序处于后台并不意味着应用无法继续工作。

Android 应用程序至少由以下四个主要组件之一组成:活动、广播接收器、Intent和服务。 活动是许多出色的 Android 应用程序的基石,因为它们提供了允许用户与应用程序交互的 UI。 但是,当涉及到执行并发或后台工作时,活动并不总是最佳选择。

Android 中后台工作的主要机制是 服务。 Android 服务是一个组件,旨在在没有用户界面的情况下执行某些工作。

Service VS Thread (服务和线程之间进行选择)

根据桌面程序开发经验,很容易联想到多线程,因为看上去多线程也能够解决服务所面临的问题,那么在安卓中存在一定由他必然的原因,根据官方文档介绍,我理解成是安卓的一个设计漏洞导致衍生出来的Service这个东西。

官方解释如下(MSDN):
所有 Android 应用程序都有一个 主线程 (也称为 运行活动的 UI 线程) 。 若要使设备保持响应,Android 必须能够以每秒 60 帧的速度更新用户界面。 如果 Android 应用在主线程上执行过多工作,则 Android 会删除帧,这反过来又会导致 UI 显示为混蛋 (有时也称为 简) 。 这意味着,在两个帧之间的时间跨度中,UI 线程上执行的任何工作都应完成,大约 16 毫秒 (每 60 帧 1 秒)

为了解决此问题,开发人员可以使用活动中的线程来执行一些会阻止 UI 的工作。 但是,这可能会导致问题。 Android 可能会销毁并重新创建活动的多个实例。 但是,Android 不会自动销毁线程,这可能会导致内存泄漏。 其中的主要示例是 设备旋转 时 – Android 将尝试销毁活动的实例,然后重新创建一个新实例,这是潜在的内存泄漏 - 活动的第一个实例创建的线程仍将运行。

在这里插入图片描述

那我们看看Google Developer 怎么说的吧
Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。

在服务和线程之间进行选择
简单地说,服务是一种即使用户未与应用交互也可在后台运行的组件,因此,只有在需要服务时才应创建服务,
如果您必须在主线程之外执行操作,但只在用户与您的应用交互时执行此操作,则应创建新线程。

前台服务

前台服务启动后,它必须通过调用 StartForeground 向 Android 注册自身。 如果服务以 Service.StartForegroundService 该方法启动,但不自行注册,则 Android 将停止该服务并将应用标记为非响应。

StartForeground 采用两个参数,这两个参数都是必需的:

  • 用于标识服务的应用程序中唯一的整数值。
  • 只要 Notification 服务正在运行,Android 就会在状态栏中显示的对象。

只要服务正在运行,Android 就会在状态栏中显示通知。 通知至少将为运行该服务的用户提供视觉提示。 理想情况下,通知应为用户提供应用程序的快捷方式,或者可能提供一些操作按钮来控制应用程序。 例如,这是一个音乐播放器 - 显示的通知可能具有暂停/播放音乐的按钮、回退到上一首歌曲或跳到下一首歌曲。

代码

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 我的第一个安卓程序
{
    [Service(Exported = true, Name = "com.lhd.service.TestService")]
    public class TestService : Service
    {
        public override void OnCreate()
        {
            base.OnCreate();

            Log.Info("XXXXAAA", $"日志信息:当前时间{DateTime.Now}");
        }
        public override IBinder OnBind(Intent intent)
        {
            return null;
        }

        [return: GeneratedEnum]
        public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
        {
            Log.Info("XXXXAAA", $"StartCommandResult:当前时间{DateTime.Now}");
            //DispatchNotificationThatServiceIsRunning();
            //注册ForegroundService
            RegisterForegroundService();
            return StartCommandResult.NotSticky;
        }

        void DispatchNotificationThatServiceIsRunning()
        {
            Notification.Builder notificationBuilder = new Notification.Builder(this, "notice")
                .SetSmallIcon(Resource.Drawable.notice_small)
                .SetContentTitle(Resources.GetString(Resource.String.app_name))
                .SetContentText("TestService 服务!");

            var notificationManager = (NotificationManager)GetSystemService(NotificationService);
            notificationManager.Notify(1000, notificationBuilder.Build());
        }

      private  void RegisterForegroundService()
        {
            var notification = new Notification.Builder(this, "notice")
                .SetContentTitle(Resources.GetString(Resource.String.app_name))
                .SetContentText("卧槽!")
                .SetSmallIcon(Resource.Drawable.notice_small)
                .SetContentIntent(BuildIntentToShowMainActivity())
                .SetOngoing(true)
                .AddAction(BuildRestartTimerAction())
                .AddAction(BuildStopServiceAction())
                .Build();


            // Enlist this instance of the service as a foreground service
            StartForeground(1000, notification);
        }

        /// <summary>
		/// Builds a PendingIntent that will display the main activity of the app. This is used when the 
		/// user taps on the notification; it will take them to the main activity of the app.
		/// </summary>
		/// <returns>The content intent.</returns>
		PendingIntent BuildIntentToShowMainActivity()
        {
            var notificationIntent = new Intent(this, typeof(MainActivity));
            notificationIntent.SetAction("com.lhd.GoMainAction");
            notificationIntent.SetFlags(ActivityFlags.SingleTop | ActivityFlags.ClearTask);
            //notificationIntent.PutExtra(Constants.SERVICE_STARTED_KEY, true);

            var pendingIntent = PendingIntent.GetActivity(this, 0, notificationIntent, PendingIntentFlags.Immutable);
            return pendingIntent;
        }

        /// <summary>
        /// Builds a Notification.Action that will instruct the service to restart the timer.
        /// </summary>
        /// <returns>The restart timer action.</returns>
        Notification.Action BuildRestartTimerAction()
        {
            var restartTimerIntent = new Intent(this, GetType());
            //restartTimerIntent.SetAction(Constants.ACTION_RESTART_TIMER);
            var restartTimerPendingIntent = PendingIntent.GetService(this, 0, restartTimerIntent, PendingIntentFlags.Immutable);

            var builder = new Notification.Action.Builder(Resource.Drawable.ic_mtrl_chip_checked_black,
                                             "周而复始!",
                                              restartTimerPendingIntent);

            return builder.Build();
        }

        /// <summary>
        /// Builds the Notification.Action that will allow the user to stop the service via the
        /// notification in the status bar
        /// </summary>
        /// <returns>The stop service action.</returns>
        Notification.Action BuildStopServiceAction()
        {
            var stopServiceIntent = new Intent(this, GetType());
            //stopServiceIntent.SetAction(Constants.ACTION_STOP_SERVICE);
            var stopServicePendingIntent = PendingIntent.GetService(this, 0, stopServiceIntent, PendingIntentFlags.Immutable);

            var builder = new Notification.Action.Builder(Android.Resource.Drawable.IcMediaPause,
                                                         "事了拂衣去,深藏身与名",
                                                          stopServicePendingIntent);
            return builder.Build();

        }
    }
}

启动前台服务方法

[Java.Interop.Export]
        public void StartService(View view)
        {
            service = new Intent(this, typeof(TestService));
           
            StartForegroundService(service);
           
        }

运行效果

在这里插入图片描述

后台服务

代码

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 我的第一个安卓程序
{
    [Service(Exported = true, Name = "com.lhd.service.ConsoleWriteDateTimeService")]
    public class ConsoleWriteDateTimeService : Service
    {
        public override IBinder OnBind(Intent intent)
        {
            return null;
        }

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

            Task.Run(() =>
            {
                while (true)
                {
                    Log.Info(nameof(ConsoleWriteDateTimeService), $"ConsoleWriteDateTimeService:当前时间{DateTime.Now}");
                    Task.Delay(3000).Wait();
                }
            });
            return StartCommandResult.NotSticky;
        }
    }
}

启动代码


        [Java.Interop.Export]
        public void StartConsoleWriteDateTimeService(View view)
        {
            StartService(new Intent(this, typeof(ConsoleWriteDateTimeService)));
        }

这两个暂时先不学习了,等有空在学吧!
↓↓↓↓↓↓↓↓↓

绑定服务

绑定服务是客户端-服务器接口中的服务器。借助绑定服务,组件(例如 Activity)可以绑定到服务、发送请求、接收响应,以及执行进程间通信 (IPC)。绑定服务通常只在为其他应用组件提供服务时处于活动状态,不会无限期在后台运行。

AIDL

同系列文章推荐

.net开发安卓入门 - 环境安装
.net开发安卓入门 - Hello world!
.net开发安卓入门 - 基本交互(Button,输入EditText,TextView,Toast)
.net开发安卓入门 - 布局与样式
.net开发安卓入门 - Activity
.net开发安卓入门 - Notification(通知)
.net开发安卓入门 -记录两个问题处理办法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/87415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于51单片机的正弦波发生器设计

程序运行图&#xff1a; 仿真原理图&#xff1a; 部分程序&#xff1a; #include <reg52.h> //接口定义 sbit DA P1^1; sbit CK P1^2; sbit CS P1^4; //10bit取样&#xff0c;1024点正弦查表数据 unsigned int code sine_dot[1024] { 0x200,0x203,0x206,0x209,…

可视化编排的数据集成和分发开源框架Nifi轻松入门-上

文章目录概述定义dataflow面临挑战特性核心概念架构高级概述安装部署常见处理器入门示例概述 定义 Nifi 官网地址 https://nifi.apache.org/ Nifi 官网文档 https://nifi.apache.org/docs.html Nifi GitHub源码地址 https://github.com/apache/nifi Apache NiFi是一个易于使用…

NetInside助力IT提高业务性能管理能力(二)

​​需求简介 某外高桥公司的OA系统是其重要的业务系统&#xff0c;OA系统负责人表示&#xff0c;部分用户反馈&#xff0c;访问OA系统时比较慢。需要通过分析系统看一下实际情况。 本次分析重点针对OA系统性能进行分析&#xff0c;以供安全取证、性能分析、网络质量监测以及…

关于推特隐私设置的一些小窍门

大家在使用推特进行引流的时候&#xff0c;在使用的时候难免会遇到一些功能模糊不清&#xff0c;这里twitter群推王给大家总结了一些偏门功能应该如何去设置&#xff0c;让你使用起来更加得心应手。 一、推特怎么设置自动放声音 1、首先打开推特APP并登陆。 2、其次在推特主…

CPDA认证|数据分析能给企业带来哪些好处?

数据分析的核心并不在于数据本身&#xff0c;而在于设计有意义、有价值的数据分析主题与指标体系&#xff0c;通过科学有效的手段去分析&#xff0c;进而发现问题优化迭代。 无论分析给出的结果是积极的还是负面的&#xff0c;都是价值承载体&#xff0c;必须以客观的态度面对。…

Enum枚举

枚举一般是针对常量需求,优化代码,.使代码看起来简洁 看下下面这个工具类 说有问题,那就是是看起来代码不够简洁 我看着倒还行,也许也是枚举不怎么实用的原因 下面就用枚举来优化这个代码,首先看下枚举介绍 java中对常量数据的配置可以使用枚举类型实现,,枚举类型是面向对象…

3小时!开发ChatGPT微信小程序

导读 | 上周OpenAI发布了对话语言模型 ChatGPT&#xff0c;相关讨论引爆全网。你是否也迫不及待体验一番&#xff1f;本文特邀作者腾讯云开发者社区作者戴传友从开发环境准备、开发过程、服务器接口、腾讯API网关接入到部署&#xff0c;详细教你如何动手开发一个chatGPT微信小程…

2022年华中杯数学建模挑战赛A题分拣系统优化问题

2022年华中杯数学建模 A 题 分拣系统优化问题 真的有想占便宜的 醉了 几十元让我写论文这是什么选手 想占便宜想疯了么 还要求查重率在10% 一开始说想看看你的A题论文 想学习一下 然后谈完价(几十块钱)之后 需要改成现做一篇独一无二的论文 然后想套路我占便宜 套路是真的深啊…

【R语言绘图】R在气象、水文中数据处理及结果分析、绘图技术

【查看原文】R语言在气象、水文中数据处理及结果分析、绘图实践技术应用 【内容简述】&#xff1a; 一、R简介与 R 在气象水文中的应用 R语言与 R软件简介 R 在各行业的应用 R 与其他语言的比较及其在数据分析与作图上的优势 R 在地学中的应用以及R 在气象水文中的应用 二、…

【react】虚拟DOM的两种创建方式

1、使用js创建虚拟DOM <body><div id"test"></div><!-- 引入react核心库 --><script src"../js/react.development.js"></script><!-- 引入react-dom&#xff0c;用于支持react操作dom --><script src"…

大数据期末课设~基于spark的气象数据处理与分析

目录 一 、项目背景 .......................................... 3 二 、实验环境 .......................................... 3 三 、实验数据来源 ................................... 4 四 、数据获取 .......................................... 5 五 、数据分析 ....…

港科夜闻|2022年香港科大气候适应及复原力大会圆满闭幕,政经领袖研讨香港气候政策与绿色金融发展...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、2022年香港科大气候适应及复原力大会圆满闭幕&#xff0c;政经领袖研讨香港气候政策与绿色金融发展。该会议由香港科大主办&#xff0c;于12月10日开幕。会议以跨领域的知识及观点交流为方针&#xff0c;凝聚公营及私营部门…

vulnhub serial讲解

环境搭建 下载 https://download.vulnhub.com/serial/serial.zip ​ 你会得到一个这样的文件&#xff0c;这里使用VMware新建一个虚拟机&#xff0c;这里记录比较重要的几部分。 ​ ​ ​ ​ 这里就是使用我们刚才下过来的。 ​ 漏洞过程详解 1.信息收集 netdiscover -i …

[附源码]Node.js计算机毕业设计调查问卷及调查数据统计系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

【论文】Auto-Encoding Variational Bayes

1.预备概念 1.1 后验分布 最大后验&#xff08;Maximum a Posteriori&#xff0c;MAP&#xff09;概率估计详解 【参考文章】https://blog.csdn.net/fq_wallow/article/details/104383057 1.2 重参数 Reparameterization 目的是&#xff1a; 转为公式表达从而实现微分 知乎…

编辑部已成羊村,这几天幸亏有ChatGPT(doge)

梦晨 羿阁 发自 凹非寺量子位 | 公众号 QbitAI坏事了&#xff0c;AI真的来抢饭碗了。还是我的饭碗&#xff01;这两天你们看的推送&#xff0c;有些标题是AI帮忙取的&#xff0c;有些文章甚至由AI完成了主要工作。我呢&#xff1f;我不过是打打下手&#xff0c;加些过渡句&…

RS485总线详解

RS485总线详解前言一、常见接口划分二、RS485概述&#xff08;一&#xff09;简介&#xff08;二&#xff09;接口/引脚图三、RS485总线详解&#xff08;一&#xff09;RS485总线概述&#xff08;二&#xff09;差分传输&#xff1a;&#xff08;三&#xff09;原理图&#xff…

基于51单片机的超声波测距系统设计

功能&#xff1a; 超声波测距仪&#xff0c;测量距离&#xff0c;用LCD12864显示信息。 lcd_writestr(0,0," 超声波测距仪 "); lcd_writestr(1,0,"&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;&#xff0a;");…

商场中央空调工程-商场商铺中央空调安装常见问题解答

商场中央空调工程-商场商铺中央空调安装常见问题解答 为了提高装修档次&#xff0c;提高舒适度&#xff0c;为顾客营造一个相对舒适的购物环境&#xff0c;很多门店都会选择安装中央空调。刚接触门店中央空调安装的客户会有很多疑问。例如&#xff0c;商店安装的中央空调和家用…

Android消息机制与源码剖析(Looper,Message,MessageQueue以及Handler)

Android消息机制 文章目录Android消息机制消息传递与处理的流程&#xff08;配图示&#xff09;1.【入口】 在 ActivityThread.class 的 main() 方法&#xff0c;为主线程创建 Looper&#xff0c;并开启 loop() 循环2.【创建Looper】通过 Looper.prepareMainLooper() 创建主线程…