首页 > 解决方案 > React Native Android - 自定义 BroadcastReceiver/Service 在几个小时后被杀死

问题描述

我正在使用 React Native 构建一个应用程序,它需要一个服务来检测未接来电并将其发送到服务器上,然后在电话状态栏中显示通知。

我决定编写自己的扩展来处理这个问题,因为我没有找到任何足以满足我需求的节点模块。不幸的是,服务在几个小时后被终止,我无法处理。基本上,我是 JavaScript 开发人员,Java 中的本机代码对我来说就像一个黑洞,所以我将非常感谢任何帮助。

该应用程序使用 Headless JS 向服务器发送数据,基本上所有扩展都是基于文章:

我发现了一些类似的主题:

并尝试按照那里描述的说明进行操作,但所有这些解决方案仅与本机代码相关,而不使用 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

标签: javascriptjavaandroidreactjsreact-native

解决方案


推荐阅读