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

Service (一) 启动/绑定服务

1. 配置清单

  1.1 build.gradle 引用 lifecycle 库

dependencies {
    implementation 'androidx.lifecycle:lifecycle-service:2.6.0-alpha02'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.0-alpha03'
    implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.0-alpha03'
} 

  1.2 AndroidManifest.xml 添加服务

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

  1.3 配置第二个 Activity

    <activity
           android:name=".SecondActivity"
           android:exported="false">

2. 创建服务 MyService.kt

class MyService : LifecycleService() {
    private val mTAG = "MyTag"
    private var number = 0
    val numberLiveData = MutableLiveData(0)
    override fun onCreate() {
        super.onCreate()
        Log.i(mTAG, "onCreate: Service")
    }
    
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.i(mTAG, "onStartCommand: Service")
        //stopSelf()
        lifecycleScope.launch {
            while (true) {
                delay(1_000)
                Log.i(mTAG, "onStartCommand: ${number++}")
            }
        }
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.i(mTAG, "onDestroy: Service")
    }

    inner class MyBinder : Binder() {
        val service = this@MyService
    }

    override fun onBind(intent: Intent): IBinder {
        super.onBind(intent)
        lifecycleScope.launch {
            while (true){
                delay(1_000)
                numberLiveData.value = numberLiveData.value?.plus(1)
            }
        }
        return MyBinder()
    }
}

3. 第一个Activity

  3.1 布局文件 activity_main.xml

<?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=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="34sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.422" />

    <Button
        android:id="@+id/buttonStartService"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="68dp"
        android:text="StartService"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/buttonBindService"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="21dp"
        android:text="BindService"
        android:textAllCaps="false"
        app:layout_constraintBottom_toTopOf="@+id/buttonStartService"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/buttonStartActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="32dp"
        android:text="Start Activity"
        android:textAllCaps="false"
        app:layout_constraintBottom_toTopOf="@+id/buttonBindService"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

  3.2 调用测试文件 MainActivity.kt

class MainActivity : AppCompatActivity() {
    private val mTAG = "MyTag"
    
    //1.用广播 容易破坏程序的结构化,不容易维护,容易滥用
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.i(mTAG, "onCreate: AppCompatActivity")
    }

    override fun onStart() {
        super.onStart()
        Log.i(mTAG, "onStart: AppCompatActivity")
        val buttonStartService: Button = findViewById(R.id.buttonStartService)
        buttonStartService.setOnClickListener {
            Intent(this, MyService::class.java).also {
                //it.putExtra()
                startService(it)
            }
        }

        val buttonStartActivity:Button = findViewById(R.id.buttonStartActivity)
        buttonStartActivity.setOnClickListener {
            Intent(this,SecondActivity::class.java).also {
                startActivity(it)
            }
        }

        //BindService 用来返回服务器中的内容
        val buttonBindService: Button = findViewById(R.id.buttonBindService)
        val textView: TextView = findViewById(R.id.textView)
        buttonBindService.setOnClickListener {
            val bindIntent = Intent(this, MyService::class.java)
            val serviceConnection = object : ServiceConnection {
                override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
                    (service as MyService.MyBinder).service.numberLiveData.observe(this@MainActivity) {
                        textView.text = "$it"
                    }
                }

                override fun onServiceDisconnected(name: ComponentName?) {
                }
            }
            startService(bindIntent)
            bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE)
        }
    }

    override fun onStop() {
        super.onStop()
//        Intent(this,MyService::class.java).also {
//            stopService(it)
//        }
        Log.i(mTAG, "onStop: AppCompatActivity")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.i(mTAG, "onDestroy: AppCompatActivity")
    }
}

4. 第二个Activity

  4.1 布局文件 activity_second.xml

<?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=".SecondActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="164dp"
        android:text="TextView"
        android:textSize="34sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/buttonBindService"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="108dp"
        android:text="Bind Service"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

  4.2 调用测试文件 SecondActivity.kt

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        //BindService 用来返回服务器中的内容
        val buttonBindService: Button = findViewById(R.id.buttonBindService)
        val textView: TextView = findViewById(R.id.textView)
        buttonBindService.setOnClickListener {
            val bindIntent = Intent(this, MyService::class.java)
            val serviceConnection = object : ServiceConnection {
                override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
                    (service as MyService.MyBinder).service.numberLiveData.observe(this@SecondActivity) {
                        textView.text = "$it"
                    }
                }
                override fun onServiceDisconnected(name: ComponentName?) {
                }
            }
            bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE)
        }
    }
}

5. 效果图

       

 

 

相关文章:

  • 数据结构-八大排序
  • MySQL小知识:为何从8.0开始取消了MySQL查询缓存
  • python数据类型(1)
  • HTML+CSS网页设计期末课程大作业 【茶叶文化网站设计题材】web前端开发技术 web课程设计 网页规划与设计
  • 8年三届世界杯,8年前端开发,梅西一共踢没了我八千八
  • 第十四届蓝桥杯模拟赛(第二期)——C语言版
  • c语言:关键字(一)
  • 毕业设计 单片机多功能红外空调遥控器 - 嵌入式 物联网
  • Docker 讲解与基本操作
  • 《PyInstaller打包实战指南》第二十二节 单文件模式打包Playwright
  • RK3399平台开发系列讲解(内存篇)ARM64虚拟地址空间布局
  • jsp474基于视频图像的人脸识别算法研究mysql
  • Android -- 每日一问:两个 Fragment 之间如何进行通信 ?
  • 【html5期末大作业】基于HTML+CSS+JavaScript管理系统页面模板
  • 【DL】Windiws10系统下安装CUDA和CUDNN实践教程
  • 【React系列】如何构建React应用程序
  • 4个实用的微服务测试策略
  • ES6--对象的扩展
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Protobuf3语言指南
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Terraform入门 - 3. 变更基础设施
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 算法---两个栈实现一个队列
  • 线性表及其算法(java实现)
  • Python 之网络式编程
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • #预处理和函数的对比以及条件编译
  • (1)常见O(n^2)排序算法解析
  • (a /b)*c的值
  • (Java)【深基9.例1】选举学生会
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (转)visual stdio 书签功能介绍
  • ..回顾17,展望18
  • .net 4.0发布后不能正常显示图片问题
  • .Net 8.0 新的变化
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net 简单实现MD5
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • @Autowired标签与 @Resource标签 的区别
  • @synthesize和@dynamic分别有什么作用?
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [145] 二叉树的后序遍历 js
  • [bzoj4240] 有趣的家庭菜园
  • [C# 网络编程系列]专题六:UDP编程
  • [CISCN2019 华东南赛区]Web4
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)
  • [EFI]Dell Inspiron 15 5567 电脑 Hackintosh 黑苹果efi引导文件
  • [Everyday Mathematics]20150130
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [NHibernate]条件查询Criteria Query
  • [POI2006] OKR-Periods of Words——最大周期长度(扩展最小周期长度)