android - NativeScript Angular - 如何添加 android 服务来处理通知?(java.lang.RuntimeException:无法实例化服务)
问题描述
我正在尝试创建一个用于处理 Firebase 消息的 android 服务(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 */
}
}
我还添加了更改以下我的 webpack 文件(如果需要,我可以提供文件的其余部分):
// 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
.service 文件和 webpack 配置中的各种内容,但我似乎无法让它工作。
谢谢!
解决方案
我找到了解决我的问题的方法。错误代码似乎在我的自定义服务中:
public init() {
/* Do nothing */
}
删除该方法完全解决了我上面遇到的问题。
似乎有一个默认init
方法,它具有一些重要的实现细节,例如将对象 ID 注册到实例。我注意到,当我声明该方法时,不仅没有调用super
它的版本,还在输出的 .java 文件的构造函数中添加了对该方法的调用(没有init
声明就不存在)。似乎这两种影响的某种组合导致了上述异常。
推荐阅读
- javascript - 未捕获的 ReferenceError:toggleFunction 未在 HTMLButtonElement.onclick 中定义
- android - 绘制矩形时 Y 轴具有意外值
- excel - 如何在 Excel 中选择和引用路径?
- c# - 使用接口返回类型时,ServiceRemoting V2_1 仍然抛出序列化异常
- javascript - 如何使用通配符基于查找列值显示或隐藏 Sharepoint 列
- cron - 如何同时使用 Cron 和 Rate 表达式来安排 CloudWatch 规则
- python - 如何修复 jinja2 异常模板 SyntaxError:
- opengl-es - 如何在 OpenGL ES2.0 着色器中使用 UBO
- scala - 无法从 scala 方法返回 Map
- linq - 如何使用 LINQ 在 web api 中选择列