我正在学习 AIDL 服务,因此我创建了两个应用程序。 AIDL 服务器和 AIDL 客户端。
在 AIDL Server 应用程序中,我创建了一个 .aidl 文件,您可以在下面看到。
// IAIDLColorInterface.aidl
package com.example.aidlserver;
interface IAIDLColorInterface {
int getColor();
}
创建此文件后,我重建了创建接口 java 文件的项目。然后我创建了如下服务类。
package com.example.aidlserver
import android.app.Service
import android.content.Intent
import android.graphics.Color
import android.os.IBinder
import android.os.RemoteException
import android.util.Log
import java.util.Random
class AIDLColorService : Service() {
override fun onBind(intent: Intent): IBinder {
return binder
}
private val binder: IAIDLColorInterface.Stub = object : IAIDLColorInterface.Stub() {
@Throws(RemoteException::class)
override fun getColor(): Int {
val rnd = Random()
val color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256))
Log.d("color", "getColor: $color")
return color
}
}
override fun onCreate() {
super.onCreate()
Log.d("AIDLColorService", "Service created")
}
override fun onDestroy() {
super.onDestroy()
Log.d("AIDLColorService", "Service destroyed")
}
}
Manifest文件如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AIDLServer"
tools:targetApi="31">
<service
android:name=".AIDLColorService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="AIDLColorService" />
</intent-filter>
</service>
</application>
</manifest>
现在我创建了另一个应用程序 AIDL 客户端,它在主活动中有按钮。单击按钮时,我正在调用应返回随机颜色的服务。但这似乎不起作用。当我打开应用程序时,我收到日志“无法绑定服务”,您可以在下面看到该日志以供参考。 以下是 AIDL 客户端应用程序中 MainActivity.kt 的代码。
package com.example.aidlclient;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import com.example.aidlclient.databinding.ActivityMainBinding;
import com.example.aidlserver.IAIDLColorInterface;
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
lateinit var iAIDLColorService: IAIDLColorInterface
var TAG = "MAIN ACTIVITY"
private var mConnection: ServiceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
iAIDLColorService = IAIDLColorInterface.Stub.asInterface(service)
Log.d(TAG, "Remote config Service Connected!!")
// Once the service is connected and initialized, set the click listener here.
}
override fun onServiceDisconnected(name: ComponentName?) {
Log.e(TAG, "onServiceDisconnected: $name", )
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val intent = Intent("AIDLColorService")
intent.setPackage("com.example.aidlserver")
val isServiceBound = bindService(intent, mConnection, Context.BIND_AUTO_CREATE)
if (isServiceBound) {
Log.d(TAG, "Service bound successfully")
} else {
Log.e(TAG, "Failed to bind service")
}
binding.btn.setOnClickListener {
if(!this::iAIDLColorService.isInitialized)
return@setOnClickListener
val color: Int = iAIDLColorService.getColor()
Log.i(TAG, "onServiceConnected: $color")
binding.btn.setBackgroundColor(color)
}
}
}
我已将相同的 .aidl 文件从 AIDL 服务器应用程序添加到此 AIDL 客户端应用程序。
Android 13 中我缺少什么吗?这似乎在 Android 10 设备中完美运行。 Android 10 之后就无法使用了。
谢谢
我对此很陌生,所以不知道要搜索什么。我阅读了 Android 关于 AIDL 和服务的完整文档,但找不到解决方案。
正如@Pawel评论的那样,您需要在
<queries>
中添加
AndroidManifest.xml
元素
<queries>
<package android:name="com.example.aidlserver" />
</queries>