Android 无法绑定/连接到作为AAR库一部分创建的远程服务

Android 无法绑定/连接到作为AAR库一部分创建的远程服务,android,service,aar,Android,Service,Aar,我创建了一个生活在图书馆内的服务。然后,该库包含在另一个试图启动该服务的项目中。我正在使用AIDL进行交互,但是当我尝试连接到服务时,我的onConnected方法从未被命中 从日志文件中,我可以看到以下错误: D/ActivityManager: bindService callerProcessName:com.something.services.dummyproject, calleePkgName: com.something.services.dummyproject, action

我创建了一个生活在图书馆内的服务。然后,该库包含在另一个试图启动该服务的项目中。我正在使用AIDL进行交互,但是当我尝试连接到服务时,我的onConnected方法从未被命中

从日志文件中,我可以看到以下错误:

D/ActivityManager: bindService callerProcessName:com.something.services.dummyproject, calleePkgName: com.something.services.dummyproject, action: com.something.services.dummyservice.IDummyService

W/ActivityManager: Unable to start service Intent { act=com.something.services.dummyservice.IDummyService cmp=com.something.services.dummyproject/com.something.services.dummyservice.IDummyService } U=0: not found

D/ActivityManager: bindService callerProcessName:com.something.services.dummyproject, calleePkgName: com.something.services.dummyservice.service, action: null

W/ActivityManager: Unable to start service Intent { cmp=com.something.services.dummyservice.service/.DummyService } U=0: not found
DummyService.java文件如下所示:

package com.something.services.dummyservice.services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

import com.something.services.dummyservice.IDummyService;

public class DummyService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    private final IDummyService.Stub mBinder = new IDummyService.Stub() {
        @Override
        public String dummyHello() throws RemoteException {
            return "Hello";
        }

        @Override
        public void exit() throws RemoteException {
            stopSelf();
        }
    };
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.something.services.dummyservice">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".services.DummyService"
            android:exported="true"
            android:label="@string/app_name"
            tools:ignore="ExportedService" />
    </application>

</manifest>
// IDummyService.aidl
package com.something.services.dummyservice;

// Declare any non-default types here with import statements

interface IDummyService {

    String dummyHello();

    void exit();
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.something.services.dummyproject">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
package com.something.services.dummyproject;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.something.services.dummyservice.IDummyService;

import butterknife.Bind;
import butterknife.ButterKnife;


public class MainActivity extends AppCompatActivity {

    private IDummyService mDummyService;

    @Bind(R.id.btnStartService)
    Button btnStartService;

    @Bind(R.id.btnEndService)
    Button btnEndService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

                 btnStartService.setOnClickListener(startServiceOnClickListener);
        btnEndService.setOnClickListener(endServiceOnClickListener);
    }

    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            mDummyService = IDummyService.Stub.asInterface(service);

