首页 > 其他分享 >Android 服务Service详解

Android 服务Service详解

时间:2023-05-27 23:34:08浏览次数:61  
标签:服务 Service mediaPlayer Button id 详解 Android public op

Android服务(Service)是一种在后台运行的组件,它可以在不与用户交互的情况下执行长时间运行的操作。服务通常用于在后台播放音乐、下载数据、执行网络操作等。

服务的特点如下:

1. 服务是一种后台运行的组件,可以在不与用户交互的情况下执行长时间运行的操作。

2. 服务可以在应用程序的不同组件之间共享数据和状态。

3. 服务可以通过Intent机制与其他组件进行通信,例如启动服务、停止服务、绑定服务等。

4. 服务可以在应用程序的不同进程之间共享数据和状态,这种服务称为跨进程服务。

Android服务的生命周期包括以下几个阶段:

1. onCreate():服务被创建时调用,用于执行一次性的初始化操作。

2. onStartCommand():服务启动时调用,用于执行后台操作。

3. onBind():服务被绑定时调用,用于返回一个IBinder对象,以便客户端与服务进行通信。

4. onUnbind():服务被解绑时调用,用于清理绑定相关的资源。

5. onDestroy():服务被销毁时调用,用于释放资源和停止后台操作。

Android服务的启动方式包括以下两种:

1. 启动服务:通过调用startService()方法启动服务,服务将在后台运行,直到调用stopService()方法停止服务。

2. 绑定服务:通过调用bindService()方法绑定服务,服务将在后台运行,直到所有客户端都解除绑定,或调用unbindService()方法解除绑定。

Android服务是一种强大的组件,它可以在后台执行长时间运行的操作,为应用程序提供了很大的灵活性和功能扩展性。

Service示例

下面我做了一个简单的音乐播放的应用,分别使用startService和bindService来启动本地的服务。

Activity

public class PlayMusicService extends Activity implements OnClickListener {  
  
    private Button playBtn;  
    private Button stopBtn;  
    private Button pauseBtn;  
    private Button exitBtn;  
    private Button closeBtn;  
  
    private Intent intent;  
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.music_service);  
  
        playBtn = (Button) findViewById(R.id.play);  
        stopBtn = (Button) findViewById(R.id.stop);  
        pauseBtn = (Button) findViewById(R.id.pause);  
        exitBtn = (Button) findViewById(R.id.exit);  
        closeBtn = (Button) findViewById(R.id.close);  
          
        playBtn.setOnClickListener(this);  
        stopBtn.setOnClickListener(this);  
        pauseBtn.setOnClickListener(this);  
        exitBtn.setOnClickListener(this);  
        closeBtn.setOnClickListener(this);  
  
    }  
  
    @Override  
    public void onClick(View v) {  
        int op = -1;  
        intent = new Intent("com.homer.service.musicService");  
  
        switch (v.getId()) {  
        case R.id.play:                             // play music  
            op = 1;  
            break;  
        case R.id.stop:                             // stop music  
            op = 2;  
            break;  
        case R.id.pause:                            // pause music  
            op = 3;  
            break;  
        case R.id.close:                            // close activity  
            this.finish();  
            break;  
        case R.id.exit:                             // stopService  
            op = 4;  
            stopService(intent);  
            this.finish();  
            break;  
        }  
  
        Bundle bundle = new Bundle();  
        bundle.putInt("op", op);  
        intent.putExtras(bundle);  
          
        startService(intent);                           // startService  
    }  
      
    @Override  
    public void onDestroy(){  
        super.onDestroy();  
  
        if(intent != null){  
            stopService(intent);  
        }  
    }  
}

Service

public class MusicService extends Service {  
    private static final String TAG = "MyService";  
      
    private MediaPlayer mediaPlayer;  
  
    @Override  
    public IBinder onBind(Intent arg0) {  
        return null;  
    }  
  
    @Override  
    public void onCreate() {  
        Log.v(TAG, "onCreate");  
        Toast.makeText(this, "show media player", Toast.LENGTH_SHORT).show();  
  
        if (mediaPlayer == null) {  
            mediaPlayer = MediaPlayer.create(this, R.raw.tmp);  
            mediaPlayer.setLooping(false);  
        }  
    }  
  
    @Override  
    public void onDestroy() {  
        Log.v(TAG, "onDestroy");  
        Toast.makeText(this, "stop media player", Toast.LENGTH_SHORT);  
        if (mediaPlayer != null) {  
            mediaPlayer.stop();  
            mediaPlayer.release();  
        }  
    }  
  
