IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android进程间通信例子 -> 正文阅读

[移动开发]Android进程间通信例子

Android进程间通信例子

步骤

打开androidstudio

首先在src/main/aidl 创建adil文件夹。

// IBook.aidl
package aidlserver.app;

// Declare any non-default types here with import statements
import aidlserver.app.BankCount;

interface IBook {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void borrowBook(String number, int count);
    void sendData(in BankCount bank);
}

BankCount 自定义Parcelable对象,需在同包下声明

package aidlserver.app;
parcelable BankCount;
package aidlserver.app

import android.os.Parcel
import android.os.Parcelable

class BankCount() : Parcelable {
    var type: Int = 1
    var account: String = ""
    var name: String = "123456"
    var passwd: String = "liulei"

    constructor(parcel: Parcel) : this() {
        type = parcel.readInt()
        account = parcel.readString() ?: ""
        name = parcel.readString() ?: ""
        passwd = parcel.readString() ?: ""
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(type)
        parcel.writeString(account)
        parcel.writeString(name)
        parcel.writeString(passwd)
    }

    override fun describeContents(): Int {
        return 0
    }

    override fun toString(): String {
        return "BankCount(type=$type, account='$account', name='$name', passwd='$passwd')"
    }

    companion object CREATOR : Parcelable.Creator<BankCount> {
        override fun createFromParcel(parcel: Parcel): BankCount {
            return BankCount(parcel)
        }

        override fun newArray(size: Int): Array<BankCount?> {
            return arrayOfNulls(size)
        }
    }
}

在aidlServer module下创建BookService

package aidlserver.app

import android.app.Notification
import android.app.Service
import android.content.Intent
import android.os.Build
import android.os.Handler
import android.os.IBinder
import android.os.Looper
import android.widget.Toast
import androidx.core.app.NotificationChannelCompat
import androidx.core.app.NotificationManagerCompat

class BookService : Service() {

    private var handler = Handler(Looper.getMainLooper())

    override fun onCreate() {
        super.onCreate()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannelCompat.Builder(
                "bookService",
                NotificationManagerCompat.IMPORTANCE_DEFAULT
            )
                .setName("bookServiceChannel")
                .build()
            val notification = Notification.Builder(this, channel.id)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setWhen(System.currentTimeMillis())
                .setContentTitle("Aidl Book Service Demo")
                .build()
            NotificationManagerCompat.from(this).createNotificationChannel(channel)
            startForeground(1, notification)
            //startForegroundService(Intent(this, BookService::class.java))
        }
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        println("xxxx onStartCommand")
        return super.onStartCommand(intent, flags, startId)
    }

    private var myBinder = object : IBook.Stub() {
        override fun borrowBook(number: String?, count: Int) {
            println("xxxx borrow number = $number count = $count")
            handler.post {
                Toast.makeText(
                    this@BookService,
                    "borrowBook $number $count",
                    Toast.LENGTH_SHORT
                ).show()
            }
        }

        override fun sendData(bank: BankCount?) {
            println("IBook binder sendData $bank")
        }
    }

    override fun onBind(p0: Intent?): IBinder {
        return myBinder
    }
}

客户端运行示例代码:

package com.example.aidlclient

import aidlserver.app.BankCount
import aidlserver.app.IBook
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.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.example.aidlclient.databinding.ActivityMainBinding
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

/**
 * aidl 客户端
 */
class MainActivity : AppCompatActivity() {

    private var serviceConnection: ServiceConnection? = null
    private var iBookInterface: IBook? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val viewBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)

        viewBinding.test.setOnClickListener {
            if (iBookInterface == null) {
                Toast.makeText(it.context, "未获取到binder对象", Toast.LENGTH_SHORT).show()
            } else {
                iBookInterface?.borrowBook("you are best!", 202288)
                lifecycleScope.launch {
                    delay(500L)
                    BankCount().apply {
                        account = "leige"
                        name = "12"
                        type = 1
                        passwd = "123456"
                        iBookInterface?.sendData(this)
                    }

                }

            }
        }

        serviceConnection = object : ServiceConnection {
            override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) {
                println("xxxx onServiceConnected p0 = [${p0}], p1 = [${p1}]")
                val iBook: IBook = IBook.Stub.asInterface(p1)
                iBookInterface = iBook
            }

            override fun onServiceDisconnected(p0: ComponentName?) {
                println("xxxx onServiceDisconnected p0 = [${p0}]")
            }
        }

        val ret = bindService(
            getServiceIntent(),
            serviceConnection as ServiceConnection,
            Service.BIND_AUTO_CREATE
        )
        if (!ret) {
            unbindService(serviceConnection as ServiceConnection)
        }
        println("xxxx bindService ret = $ret")
    }

    private fun getServiceIntent(): Intent {
        val intent = Intent("aidlserver.app.BookService")
        intent.setPackage("aidlserver.app")
        return intent
    }

    override fun onDestroy() {
        super.onDestroy()
        try {
            serviceConnection?.let { unbindService(it) }
        } catch (ex: Throwable) {
            ex.printStackTrace()
        }
    }
}

最后附上项目地址:

https://gitee.com/liulei9385/android-binder-demo

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-24 15:24:46  更:2022-02-24 15:26:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/23 8:15:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码