Как запустить службу Android из другого приложения для Android - программирование
Подтвердить что ты не робот

Как запустить службу Android из другого приложения для Android

У меня возникла проблема с запуском службы из другого приложения для Android (API 17). Однако, если я запускаю "am" из оболочки, сервис начинает нормально.

# am startservice com.xxx.yyy/.SyncService
Starting service: Intent { act=android.intent.action.MAIN cat=
[android.intent.category.LAUNCHER] cmp=com.xxx.yyy/.SyncService }
(service starts fine at this point)
# am to-intent-uri com.xxx.yyy/.SyncService
intent:#Intent;action=android.intent.action.MAIN;
category=android.intent.category.LAUNCHER;
component=com.xxx.yyy/.SyncService;end

Итак, похоже, что я ничего не теряю от намерения, когда я делаю то же самое в коде:

Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setComponent(new ComponentName("com.xxx.yyy", ".SyncService"));
ComponentName c = ctx.startService(i);
if (c == null) { Log.e(TAG, "failed to start with "+i); }

То, что я получаю (служба в это время не работает):

E/tag( 4026): failed to start with Intent { 
act=android.intent.action.MAIN 
cat=[android.intent.category.LAUNCHER] 
cmp=com.xxx.yyy/.SyncService }

У меня нет фильтра намерений в службе, и я не хочу его устанавливать, я действительно пытаюсь понять, что я делаю неправильно, начиная с его имени компонента, или что может быть это невозможно сделать.

4b9b3361

Ответ 1

Вы можете начать свое обслуживание следующим образом:

Intent i = new Intent();
i.setComponent(new ComponentName("com.xxx.yyy", "com.xxx.yyy.SyncService"));
ComponentName c = ctx.startService(i);

Вам не нужно устанавливать ACTION или CATEGORY, если вы указываете конкретный компонент. Убедитесь, что ваша служба правильно определена в манифесте.

Ответ 2

Начните свой сервис, как это

Intent intent = new Intent();
intent.setComponent(new ComponentName("pkg", "cls"));
ComponentName c = getApplicationContext().startForegroundService(intent);

Кстати, вам действительно нужно использовать applicationId вместо pkg. это можно найти в приложении Gradle. Я боролся с этой ошибкой часами!

   defaultConfig {
        applicationId "com.xxx.zzz"
}

cls - это название вашей службы, объявленной в манифесте. пример: com.xxx.yyy.yourService.

 <service android:name="com.xxx.yyy.yourService"
android:exported="true"/>