[Android 四大组件] --- Service

news/2025/2/12 2:08:21/

1 service是什么

Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。

2 service分类

在这里插入图片描述

在这里插入图片描述

3 service启动方式

3.1 startService显示启动

// AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myapplication"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"><activity android:name=".StartServiceActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name=".StartService" /></application></manifest>
// StartSeviceActivity.java
package com.example.myapplication;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;//import com.ttit.helloworld.R;public class StartServiceActivity extends AppCompatActivity {private Button start;private Button stop;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.service_layout);start = (Button) findViewById(R.id.btnstart);stop = (Button) findViewById(R.id.btnstop);final Intent intent = new Intent(StartServiceActivity.this, StartService.class);start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startService(intent);}});stop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {stopService(intent);}});}
}
// StartService.java
package com.example.myapplication;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;import android.os.Bundle;public class StartService extends Service {private final String TAG = "service";//必须要实现的方法@Overridepublic IBinder onBind(Intent intent) {Log.e(TAG, "onBind方法被调用!");return null;}//Service被创建时调用@Overridepublic void onCreate() {Log.e(TAG, "onCreate方法被调用!");super.onCreate();}//Service被启动时调用@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.e(TAG, "onStartCommand方法被调用!");return super.onStartCommand(intent, flags, startId);}//Service被关闭之前回调@Overridepublic void onDestroy() {Log.e(TAG, "onDestory方法被调用!");super.onDestroy();}
}

// service_layout.xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/btnstart"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:text="开始服务"/><Buttonandroid:id="@+id/btnstop"android:layout_width="0dp"android:layout_weight="1"android:layout_height="wrap_content"android:text="停止服务"/></LinearLayout>

在这里插入图片描述

1> 通过按钮"开始服务"启动service

        final Intent intent = new Intent(StartServiceActivity.this, StartService.class);start.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startService(intent);}});

2> 创建StartService 继承service类

public class StartService extends Service

在StartService中实现 onBind,onCreate,onStartCommand, onDestroy方法

3> 在AndroidManifest.xml 清单文件中注册

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

4> 运行结果
点击开始服务,运行结果如下:
在这里插入图片描述
多次点击开始服务,运行结果如下:
在这里插入图片描述
点击停止服务,运行结果如下:
在这里插入图片描述

3.2 bindService绑定启动

//AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.myapplication"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"><activity android:name=".BindServiceActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name=".BindService" /></application></manifest>
// BindServiceActivity.java
package com.example.myapplication;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;public class BindServiceActivity extends AppCompatActivity {private Button btnbind;private Button btncancel;private Button btnstatus;//保持所启动的Service的IBinder对象,同时定义一个ServiceConnection对象private BindService.MyBinder binder;private ServiceConnection conn = new ServiceConnection() {//Activity与Service断开连接时回调该方法@Overridepublic void onServiceDisconnected(ComponentName name) {Log.e("service", " ------Service DisConnected-------");}//Activity与Service连接成功时回调该方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.e("service", " ------Service Connected------ - ");binder = (BindService.MyBinder) service;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.bind_service_layout);btnbind = (Button) findViewById(R.id.btnbind);btncancel = (Button) findViewById(R.id.btncancel);btnstatus = (Button) findViewById(R.id.btnstatus);final Intent intent = new Intent(BindServiceActivity.this, BindService.class);btnbind.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//绑定servicebindService(intent, conn, Service.BIND_AUTO_CREATE);}});btncancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//解除service绑定unbindService(conn);}});btnstatus.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getApplicationContext(), "Service的count的值为:"+ binder.getCount(), Toast.LENGTH_SHORT).show();}});}@Overrideprotected void onDestroy() {super.onDestroy();unbindService(conn); // 销毁Activity时需要解绑Service}
}
// BindService
package com.example.myapplication;import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;public class BindService extends Service {private final String TAG = "service";private int count;private boolean quit;//定义onBinder方法所返回的对象private MyBinder binder = new MyBinder();public class MyBinder extends Binder {public int getCount() {return count;}}//必须实现的方法,绑定改Service时回调该方法@Overridepublic IBinder onBind(Intent intent) {Log.e(TAG, "onBind方法被调用!");return binder;}//Service被创建时回调@Overridepublic void onCreate() {super.onCreate();Log.e(TAG, "onCreate方法被调用!");//创建一个线程动态地修改count的值new Thread() {public void run() {while (!quit) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}count++;Log.e(TAG, "count = " + count);}}}.start();}//Service断开连接时回调@Overridepublic boolean onUnbind(Intent intent) {Log.e(TAG, "onUnbind方法被调用!");return true;}//Service被关闭前回调@Overridepublic void onDestroy() {super.onDestroy();this.quit = true;Log.e(TAG, "onDestroyed方法被调用!");}@Overridepublic void onRebind(Intent intent) {Log.e(TAG, "onRebind方法被调用!");super.onRebind(intent);}
}

