AIDL 服务在 Android 13 中无法运行

问题描述 投票:0回答:1

我正在学习 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 和服务的完整文档,但找不到解决方案。

android service aidl
1个回答
0
投票

正如@Pawel评论的那样,您需要在

<queries>
 中添加 
AndroidManifest.xml

元素
<queries>
    <package android:name="com.example.aidlserver" />
</queries>
© www.soinside.com 2019 - 2024. All rights reserved.