NativeScript Angular - Как добавить службу android для обработки уведомлений? (java .lang.RuntimeException: невозможно создать экземпляр службы) - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь создать службу android для обработки сообщений Firebase (библиотека nativescript-plugin-firebase не позволяет мне использовать сообщения только для данных в фоновом режиме), но я не могу показаться чтобы сервис работал правильно. В частности, я получаю следующее исключение при получении уведомления (и иногда при запуске приложения):

System.err: java.lang.RuntimeException: Unable to instantiate service com.tns.services.CustomFCMService: com.tns.NativeScriptException: Cannot find object id for instance=com.tns.services.CustomFCMService@5a4269d
System.err:     at android.app.ActivityThread.handleCreateService(ActivityThread.java:3940)
System.err:     at android.app.ActivityThread.access$1500(ActivityThread.java:219)
System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)
System.err:     at android.os.Handler.dispatchMessage(Handler.java:107)
System.err:     at android.os.Looper.loop(Looper.java:214)
System.err:     at android.app.ActivityThread.main(ActivityThread.java:7356)
System.err:     at java.lang.reflect.Method.invoke(Native Method)
System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Моя служба определена в TypeScript следующим образом:

@JavaProxy('com.tns.services.CustomFCMService')
class CustomFCMService extends (com.google as any).firebase.messaging.FirebaseMessagingService {
  constructor() {
    super();
  }

  public init() {
    /* Do nothing */
  }

  public onMessageReceived(message: any) {
    this.super.onMessageReceived(message);
    /* Handle message receipt */
  }
}

Я также добавил, изменил следующий мой файл веб-пакета (я могу предоставить остальную часть файла, если необходимо):

// Add your custom Activities, Services and other Android app components here.
const appComponents = [
    "tns-core-modules/ui/frame",
    "tns-core-modules/ui/frame/activity",
    resolve(__dirname, 'src/app/core/android/custom-fcm-service') /* My custom service */
];

И, наконец, я добавил следующее к своему AndroidManifest.xml (внутри тег application):

<service android:name="com.tns.services.CustomFCMService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

Я пытался изменить различные вещи в AndroidManifest, файле службы и конфигурации веб-пакета, но не могу заставить его работать.

Спасибо!

1 Ответ

0 голосов
/ 24 марта 2020

Я нашел решение своей проблемы. Похоже, что ошибочный код был внутри моей пользовательской службы:

public init() {
    /* Do nothing */
}

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

Кажется, есть метод по умолчанию init, который имеет некоторые важные детали реализации, такие как регистрация идентификаторов объектов в экземплярах. Я заметил, что когда я объявил этот метод, я не только не вызвал его версию super, но и этот метод был добавлен в конструктор выходного файла. java (который без объявления init не существует). Кажется, некоторая комбинация этих двух эффектов вызывает исключение выше.

...