当前位置: 首页 > news >正文

【安卓】Service的基本用法

文章目录

      • Service简介
      • 启动和停止Service
      • Activity和Service进行通信

Service简介

  新建一个ServiceTest项目,然后右击com.example.servicetest→New→Service→Service。

  每个Service中最常用到onCreate()、onStartCommand()和onDestroy()这3个方法其中onCreate()方法会在Service创建的时候调用,onStartCommand()方法会在每次Service启动的时候调用,onDestroy()方法会在Service销毁的时候调用。

  另外需要注意,每一个Service都需要在AndroidManifest.xml文件中进行注册才能生效。

启动和停止Service

  修改activity_main.xml中的代码。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/startServiceBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Start Service" /><Buttonandroid:id="@+id/stopServiceBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Stop Service" />
</LinearLayout>

  修改MainActivity中的代码。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button startService = (Button) findViewById(R.id.startServiceBtn);Button stopService = (Button) findViewById(R.id.stopServiceBtn);startService.setOnClickListener(this);stopService.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.startServiceBtn:Intent startIntent = new Intent(this, MyService.class);startService(startIntent); // 启动服务break;case R.id.stopServiceBtn:Intent stopIntent = new Intent(this, MyService.class);stopService(stopIntent); // 停止服务break;default:break;}}
}

  修改MyService.java中的代码。

public class MyService extends Service {public MyService() {}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic void onCreate(){super.onCreate();Log.d("MyService", "onCreate executed");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d("MyService", "onStartCommand executed");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();Log.d("MyService", "onDestroy executed");}
}

Activity和Service进行通信

  修改MyService中的代码。

public class MyService extends Service {private DownloadBinder mBinder = new DownloadBinder();class DownloadBinder extends Binder {public void startDownload() {Log.d("MyService", "startDownload executed");}public int getProgress() {Log.d("MyService", "getProgress executed");return 0;}}public MyService() {}@Overridepublic IBinder onBind(Intent intent) {return mBinder;}@Overridepublic void onCreate(){super.onCreate();Log.d("MyService", "onCreate executed");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.d("MyService", "onStartCommand executed");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();Log.d("MyService", "onDestroy executed");}
}

  修改activity_main.xml中的代码,在布局文件里新增两个按钮用于调用Service。这两个按钮分别是用于绑定和取消绑定Service的,当一个Activity和Service绑定了之后,就可以调用该Service里的Binder提供的方法了。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/startServiceBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Start Service" /><Buttonandroid:id="@+id/stopServiceBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Stop Service" /><Buttonandroid:id="@+id/bindServiceBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Bind Service" /><Buttonandroid:id="@+id/unbindServiceBtn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Unbind Service" />
</LinearLayout>

  修改MainActivity中的代码。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {private MyService.DownloadBinder downloadBinder;private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {downloadBinder = (MyService.DownloadBinder) service;downloadBinder.startDownload();downloadBinder.getProgress();}@Overridepublic void onServiceDisconnected(ComponentName name) {}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button startService = (Button) findViewById(R.id.startServiceBtn);Button stopService = (Button) findViewById(R.id.stopServiceBtn);startService.setOnClickListener(this);stopService.setOnClickListener(this);Button bindService = (Button) findViewById(R.id.bindServiceBtn);Button unbindService = (Button) findViewById(R.id.unbindServiceBtn);bindService.setOnClickListener(this);unbindService.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.startServiceBtn:Intent startIntent = new Intent(this, MyService.class);startService(startIntent); // 启动服务break;case R.id.stopServiceBtn:Intent stopIntent = new Intent(this, MyService.class);stopService(stopIntent); // 停止服务break;case R.id.bindServiceBtn:Intent bindIntent = new Intent(this, MyService.class);bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务break;case R.id.unbindServiceBtn:unbindService(connection);  // 解绑服务break;default:break;}}
}

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 排序算法【希尔排序】
  • python识别车辆标志
  • 前端开发攻略---图片裁剪上传的原理
  • Hackademic.RTB1靶场实战【超详细】
  • S71200 - 编程 - 笔记
  • ZooKeeper 集群的详细部署
  • eNSP 华为三层交换机实现VLAN间通信
  • 【课程总结】day23:大模型训练策略(BERT模型与GLM模型)
  • 【若依 - 前后端不分离版】SysCaptchaController 详解:生成与处理验证码
  • springboot2.x到spring3.x的一些变化和示例说明
  • 花钱买不到系列之—linux系统调用
  • 嵌入式学习Day29---Linux软件编程---网络编程
  • 力扣--最长公共前缀
  • C++ 对象构造语义学——局部对象、全局对象的构造和析构
  • MINIO图片地址浏览器打开不显示
  • canvas绘制圆角头像
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • es6要点
  • Go 语言编译器的 //go: 详解
  • input实现文字超出省略号功能
  • Java编程基础24——递归练习
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Promise面试题,控制异步流程
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • webpack4 一点通
  • 检测对象或数组
  • 简单易用的leetcode开发测试工具(npm)
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 通信类
  • 中文输入法与React文本输入框的问题与解决方案
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #前后端分离# 头条发布系统
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Python第六天)文件处理
  • (Qt) 默认QtWidget应用包含什么?
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)计算机毕业设计高校学生选课系统
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net CF下精确的计时器
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core中Emit的使用
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET NPOI导出Excel详解