android入门之创建service

news2025/1/19 14:18:02

1. 前言

        Service意为:服务,是一种运行时用户不可见的活动机制。可以理解为它是一个没有布局的Activity。

        典型的场景:音乐后台播放、后台下载。

        Service不同于子线程,Service是运行在主线程中的,因此不能进行耗时操作。

2. 代码编写

使用android studio创建一个空项目(empty activity)

 创建完成后就是一个可以显示"hello world"的小应用了。

点击MainActivity.java里的“activity_main”进入activity_main.xml,在这里可以点击“design”,创建button。

 我创建button添加的xml代码如下:

    <Button
        android:id="@+id/button"
        android:layout_width="314dp"
        android:layout_height="64dp"
        android:text="@string/startservice"
        android:onClick="startService"
        tools:layout_editor_absoluteX="52dp"
        tools:layout_editor_absoluteY="70dp"
        tools:ignore="MissingConstraints" />
“android:text= ”后是按钮描述
“android:onClick”后是按钮点击事件,可以右击生成点击方法,选择点击方法位于MainActivity.java

点击方法是开启service的入口点

生成的方法是

    public void startService(View view) {

    }

注意,在修改button的参数值时,res->values->strings.xml可能也会自动生成新的内容

<resources>
    <string name="app_name">Zyy Application</string>
    <string name="hello_my_world">Hello my World!</string>
    <string name="startservice">启动Service</string>
</resources>

接下来新建service,取名为 MyService。

 

新建完后用“ctrl + o” 选择重写方法。并设计自定义的service执行内容。我这里编写的是每隔一秒打印时间,一共打印五次。