    @Override  
    public void onStart(Intent intent, int startId) {  
        Log.v(TAG, "onStart");  
        if (intent != null) {  
            Bundle bundle = intent.getExtras();  
            if (bundle != null) {  
                int op = bundle.getInt("op");  
                switch (op) {  
                case 1:  
                    play();  
                    break;  
                case 2:  
                    stop();  
                    break;  
                case 3:  
                    pause();  
                    break;  
                }  
            }  
        }  
    }  
  
    public void play() {  
        if (!mediaPlayer.isPlaying()) {  
            mediaPlayer.start();  
        }  
    }  
  
    public void pause() {  
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {  
            mediaPlayer.pause();  
        }  
    }  
  
    public void stop() {  
        if (mediaPlayer != null) {  
            mediaPlayer.stop();  
            try {  
                mediaPlayer.prepare();  // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数  
            } catch (IOException ex) {  
                ex.printStackTrace();  
            }  
        }  
    }  
}


标签:服务,Service,mediaPlayer,Button,id,详解,Android,public,op
From: https://blog.51cto.com/u_15887619/6363265

相关文章

  • Kubernetes Service详解
    KubernetesService详解一、Service介绍kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。Service在很多情况下只是一个概念,真正起作用的其实是kube-proxy服务进程,每个Node......
  • Fabric架构详解
    1整体架构2运行架构FabricCA(可选)peer:主节点模块,负责存储区块链数据,运行维护链码orderer:交易打包,排序模块cryptogen:组织和证书等资料生成模块configtxgen:生成用于通道配置的文件和创世区块等configtxlator:负责解析格式化后的区块和交易文件3网络运行流程4交易......
  • 【深入浅出Spring原理及实战】「缓存Cache开发系列」带你深入分析Spring所提供的缓存C
    缓存的理解缓存的工作机制是先从缓存中读取数据,如果没有再从慢速设备上读取实际数据,并将数据存入缓存中。通常情况下,我们会将那些经常读取且不经常修改的数据或昂贵(CPU/IO)的且对于相同请求有相同计算结果的数据存储到缓存中。它能够让数据更加接近于使用者,下图所示。+-------------......
  • YOLOv8目标检测实战:Android手机部署 (视频课程)
    课程链接:https://edu.51cto.com/course/33890.htmlYOLOv8目标检测基于先前YOLO版本的成功,引入了新功能和改进,进一步提升了性能和灵活性。本课程在Windows上手把手演示YOLOv8(YOLOv8n和YOLOv8s)目标检测在Android(安卓)手机进行部署的过程。内容包括:安装软件环境、安装PyTorch,克隆和......
  • Android平台如何实现外部RTSP|RTMP流注入轻量级RTSP服务模块(内网RTSP网关)
     技术背景今天分享的是外部RTSP或RTMP流,拉取后注入到本地轻量级RTSP服务模块,供内网小并发场景下使用,这里我们叫做内网RTSP网关模块。内网RTSP网关模块,系内置轻量级RTSP服务模块扩展,完成外部RTSP/RTMP数据拉取并注入到轻量级RTSP服务模块工作,多个内网客户端直接访问内网轻量级RTSP......
  • Android平台GB28181设备接入模块如何对接NV21、YV12、RGB、YUV等外部数据
    技术背景我们在对接Android平台GB28181设备接入模块的开发者时,遇到这样的场景,除了Android设备(如执法记录仪、智能安全帽等)自带的camera或camera2前后摄像头数据外,还有些场景是需要外部编码前或编码后数据,比如对接OTG类似的外置数据源,如NV12、NV21、YV12、RGB或YUV等格式,这里做个简......
  • 【Linux学习笔记】设备驱动模型详解——总线、设备、驱动和类
    简介设备驱动是计算机系统中的重要组成部分,它们允许操作系统与硬件交互。设备驱动模型是一种通用的抽象框架,用于描述操作系统如何管理硬件设备。这里我们将介绍设备驱动模型中的四个关键概念:总线、设备、驱动和类。总线在计算机系统中,总线是指多个设备之间传输数据的路径。总线......
  • 前端检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接)
    快速实现前端检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接);下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12652效果图如下:   实现代码如下:#使用方法####HTML代码部分```html<template><viewclass="conten......
  • 检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接)
    快速实现检测手机系统是iOS还是android(可实现根据手机系统跳转App下载链接);下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12652效果图如下:   实现代码如下:#使用方法####HTML代码部分```html<template><viewclass="content">......
  • [Android 逆向]旅行青蛙破解
    1.旅行青蛙V1.0,4apk安装到手机,可以运行2.jadx打开apk存在这两个dll,说明是unity开发的3.导出Assembly-CSharp.dll,使用DnSpy打开Ctrl+Shift+K全局搜索clover(四叶草的意思)ps:这里的5000是我修改的,选中408行,邮件编辑IL指令,直接改C#编译后的代码4.......