我正在使用React Native构建一个应用程序,该应用程序需要一项服务来检测未接来电并将其发送到服务器上,然后在电话状态栏中显示通知。
我决定编写自己的扩展来处理此问题,因为我没有找到任何满足我需要的节点模块。不幸的是,服务已在几个小时后被终止,我无法解决。基本上,我是JavaScript开发人员,Java的本机代码对我来说就像一个黑洞,所以我将非常感谢您的帮助。
该应用程序使用Headless JS向服务器发送数据,基本上所有扩展都基于文章:
我发现了一些类似的主题:
并尝试遵循此处描述的说明,但是所有这些解决方案仅与本机代码相关,而未使用React Native和Headless JS,因此我不知道该解决方案是否适合使用React Native的应用程序或可能(当然)我做错了。
这是我的AndroidManifest部分,负责服务和BroadcastReceiver:
def find_color(input):
input = input.replace("rgb(","").replace(")","").replace(' ' , '' )
return max(map(int,input.split(',')))
print(find_color("rgb(125, 50, 175)"))
我的CallLogService类:
(...)
<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>
(...)
我的CallLogReceiver类:
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
);
}
}
我正在使用React Native 0.50.3
最后,我还有一个问题。我注意到重启电话后,该服务也被终止。我也该如何预防这种情况?
编辑: 我注意到,如果应用程序在后台运行,则在发送请求后,不会记录响应。
但是在触发新请求之后,应用程序将获得先前请求的响应。我正在使用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);
}
}
做 ajax 。
例如。
axios
当应用程序处于后台时,我有:
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);
5秒后
Request 1
当应用程序处于前台时,一切正常:
Response 1 Request 2
5秒后
Request 1 Response 1