package com.example.zyyapplication;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MyService extends Service {
    private static final String TAG = "Service";

    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: ");
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: ");
        int i = 0;
        String[] arr = {"date"};
        for (i = 1; i < 5; i++) {
            System.out.println("i is:" + i);
            try {
                Thread.sleep(1000);
                String result = execcommand(arr);
                System.out.println("exec command result is:" + result);
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
        return super.onStartCommand(intent, flags, startId);
    }

    public static String execcommand(String[] command) throws IOException {
        BufferedReader bufferedReader = null;
        try {
            Process process = Runtime.getRuntime().exec(command);
            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            final String s = bufferedReader.readLine();
            return s;
        } finally {
            bufferedReader.close();
        }
    }

}

在AndroidManifest.xml中注册这个类,填写一行service信息

        </activity>

        <service android:name=".MyService" />

    </application>

最后,不要忘了在MainActivity.java里对service编写启动代码。

    public void startService(View view) {
        Intent intent =new Intent(this, MyService.class);
        startService(intent);
    }

3.调试

选择设备型号

 我随便选了个Pixel API 28

接下来就可以调试了

点击运行

 出现手机界面,点击界面上的启动service。

日志打印如下:

D/Service: onCreate: 
D/Service: onStartCommand: 
I/System.out: i is:1
I/System.out: exec command result is:Wed Dec 21 17:59:32 CST 2022
    i is:2
I/System.out: exec command result is:Wed Dec 21 17:59:33 CST 2022
    i is:3
I/System.out: exec command result is:Wed Dec 21 17:59:34 CST 2022
    i is:4
I/System.out: exec command result is:Wed Dec 21 17:59:35 CST 2022
I/Choreographer: Skipped 241 frames!  The application may be doing too much work on its main thread.
I/OpenGLRenderer: Davey! duration=4039ms; Flags=0, IntendedVsync=8909016702842, Vsync=8913033369348, OldestInputEvent=9223372036854775807, NewestInputEvent=0, HandleInputStart=8913046014660, AnimationStart=8913046074360, PerformTraversalsStart=8913046841460, DrawStart=8913047184160, SyncQueued=8913048173260, SyncStart=8913048223960, IssueDrawCommandsStart=8913048276060, SwapBuffers=8913054677760, FrameCompleted=8913056277560, DequeueBufferDuration=154000, QueueBufferDuration=341000, 

从日志中我们可以看出,service正常启动了。

4.总结

        有一个视频,讲的比较通俗易懂。推荐给大家。我写得比较简略,如果有不明白得地方可以搜索 Bi站视频 “Android中Service的介绍”,博主 “子林android”。

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

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

相关文章

电线电缆行业MES系统,帮助企业快速应对订单变化,减少资金占用

电线电缆行业生产管理现状 电线电缆行业是典型的重资产行业&#xff0c;原材料成本高、产品价值高、资金占用大、产品规格型号多达数万种&#xff0c;BOM管理繁杂&#xff0c;现场管理粗放&#xff0c;订单经常会合并或拆分生产&#xff0c;对排程要求高。 1、计划制定不准确…

无分类编址CIDR

无分类编址CIDR 构成超网 将多个子网聚合成一个较大的子网&#xff0c;叫做构成超网&#xff0c;或路由聚合。 方法&#xff1a;将网络前缀缩短&#xff08;所有网络地址取交集&#xff09;。 例题 某路由表中有转发接口相同的4条路由表项&#xff0c;其目的网络地址分别为…

Unicode编码的理解

1、Unicode 这个单词可以拆解为两部分&#xff0c;一个是Uni ,即英文单词unique的意思&#xff0c;也就是唯一的意思。code就是编码的意思。 GBK编码的理解_sgmcy的博客-CSDN博客 在上节博客里面&#xff0c;介绍了ASCII编码、ASCII编码表的扩展以及我们国家汉字的GBK编码。 …

详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly()

详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly() 函数ellipse2Poly()可用于近似计算椭圆曲线的像素坐标。 而前面介绍过的函数ellipse()则是直接在图像中绘制椭圆&#xff0c;详情见 https://www.hhai.cc/thread-174-1-1.html 函数ellipse2Poly()的C原型如下&#xff…

【Shell】find文件查找

语法格式 find [路径] [选项] [操作]选项参数对照表 常用选项 -name 查找/etc目录下以conf结尾的文件ind /etc -nam -iname 查找当前目录下文件名为aa的文件,不区分大小写 find . -iname aa -user 查找文件属主为hdfs的所有文件find . -user hdfs -group 查找文件属组为yarn的…

虹科方案 | 解决连接到IEEE 1588高可用性网络的SCADA系统的NTP同步参考问题

目前&#xff0c;各个行业都在朝着以太网融合的趋势发展&#xff0c;近年来也出现了一些可用于增强标准以太网弹性的技术创新&#xff0c;并被用作运营&#xff08;OT&#xff09;和信息技术&#xff08;IT)的通用链路层。电气等具有高可用性和严格时序要求的关键领域推动了这些…

1362:家庭问题(family)

1362&#xff1a;家庭问题(family) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6732 通过数: 3529 【题目描述】 有n个人&#xff0c;编号为1,2,……n&#xff0c;另外还知道存在K个关系。一个关系的表达为二元组&#xff08;α&#xff0c;β&#xff09;形式…

GBK编码的理解

1、我们学程序的时候&#xff0c;所熟知的ASCII码&#xff0c;就是一种编码方式 计算机底层&#xff0c;就只认识0和1. 举个例子&#xff0c;以3bit为例&#xff1a; 所以&#xff0c;如果是000的话&#xff0c;可以对应数字0 如果是001的话&#xff0c;可以对应数字1 。。…

非零基础自学Golang 第13章 并发与通道 13.4 select 13.5 小结

非零基础自学Golang 文章目录非零基础自学Golang第13章 并发与通道13.4 select13.4.1 select作用13.4.2 超时13.4.3 死锁13.5 小结第13章 并发与通道 13.4 select Go语言中&#xff0c;通过关键字select可以监听channel上的数据流动。 select的用法和switch非常相似&#xf…

Python中的基本数据类型

文章目录前言一、字符串类型字符串表示方法二、数字类型1. 整数2.浮点数3.复数三、布尔类型总结前言 我们一般在电脑中存储的数据有多种数据类型。比如下图这张员工工资表&#xff1a; 表中员工姓名可以用字符串类型存储&#xff08;比如"李世民"、“侯君集”&#…

Hadoop学习----HDFS

文件系统 文件系统&#xff1a;是一种存储和组织数据的方法&#xff0c;实现数据的存储、分级组织、访问和获取等操作&#xff0c;使得用户对文件访问和查找变得容易。文件系统使用树形目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念&#xff0c;用户不必关心数据底…

实验三 进程的互斥与同步

文章目录一、 实验目的二、 实验原理三、实验内容四、我的代码内容和现象1、philosopher12、philosopher2这个程序不会发生死锁&#xff0c;因为五、课后习题&#xff1a;1.什么是死锁&#xff1f;产生死锁的原因和必要条件是什么&#xff1f;2.实验中给出的伪代码流程&#xf…

Problem Set 3

1Lagrange Duality Formulate the Lagrange dual problem of the following linear programming prob-lem min cT rs.t.Ax 二b where a ∈R is variable,c ∈ R"&#xff0c;A ∈Rkn, b ∈ Rk. 解&#xff1a;设拉格朗日函数为L(x,λ)cTxλT(Ax−b)\mathcal{L}(x,\lambda)…

第十七章 webpack5项目搭建Vue-Cli(开发模式)

step1–创建项目目录 创建一个目录用来搭建vue-cli的项目 mkdir vue-cli cd vue-clistep2–初始化项目 初始化项目&#xff0c;生成一个package.json文件 npm init -ystep3–编写vue-cli的开发模式配置 新建目录 / |-config | |--webpack.dev.js | |--webpack.prod.js我…

USB TO SPI(上海同旺电子)调试器调试25LC020A

所需设备&#xff1a; 1、USB TO SPI(上海同旺电子)&#xff1b; 2、25LC020A 2Kb 2.5V SPI Serial EEPROM; Microchip 25LC020A 是一款 2 Kb 串行 EEPROM&#xff0c;采用行业标准串行外设接口 (SPI) 兼容串行总线。 该器件被组织为一个 256 x 8 位块&#xff0c;并针对消…

Java安全--CC7

在学CC7的时候我有这么几个疑问 1.为什么要两个LazyMap 2.hashCode那一步怎么计算的 3.为什么要remove yy 4.为什么put两个 我们可以先看一下CC7的链子是怎么走的: 其实分析链子还是从命令执行走到readObject比较好理解&#xff0c;虽然比较麻烦&#xff0c;比较繁琐&#xff0…

机器人机械臂运动学——逆运动学解算

1.情景概述 假设最一般的情况&#xff0c;我们的机械臂有六个自由度&#xff0c;那么从初始状态想要变化到目标的状态&#xff0c;一般情况下我们至少需要进行六次的变换&#xff0c;而这六次变换的矩阵参数隐含在整体的变换矩阵中。 根据之前的知识&#xff0c;左上角的3*3代表…

m基于隐马尔科夫模型(HMM)的手机用户行为预测(MMUB)算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 隐马尔可夫模型&#xff08;Hidden Markov Model&#xff0c;HMM&#xff09;是一种统计模型&#xff0c;广泛应用在语音识别&#xff0c;词性自动标注&#xff0c;音字转换&#xff0c;概率文法…

R语言中的Nelson-Siegel模型在汇率预测的应用

这篇文章的目的是指导读者逐步使用R编程语言实现Nelson-Siegel模型的步骤。 最近我们被客户要求撰写关于Nelson-Siegel模型的研究报告&#xff0c;包括一些图形和统计输出。 您可能已经知道&#xff0c;估计利率期限结构是任何资产定价的关键&#xff0c;因此对投资者和政策制…

5G无线技术基础自学系列 | 基于Massive MIMO的场景化波束优化

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 前面内容提到&#xff0c; 5G中引入了M…