Android四大组件之service(二)

2023-11-09

在 Android四大组件之service(一) 文中我们讲到了 service 的 基本概念 和 startService 启动方式、stopService。

不过这种方式是有个缺点,我们无法调用  FirstService 类里面的方法。

这个时候有人会说 new FirstService() 不就好了吗?其实不然,作为四大组件,你是不能直接new的,必须由系统创建,并服务他们context(即上下文)。下面,我们就来讲一下另外一种启动服务的方式。bindService() / unBindService()

第一步:继承 Binder 编写 InnerBinder 类

public class InnerBinder extends Binder {
        public void callServiceInnerMethod() {
            sayHello();
        }
}

第二步:在重写的 onBind() 方法中返回 InnerBinder 实例

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new InnerBinder();
    }

第三步:编写 ServiceConnection 

    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "onServiceConnected....");
            mRemoteBinder = (FirstService.InnerBinder) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(TAG, "onServiceDisconnected....");
            mRemoteBinder = null;
        }
    };

 第四步:绑定服务

    public void bindServiceClick(View view) {
        Intent intent = new Intent();
        intent.setClass(this, FirstService.class);
        isServiceBinded = bindService(intent, mConnection, BIND_AUTO_CREATE);
    }

第五步:解绑服务

    public void unBindServiceClick(View view) {
        if (mConnection != null && isServiceBinded) {
            unbindService(mConnection);
            isServiceBinded = false;
        }
    }

完整代码

MainActivity.java

package com.wust.testdemo;

import android.app.Activity;
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 services.FirstService;

public class MainActivity extends Activity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private boolean isServiceBinded;
    private FirstService.InnerBinder mRemoteBinder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "onCreate");
    }

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

    public void stopServiceClick(View view) {
        Intent intent = new Intent();
        intent.setClass(this, FirstService.class);
        stopService(intent);
    }

    public void callServiceMethod(View view) {
        Log.d(TAG, "call service inner method");
        mRemoteBinder.callServiceInnerMethod();
    }

    public void bindServiceClick(View view) {
        Intent intent = new Intent();
        intent.setClass(this, FirstService.class);
        isServiceBinded = bindService(intent, mConnection, BIND_AUTO_CREATE);
    }

    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "onServiceConnected....");
            mRemoteBinder = (FirstService.InnerBinder) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(TAG, "onServiceDisconnected....");
            mRemoteBinder = null;
        }
    };

    public void unBindServiceClick(View view) {
        if (mConnection != null && isServiceBinded) {
            unbindService(mConnection);
            isServiceBinded = false;
        }
    }

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

FirstService.java

package services;

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

import androidx.annotation.Nullable;

/**
 * ClassName: FirstService <br/>
 * Description: <br/>
 * date: 2021/10/17 21:44<br/>
 *
 * @author yiqi<br />
 * @QQ 1820762465
 * @微信 yiqiideallife
 * @技术交流QQ群 928023749
 */
public class FirstService extends Service {

    private static final String TAG = FirstService.class.getClass().getSimpleName();

    public class InnerBinder extends Binder {
        public void callServiceInnerMethod() {
            sayHello();
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind....");
        return new InnerBinder();
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand...");
        return super.onStartCommand(intent, flags, startId);
    }

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