            dummyHello();
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
            mDummyService = null;
        }
    };

    private final View.OnClickListener startServiceOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(final View completeButton) {

            Intent intent = new Intent(MainActivity.this, com.something.services.dummyservice.IDummyService.class);
            intent.setAction(IDummyService.class.getName());
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        }
    };

    private final View.OnClickListener endServiceOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(final View completeButton) {
                exitService();
        }
    };

    private void dummyHello() {
        try {
            String response = mDummyService.dummyHello();

            Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    private void exitService() {
        try {
            if (mDummyService != null) {
                mDummyService.exit();
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
DummyService清单如下所示:

package com.something.services.dummyservice.services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

import com.something.services.dummyservice.IDummyService;

public class DummyService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    private final IDummyService.Stub mBinder = new IDummyService.Stub() {
        @Override
        public String dummyHello() throws RemoteException {
            return "Hello";
        }

        @Override
        public void exit() throws RemoteException {
            stopSelf();
        }
    };
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.something.services.dummyservice">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".services.DummyService"
            android:exported="true"
            android:label="@string/app_name"
            tools:ignore="ExportedService" />
    </application>

</manifest>
// IDummyService.aidl
package com.something.services.dummyservice;

// Declare any non-default types here with import statements

interface IDummyService {

    String dummyHello();

    void exit();
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.something.services.dummyproject">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
package com.something.services.dummyproject;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.something.services.dummyservice.IDummyService;

import butterknife.Bind;
import butterknife.ButterKnife;


public class MainActivity extends AppCompatActivity {

    private IDummyService mDummyService;

    @Bind(R.id.btnStartService)
    Button btnStartService;

    @Bind(R.id.btnEndService)
    Button btnEndService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

                 btnStartService.setOnClickListener(startServiceOnClickListener);
        btnEndService.setOnClickListener(endServiceOnClickListener);
    }

    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            mDummyService = IDummyService.Stub.asInterface(service);

            dummyHello();
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
            mDummyService = null;
        }
    };

    private final View.OnClickListener startServiceOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(final View completeButton) {

            Intent intent = new Intent(MainActivity.this, com.something.services.dummyservice.IDummyService.class);
            intent.setAction(IDummyService.class.getName());
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        }
    };

    private final View.OnClickListener endServiceOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(final View completeButton) {
                exitService();
        }
    };

    private void dummyHello() {
        try {
            String response = mDummyService.dummyHello();

            Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    private void exitService() {
        try {
            if (mDummyService != null) {
                mDummyService.exit();
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
我正在用上面的代码生成一个.aar文件

然后,我将该库包含到我的主项目文件中

我的主要项目中的清单如下:

package com.something.services.dummyservice.services;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

import com.something.services.dummyservice.IDummyService;

public class DummyService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    private final IDummyService.Stub mBinder = new IDummyService.Stub() {
        @Override
        public String dummyHello() throws RemoteException {
            return "Hello";
        }

        @Override
        public void exit() throws RemoteException {
            stopSelf();
        }
    };
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.something.services.dummyservice">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".services.DummyService"
            android:exported="true"
            android:label="@string/app_name"
            tools:ignore="ExportedService" />
    </application>

</manifest>
// IDummyService.aidl
package com.something.services.dummyservice;

// Declare any non-default types here with import statements

interface IDummyService {

    String dummyHello();

    void exit();
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.something.services.dummyproject">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
package com.something.services.dummyproject;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.something.services.dummyservice.IDummyService;

import butterknife.Bind;
import butterknife.ButterKnife;


public class MainActivity extends AppCompatActivity {

    private IDummyService mDummyService;

    @Bind(R.id.btnStartService)
    Button btnStartService;

    @Bind(R.id.btnEndService)
    Button btnEndService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

                 btnStartService.setOnClickListener(startServiceOnClickListener);
        btnEndService.setOnClickListener(endServiceOnClickListener);
    }

    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className, IBinder service) {
            mDummyService = IDummyService.Stub.asInterface(service);

            dummyHello();
        }

        @Override
        public void onServiceDisconnected(ComponentName className) {
            mDummyService = null;
        }
    };

    private final View.OnClickListener startServiceOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(final View completeButton) {

            Intent intent = new Intent(MainActivity.this, com.something.services.dummyservice.IDummyService.class);
            intent.setAction(IDummyService.class.getName());
            bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
        }
    };

    private final View.OnClickListener endServiceOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(final View completeButton) {
                exitService();
        }
    };

    private void dummyHello() {
        try {
            String response = mDummyService.dummyHello();

            Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    private void exitService() {
        try {
            if (mDummyService != null) {
                mDummyService.exit();
            }
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}
dummyProject还包含完全相同的AIDL文件。在这两种情况下,AIDL文件都位于AIDL文件夹中,该文件夹位于src\JAVA文件夹旁边。包含包含AIDL文件的包文件夹的


非常感谢您对我无法连接到该服务的任何帮助

嗨。谢谢你的回复。当我尝试这样做时:Intent Intent=newintent(MainActivity.this,com.something.services.dummyservice.dummyservice);setAction(IDummyService.class.getName());bindService(intent、mConnection、Context.BIND\u AUTO\u CREATE);我在A/S“无法解析DummyService”中收到错误。因此,我认为这意味着我在库中的服务在我的项目中是不可见的?我有,但即使我明确说明了整个路径,这也会失败,这让我认为,与您编写的内容(即我调用的应该是DummyService.class)一样,我的应用程序根本看不到我库中的服务。谢谢你的建议!只是在我的应用程序(包括库)运行时尝试了这一点。我得到以下错误:“错误:未找到;未启动服务。”无。电话是:com.something.services.dummyservice.dummyservice(注意,我将dummyservice移到子文件夹服务之外以使其更简单,然后重新构建并将我的库重新添加到我的应用程序中)对不起。没有/adb shell am startservice com.something.services.dummyservice.dummyservice