layout截图如下:
在这里插入图片描述

运行结果如下:
点击绑定SERVICE:
在这里插入图片描述

4 service生命周期

在这里插入图片描述
startService启动的生命周期
onCreate() 当Service第一次被创建时,由系统调用。
onStartCommand() 当startService方法启动Service时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。

注意:一个startService只会创建一次,销毁一次,但可以开始多次,因此,onCreate()和onDestroy()方法只会被调用一次,而onStartCommand()方法会被调用多次。

bindService启动的生命周期
onCreate() 当Service被创建时,由系统调用。
onBind() 当bindService方法启动Service时,该方法被调用。
onUnbind() 当unbindService方法解除绑定时,该方法被调用。
onDestroy() 当Service不再使用时,由系统调用。

注意:一个bindService可以创建多次,销毁多次,重复使用。

5 service和thread的区别

结论:Service和Thread之间没有任何关系
之所以有不少人会把它们联系起来,主要因为Service的后台概念
后台的定义:后台任务运行完全不依赖UI,即使Activity被销毁,或者程序被关闭,只要进程还在,后台任务就可以继续运行

其实二者存在较大的区别,如下图:
在这里插入图片描述
一般来说,会将Service和Thread联合着用,即在Service中再创建一个子线程(工作线程)去处理耗时操作逻辑,如下代码:

@Override  
public int onStartCommand(Intent intent, int flags, int startId) {  
//新建工作线程new Thread(new Runnable() {  @Override  public void run() {  // 开始执行后台任务  }  }).start();  return super.onStartCommand(intent, flags, startId);  
}  class MyBinder extends Binder {  public void service_connect_Activity() {  //新建工作线程new Thread(new Runnable() {  @Override  public void run() {  // 执行具体的下载任务  }  }).start();  }  }  

http://www.ppmy.cn/news/1080846.html

相关文章

bazel高效使用和调优

Bazel 为了正确性和高性能&#xff0c;做了很多优秀的设计&#xff0c;那么我们如何正确的使用这些能力&#xff0c;让我们的构建性能“起飞”呢&#xff0c; 我们将从本地研发和 CI pipeline 两种场景进行分析。 本地研发 本地研发通常采用默认的 Bazel 配置即可&#xff0c…

【C++心愿便利店】No.4---C++初谈类和对象

文章目录 前言一、面向过程和面向对象初步认识二、类的引用三、类的定义四、类的访问限定符及封装五、类的作用域六、类的实例化七、类对象模型八、this指针 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到我的乱七八糟小星球&…

Java入坑之反射研究

一、快速入门 1.1反射概述 JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称为…

2023年7月京东打印机行业品牌销售排行榜(京东运营数据分析)

鲸参谋监测的京东平台7月份打印机行业销售数据已出炉&#xff01; 7月份&#xff0c;打印机市场呈现下滑趋势。根据鲸参谋平台的数据可知&#xff0c;当月京东平台打印机的销量为48万&#xff0c;环比下降约28%&#xff0c;同比下降约18%&#xff1b;销售额为4亿&#xff0c;环…

大数据Flink简介与架构剖析并搭建基础运行环境

文章目录 前言Flink 简介Flink 集群剖析Flink应用场景Flink基础运行环境搭建Docker安装docker-compose文件编写创建并运行容器访问Flink web界面 前言 前面我们分别介绍了大数据计算框架Hadoop与Spark,虽然他们有的有着良好的分布式文件系统和分布式计算引擎&#xff0c;有的有…

服务内部错误: stderr: bash: docker-compose: 未找到命令

报错描述 1Panel在应用商店安装软件失败&#xff0c;重建或者重启报错"服务内部错误: stderr: bash: docker-compose: 未找到命令" 执行命令"docker-compose --version"结果为"Docker Compose version v2.17.2"&#xff0c;说明docker-compose已…

区块链实验室(19) - 在新建的无标度网络中配置控制台

在前文区块链实验室(18) - 用FISCO BCOS架设1个无标度网络中架设了1个网络&#xff0c;这个网络还没有配置控制台。FISCO-BCOS技术文档给出了一个创建4节点的网络以及控制台&#xff0c;那个控制台不能直接用于该文的无标度网络&#xff0c;主要是因为控制台证书不匹配。 本文…

C语言----详解socket通信

一&#xff1a;什么是socket 刚接触socket的同学想必也知道socket的中文名&#xff0c;套接字&#xff0c;与其说是中文名倒不如说这是什么玩意&#xff0c;我们先不要管中文名的实际意义&#xff0c;我们先来了解一下什么是socket。 我们上网产生的数据都是经过协议栈一层一层…