javascript - React Native Android - 自定义 BroadcastReceiver/Service 在几个小时后被杀死
问题描述
我正在使用 React Native 构建一个应用程序,它需要一个服务来检测未接来电并将其发送到服务器上,然后在电话状态栏中显示通知。
我决定编写自己的扩展来处理这个问题,因为我没有找到任何足以满足我需求的节点模块。不幸的是,服务在几个小时后被终止,我无法处理。基本上,我是 JavaScript 开发人员,Java 中的本机代码对我来说就像一个黑洞,所以我将非常感谢任何帮助。
该应用程序使用 Headless JS 向服务器发送数据,基本上所有扩展都是基于文章:
- http://www.learn-android-easily.com/2013/06/detect-missed-call-in-android.html
- https://codeburst.io/simple-android-call-recorder-in-react-native-headlessjs-task-614bcc56efc4
我发现了一些类似的主题:
- Android服务进程在几个小时后被杀死
- https://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android
并尝试按照那里描述的说明进行操作,但所有这些解决方案仅与本机代码相关,而不使用 React Native 和 Headless JS,所以我不知道该解决方案是否适用于使用 React Native 或可能的应用程序(当然) 我做错了什么。
这是我负责 Service 和 BroadcastReceiver 的 AndroidManifest 部分:
(...)
<service android:name="com.app.service.CallLogService" />
<receiver android:name="com.app.receiver.CallLogReceiver">
<intent-filter android:priority="0">
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
(...)
我的 CallLogService 类:
package com.app.service;
import android.content.Intent;
import android.os.Bundle;
import com.facebook.react.HeadlessJsTaskService;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.jstasks.HeadlessJsTaskConfig;
import javax.annotation.Nullable;
public class CallLogService extends HeadlessJsTaskService {
@Nullable
protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
Bundle extras = intent.getExtras();
return new HeadlessJsTaskConfig(
"CallLog",
extras != null ? Arguments.fromBundle(extras) : null,
5000,
true
);
}
}
我的 CallLogReceiver 类:
package com.app.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.app.service.CallLogService;
import com.facebook.react.HeadlessJsTaskService;
public final class CallLogReceiver extends BroadcastReceiver {
public final void onReceive(Context context, Intent intent) {
(...)
callerPhoneNumber = intent.getStringExtra("incoming_number");
Intent callIntent = new Intent(context, CallLogService.class);
callIntent.putExtra("phone_number", callerPhoneNumber);
context.startService(callIntent);
HeadlessJsTaskService.acquireWakeLockNow(context);
}
}
我正在使用 React Native 0.50.3
最后我还有一个问题。我注意到重启手机后服务也被杀死了。我怎样才能防止这种情况呢?
编辑: 我注意到如果应用程序在后台,那么在发送请求后,响应不会被记录。
但是在发出新请求后,应用程序正在从先前的请求中获得响应。我正在axios
使用ajax。
例如。
let callAjax = function(counter){
console.log('Request ' + counter);
axios.get('/user?ID=12345')
.then(function (resp) {
console.log('Response ' + counter);
})
};
callAjax(1);
setTimeout(() => {
callAjax(2);
}, 5000);
当应用程序在后台时,我有:
Request 1
5 秒后
Response 1 Request 2
当应用程序处于前台时,一切正常:
Request 1 Response 1
5 秒后
Request 2 Response 2
解决方案
推荐阅读
- javascript - FCM 推送通知在 iOS 上不起作用
- php - Cakephp 3.x:如何构建具有多个角色的复杂授权
- .net-core - Entity Framework Core 不兼容 DotNet Core 类库
- mongodb - 在 mongodb 中使用带有投影的“或”where 子句?
- vba - windows10和excel 2016的VBA listview问题
- rx-java - 如何将hot observable和single变成cold observable
- excel - Excel - 从一个单元格添加/追加内容到新列
- javascript - Javascript 没有响应点击事件 [Laravel 5.5]
- r - 错误:需要`by`,因为数据源没有公共变量
- unity3d - 对象对撞机有时不工作