    private void sayHello() {
        Toast.makeText(this, "Hello!", Toast.LENGTH_SHORT).show();
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:onClick="startServiceClick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开启服务"/>

    <Button
        android:onClick="stopServiceClick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止服务"/>

    <Button
        android:onClick="bindServiceClick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="绑定服务"/>

    <Button
        android:onClick="unBindServiceClick"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="解绑服务"/>

    <Button
        android:onClick="callServiceMethod"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="调用服务内部方法"/>

</LinearLayout>

效果展示

两种启动方式的优缺点

  1. startService的方法可以长期在后台运行,而 bindService 的方法则不可以长期在后台运行。
  2. bindService启动服务,可以跟服务进行通讯,但是startService启动服务不可以跟服务进行通讯。
  3. bindService启动服务,在软件退出时一定要记住 unBindService() 服务,要不然会报错

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android四大组件之service(二) 的相关文章

随机推荐

  • 【技术开发经验分享】计算机毕业设计PySpark+Hadoop知识图谱电影推荐系统 Django电影推荐系统 用户画像电影推荐系统 电影数据分析 电影可视化 电影爬虫 电影大数据 大数据毕业设计 大数

    简介 本系统为我的本科毕业设计项目 毕设题目为 基于用户画像的电影推荐系统的设计与实现 本系统是以Django作为基础框架 采用MTV模式 数据库使用MongoDB MySQL和Redis 以从豆瓣平台爬取的电影数据作为基础数据源 主要基于
  • 简单漏洞:CVE-2022-0543 Redis Lua 沙盒绕过

    一 描述 影响范围 Debian系得linux发行版本 Ubuntu Debian系得linux发行版本 其并非Redis本身漏洞 形成原因在于系统补丁加载了一些redis源码注释了的代码 揭露时间 2022 3 8 二 原理 redis在
  • DevOps基础服务2——Jenkins

    文章目录 一 基本了解 1 1 CI CD介绍 1 2 基于Docker的CI CD 二 安装jenkins 三 页面管理 3 1 当前系统用户配置 3 2 系统配置 3 3 全局工具配置 3 4 插件管理 3 4 1 安装插件 3 4 2
  • Ruoyi框架学习--XSS

    什么是XSS XSS通常指的是通过利用网页开发时留下的漏洞 通过巧妙的方法注入恶意指令代码到网页 使用户加载并执行攻击者恶意制造的网页程序 这些恶意网页程序通常是JavaScript 但实际上也可以包括Java VBScript Activ
  • 经典SHELL面试题

    1 如何向脚本传递参数 script argument 例子 显示文件名称脚本 show sh file1 txt cat show sh bin bash cat 1 2 如何在脚本中使用参数 第一个参数 1 第二个参数 2 例子 脚本会
  • 微信小程序云函数创建,安装npm环境依赖

    微信小程序云函数创建 安装npm环境依赖 cmd终端执行 1 npm install request promise production 2 npm install save wx server sdk latest
  • Python爬取王者荣耀全英雄全皮肤图片

    Python爬取王者荣耀全英雄全皮肤图片 前言 思路 分析 编码 案例源码 附图 总结 前言 以前写过类似的博客 利用Java爬取王者荣耀全英雄全皮肤图片 当时是利用 jsoup包来对目标网页进行解析 可笑的是当时找图片的链接找了好久 处理
  • 人工智能与机器学习---线性规划和非线性规划求解

    一 线性规划 1 线性规划的概念 线性规划 Linear Programming 简记 LP 是了运筹学中数学规划的一个重要分支 自从 1947 年 G B Dantzig 提出 求解线性规划的单纯形法以来 线性规划在理论上趋向成熟 在实用
  • 谷歌邮箱账号不会注册?注册失败?这份完美注册教程请收好

    谷歌邮箱相信大家都不陌生吧 无论是用于发送和接收邮件 还是用于在国外网站注册 很多人都离不开谷歌邮箱 甚至 一些网站直接提供谷歌邮箱登录选项 这就是为什么很多跨境人想要注册谷歌邮箱的原因 但是 大部分网友都无法自己完整注册 今天来做一篇完整
  • 【AI赋能】人工智能在自动驾驶时代的应用

    自我介绍 我是秋说 研究 人工智能 大数据 等前沿技术 传递 Java Python 等语言知识 主页链接 秋说的博客 学习专栏推荐 人工智能 创新无限 MySQL进阶之路 C 刷题集 网络安全攻防姿势总结 从0开始 深度掌握 C程序设计
  • MATLAB将数据存在TXT文件中

    记录结果 将数据保存到txt文件中 fid fopen 结果记录 txt a 结果记录 txt是存储数据的文件 a是数据向后增加的意思 fprintf fid f t hz f t是将数据往同一行的后面存 fprintf fid f n z
  • 2020.11.1

    1 登录业务的完善 1 1后端控制页面跳转 if rs next System out println 登陆成功 request setAttribute name username request getRequestDispatcher
  • JAVA经典兔子问题

    有一对兔子 从出生第三个月起每个月都生一对兔子 小兔子长到第三个月后 每个月又生一对兔子 假如兔子都不死 问M个月时兔子的数量 很经典的斐波那契数列问题 记得第一次看到这道题是在一次比赛中 当时并不知道斐波那契数列 但是列出来几个月的兔子数
  • SQL 数据库中如何自动生成订单号

    有一张表TAB1 字段num num里有很多数字 我想从1开始 查到里面缺少的最小的一个数字 例如 4 5 6 8 9 11 12 13 这样的话我想要的结果是1 1 2 3 4 5这样的话 我想要的结果是6 其实利用正常排序的找第一个不正
  • open3d操作.ply文件(点云)

    读取 ply文件 import open3d as o3d pcd o3d io read point cloud ply path format ply ppoints np asarray pcd points pcolors np a
  • Ubuntu20.04编译安装openpose使用pythonAPI

    目录 项目地址 环境 准备 开始编译 项目地址 https github com CMU Perceptual Computing Lab openpose 环境 系统 ubuntu20 04 cuda 11 2 GPU 3090 2 Dr
  • 第一款中国人自主研发的普及型计算机高级编程语言

    最近有了比较大的技术突破 可以实现快速的开发环境了 我之前的计划一直是解析脚本来实现迈欧网的开发环境 有了这个技术 虽然是高级语言 但是却不会丧失性能 达到C 等语言的速度 甚至更快 希望朋友们支持我 你们的支持是我不间断开发此产品的动力
  • muduo启程

    muduo启程 muduo 是一个基于 Reactor 模式的现代 C 网络库 它采用非阻塞 IO 模型 基于事件驱动和回调 原生支持多核多线程 适合编写 Linux 服务端多线程网络应用程序
  • 使用广度优先搜索查找图中路径(java)

    package breadthfirstpaths import edu princeton cs algs4 Graph import edu princeton cs algs4 Queue import edu princeton c
  • Android四大组件之service(二)

    在 Android四大组件之service 一 文中我们讲到了 service 的 基本概念 和 startService 启动方式 stopService 不过这种方式是有个缺点 我们无法调用 FirstService 类里面的方法 这个