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模板网!

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

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

相关文章

  • bindService的调用流程

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

    2024年02月11日
    浏览(40)
  • 【Framework】bindService启动流程

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

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

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

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

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

    2024年02月09日
    浏览(37)
  • 索引介绍和基本使用

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

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

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

    2024年04月22日
    浏览(28)
  • 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日
    浏览(38)
  • Android---Glide的基本使用

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

    2024年02月03日
    浏览(41)
  • Gorm 入门介绍与基本使用

    目录 Gorm 入门介绍与基本使用 一、ORM简介 1.1 什么是ORM 1.2 使用ORM的好处 1.2.1 避免直接操作SQL语句 1.2.2 提高代码的可维护性 1.2.3 跨数据库兼容性 1.3 使用ORM的缺点 1.3.1 学习成本 1.3.2 性能开销 1.4 ORM解析过程 1.4.1 模型定义 1.4.2 数据验证 1.4.3 映射关系 1.4.4 CRUD操作 1.4.5 SQL生成

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

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

    2024年02月11日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包