Android service介绍——startService和bindService基本使用(1)

这篇具有很好参考价值的文章主要介绍了Android service介绍——startService和bindService基本使用(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android service介绍——startService和bindService基本使用(1)

问题背景

在安卓日常开发和学习中,经常会使用到Service,它是Android四大组件之一。使用Service可以在后台执行长时间的操作( perform long-running operations in the background ),Service并不与用户产生UI交互。其他的应用组件可以启动Service,即便用户切换了其他应用,启动的Service仍可在后台运行。一个组件可以与Service绑定并与之交互,甚至是跨进程通信(IPC)。例如,一个Service可以在后台执行网络请求、播放音乐、执行文件读写操作或者与 content provider交互等等。 本文将先对作为四大组件之一的Service的基本使用进行介绍。

问题分析

话不多说,直接上代码,一起先看看service的基本使用。

一、startService()方法启动一个Service

(1)创建一个service,HelloService

import android.app.Service
import android.content.Intent
import android.os.*
import android.util.Log
import android.widget.Toast

class HelloService : Service() {
    private var mServiceLooper: Looper? = null
    private var mServiceHandler: ServiceHandler? = null

    companion object {
        const val TAG = "HelloService"
    }

    private inner class ServiceHandler(looper: Looper) : Handler(looper) {
        override fun handleMessage(msg: Message) {
            Log.d(TAG, "handleMessage")
            try {
                Thread.sleep(5000)
            } catch (e: InterruptedException) {
                Thread.currentThread().interrupt()
            }
        }
    }

    override fun onCreate() {
        Log.d(TAG, "onCreate")
        val thread = HandlerThread(
            "ServiceStartArguments",
            Process.THREAD_PRIORITY_BACKGROUND
        )
        thread.start()

        mServiceLooper = thread.looper
        mServiceHandler = ServiceHandler(mServiceLooper!!)
    }

    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        Log.d(TAG, "onStartCommand")

        val msg: Message? = mServiceHandler?.obtainMessage()
        msg?.arg1 = startId
        msg?.let {
            mServiceHandler?.sendMessage(msg)
        }

        return START_STICKY
    }

    override fun onBind(intent: Intent): IBinder? {
        Log.d(TAG, "onBind")
        return null
    }

    override fun onDestroy() {
        Log.d(TAG, "onDestroy")
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show()
    }
}

(2)在manifest中记得要注册service,正常创建文件时候选择service会自动创建

<service
        android:name="composer.service.HelloService"
        android:exported="true"
        android:enabled="true" />

(3)activity中startService()方法启动service

import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import androidx.appcompat.app.AppCompatActivity
import composer.databinding.ActivityTestStartServiceBinding
import composer.service.HelloService
import kotlinx.android.synthetic.main.activity_test_start_service.*

class TestStartServiceActivity : AppCompatActivity() {
    lateinit var binding: ActivityTestStartServiceBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityTestStartServiceBinding.inflate(LayoutInflater.from(this))
        setContentView(binding.root)

        startMyService.setOnClickListener {
            val intent = Intent(baseContext, HelloService::class.java)
            startService(intent)
        }

        stopMyService.setOnClickListener {
            val intent = Intent(baseContext, HelloService::class.java)
            stopService(intent)
        }
    }
}

(4)对应布局layout文件如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.TestStartServiceActivity">
    <Button
        android:id="@+id/startMyService"
        android:text="start MyService"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/stopMyService"
        android:text="stop MyService"
        app:layout_constraintTop_toBottomOf="@id/startMyService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>

startservice,android,android studio,ide

二、bindService()方法绑定一个Service

对上面的demo进行调整,使用bindService()的方法绑定启动一个service (1)HelloService代码如下:

import android.app.Service
import android.content.Intent
import android.os.*
import android.util.Log
import android.widget.Toast

class HelloService : Service() {
    private var mServiceLooper: Looper? = null
    private var mServiceHandler: ServiceHandler? = null
    private val countNumBinder = CountNumBinder()

