Приложение не находит внешний сервис - почему так? - PullRequest
0 голосов
/ 10 июня 2019

В приложении A у меня есть следующий код для запуска службы в приложении B:

public void startAppBService() {
    PackageManager packageManager = getPackageManager();
    Intent serviceIntent = new Intent("com.example.project.appBCommunicator");
    List<ResolveInfo> services = packageManager.queryIntentServices(serviceIntent, 0);
    Log.d("Services", Integer.toString(services.size()));
    if (services.size() > 0) {
        ResolveInfo service = services.get(0);

        serviceIntent.setClassName(service.serviceInfo.packageName, service.serviceInfo.name);
        serviceIntent.setAction("com.example.project.appBReceive");
        serviceIntent.putExtra("foo", "bar");
        serviceIntent.putExtra("appAReceiver", resultReceiver);

        ComponentName cn = startService(serviceIntent);
    }
}

Я называю этот код в методе onCreate приложения A.

InПриложение B, я зарегистрировал свой IntentService в манифесте, как этот

<service
    android:name="com.example.project.appBCommunicator"
    android:enabled="true"
    android:exported="true"
    android:process=":remote">
    <intent-filter>
        <action android:name="com.example.project.appBReceive" />
        />
    </intent-filter>
</service>

Мой код для IntentService такой:

public class AppBCommunicator extends IntentService {

    public AppBCommunicator() {
        super("AppBCommunicator");
    }

    public AppBCommunicator(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        ResultReceiver rec = intent.getParcelableExtra("appAReceiver");
        ResultReceiver sendingReceiver = receiverForSending(rec);
        String val = intent.getStringExtra("foo");
        Bundle bundle = new Bundle();
        bundle.putString("resultValue", "My Result Value. Passed in: " + val);
        sendingReceiver.send(Activity.RESULT_OK, bundle);
    }

    public static ResultReceiver receiverForSending(ResultReceiver actualReceiver) {
        Parcel parcel = Parcel.obtain();
        actualReceiver.writeToParcel(parcel,0);
        parcel.setDataPosition(0);
        ResultReceiver receiverForSending = ResultReceiver.CREATOR.createFromParcel(parcel);
        parcel.recycle();
        return receiverForSending;
    }
}

По какой-то причине приложение A не находит IntentService приложенияB (services.size() возвращает 0).Что-то я делаю не так?

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Ваш Intent:

Intent serviceIntent = new Intent("com.example.project.appBCommunicator");

Здесь ваша строка действия com.example.project.appBCommunicator.

Ваш <intent-filter>:

<intent-filter>
    <action android:name="com.example.project.appBReceive" />
    />
</intent-filter>

Здесьваша строка действия com.example.project.appBReceive.

Ваш Intent не соответствует вашему <intent-filter>, поскольку строки действия не совпадают.

0 голосов
/ 11 июня 2019

Очевидно, что мое исправление состояло в том, чтобы удалить мой файл IntentService и воссоздать его под другим именем, используя мастер автоматической генерации Android Studio вместо создания его вручную. Я не знаю, почему это имело значение, но это имело место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...