    companion object {
        const val TAG = "HelloService"
    }

    inner class CountNumBinder: Binder() {
        fun getCount(): Int {
            Log.i(TAG, ">>>>>>getCount()");
            return 100;
        }
    }

    private inner class ServiceHandler(looper: Looper) : Handler(looper) {
        override fun handleMessage(msg: Message) {
            Log.d(TAG, "handleMessage")
            try {
                Thread.sleep(5000)
            } catch (e: InterruptedException) {
                Thread.currentThread().interrupt()
            }
        }
    }

    override fun onCreate() {
        Log.d(TAG, "onCreate")
        val thread = HandlerThread(
            "ServiceStartArguments",
            Process.THREAD_PRIORITY_BACKGROUND
        )
        thread.start()

        mServiceLooper = thread.looper
        mServiceHandler = ServiceHandler(mServiceLooper!!)
    }

    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        Log.d(TAG, "onStartCommand")

        val msg: Message? = mServiceHandler?.obtainMessage()
        msg?.arg1 = startId
        msg?.let {
            mServiceHandler?.sendMessage(msg)
        }

        return START_STICKY
    }

    override fun onBind(intent: Intent): IBinder {
        Log.d(TAG, "onBind")
        return countNumBinder
    }

    override fun onDestroy() {
        Log.d(TAG, "onDestroy")
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show()
    }
}

(2)activity代码修改如下:

package composer.view

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.LayoutInflater
import androidx.appcompat.app.AppCompatActivity
import composer.databinding.ActivityTestStartServiceBinding
import composer.service.HelloService
import kotlinx.android.synthetic.main.activity_test_start_service.*

class TestStartServiceActivity : AppCompatActivity() {
    lateinit var binding: ActivityTestStartServiceBinding
    var countNumBinder: HelloService.CountNumBinder? = null

    companion object {
        const val TAG = "HelloService activity"
    }

    private val conn = object: ServiceConnection {

        // Activity与Service断开连接时回调该方法
        @Override
        override fun onServiceDisconnected(name: ComponentName) {
            Log.d(TAG, ">>>>>>Service DisConnected");
        }

        //Activity与Service连接成功时回调该方法
        @Override
        override fun onServiceConnected(name: ComponentName, service: IBinder) {
            Log.i(TAG, ">>>>>>Service Connected");
            countNumBinder =  service as HelloService.CountNumBinder
            Log.i(TAG, ">>>>>>Service Connected: " + countNumBinder?.getCount());
        }}

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityTestStartServiceBinding.inflate(LayoutInflater.from(this))
        setContentView(binding.root)

        startMyService.setOnClickListener {
            val intent = Intent(baseContext, HelloService::class.java)
            startService(intent)
        }

        stopMyService.setOnClickListener {
            val intent = Intent(baseContext, HelloService::class.java)
            stopService(intent)
        }

        bindMyService.setOnClickListener {
            val intent = Intent(baseContext, HelloService::class.java)
            bindService(intent, conn, Service.BIND_AUTO_CREATE)
        }
    }
}

(3)activity对应layout布局文件修改如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".view.TestStartServiceActivity">
    <Button
        android:id="@+id/startMyService"
        android:text="start MyService"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/stopMyService"
        android:text="stop MyService"
        app:layout_constraintTop_toBottomOf="@id/startMyService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/bindMyService"
        android:text="bind MyService"
        app:layout_constraintTop_toBottomOf="@id/stopMyService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>

项目运行后,点击bindService按钮,运行结果如下: startservice,android,android studio,ide

问题总结

本文初步讲解了安卓中四大组件之一的service的基本使用,包括使用startService和bindService两种启动方式,以及通过运行结果可以看到对应的一个生命周期的关系。后面会继续介绍Bound Service的几种高阶用法,有兴趣的同学可以进一步深入研究。文章来源地址https://www.toymoban.com/news/detail-754898.html

到了这里,关于Android service介绍——startService和bindService基本使用(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Framework】bindService启动流程

    在【Service启动流程之startService】 中,我们已经分析了startService的流程,这篇就继续讲bindService的流程,他们两有很多相似之处。同样,流程图在总结处。 我们在调用bindService方法时候,实际调用的是ContextImpl的实现。 代码路径:frameworksbasecorejavaandroidappContextImpl.java 代码

    2024年02月11日
    浏览(26)
  • bindService的调用流程

    使用bindService去调用service,如果有多个客户端调用,onBind方法只会被调用一次,由于bindService嗲处理中,AMS是一个中间商,猜测这个处理也是AMS里进行的,这里我们再看看bindService的调用流程   public class ContextWrapper extends Context {     Context mBase;     public ContextWrapper(Context

    2024年02月11日
    浏览(29)
  • 【JavaEE】Spring事务-事务的基本介绍-事务的实现-@Transactional基本介绍和使用

    【JavaEE】Spring 事务(1) 比如跟钱相关的两个操作: 第一步操作:小马卡里 - 100元 第二步操作:老马卡里 + 100元 这就是一个事务,捆在一起的一组行为,就是事务 而它能保证的是,这个行为的原子性,一致性,隔离性,持久性: 两个操作都成功 两个操作都失败 要么一起成

    2024年02月11日
    浏览(31)
  • Android AIDL基本使用

    AIDL是Android多进程通讯方式一种。 如要使用 AIDL 创建绑定服务,请执行以下步骤: 创建 .aidl 文件 此文件定义带有方法签名的编程接口。 实现接口 Android SDK 工具会基于您的  .aidl  文件,使用 Java 编程语言生成接口。此接口拥有一个名为  Stub  的内部抽象类,用于扩展  B

    2024年02月09日
    浏览(30)
  • Burpsuite的基本使用介绍

    intercept介绍 Forward表示将截断的HTTP或HTTPS请求发送到服务器。 Drop表示把截断的HTTP或HTTPS请求丢弃。 Intercept is on 和Intercept is off 表示开启或关闭代理截断功能。 Action表示将截断的HTTP或HTTPS请求发送到其他模块或做其他处理。 对Intercept进行Raw Hex Params Header切换查看不同的数据格

    2024年02月11日
    浏览(26)
  • ddddocr基本使用和介绍

    在使用爬虫登录网站的时候,经常输入用户名和密码后会遇到验证码,这时候就需要用到今天给大家介绍的python第三方库ddddocr,ddddocr是一款强大的通用开源ocr识别库,具有高效、准确、易用的特点,广泛应用于图像处理和文字识别任务。本文将为大家介绍ddddocr的基本使用方

    2024年04月22日
    浏览(17)
  • 索引介绍和基本使用

    索引就是用来加速SQL查询的 由于索引也是需要存储成 索引文件 的,因此对索引的使用也会涉及 磁盘 I/O操作。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反。 索引是创建在 表 上的,是对数据库表中一列或者

    2024年02月09日
    浏览(20)
  • Android---Glide的基本使用

    目录 Glide 基本使用 Glide 进阶  Glide 是一个快速高效的 Android 图片加载库,可以自动加载网络、本地文件,app 资源中的图片,注重于平滑的滚动。 Glide 第一次加载一张图片后,就会自动帮我们把这张图片加入到内存中进行管理。 步骤1 :导入 Glide 依赖 步骤2: 最简单使用 wi

    2024年02月03日
    浏览(31)
  • 【Docker】Docker基本使用介绍

    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。 一、安装Docker 首先,你需要从官方网站上下载Docker的安装包,并按照官方的安装指南进行安装。在安装完成后,可以通

    2024年02月09日
    浏览(26)
  • Viobot基本功能使用及介绍

    设备拿到手当然是要先试一下效果的,这部分可以参考本专栏的第一篇 Viobot开机指南。 接下来我们就从UI开始熟悉这个产品吧!   1.状态         设备上电会自动运行它的程序,开启了一个服务器,上位机通过连接这个服务器连接到设备,连接成功后就如上图所示,状态

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包