我在这里知道answer。解决方案是使用广播接收器并在其中启动服务,然后在清单中注册它。问题是我使用react-native进行编码,但必须编写一些本机代码。我有一个广播接收器,但它在我的ReactContextBaseJavaModule
内定义如下:
public class PhonePositionModule extends ReactContextBaseJavaModule {
public PhonePositionModule(ReactApplicationContext reactContext) {
super(reactContext);
BroadcastReceiver phonePositionReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
float[] message = intent.getFloatArrayExtra("message");;
PhonePositionModule.this.sendEvent(message);
}
};
LocalBroadcastManager.getInstance(getReactApplicationContext()).registerReceiver(phonePositionReceiver, new IntentFilter("PhonePosUpdate"));
}
我所做的是创建一个扩展广播接收器并从那里启动服务的新类,但我不喜欢这种方法,因为这意味着我正在以两种方式(或两种不同的代码)启动服务。 / p>
1)用户通过调用react方法启动它:
@ReactMethod
public void startService(Promise promise) {
String result = "Success";
try {
Intent intent = new Intent(PhonePositionService.FOREGROUND); ///////
intent.setClass(this.getReactApplicationContext(), PhonePositionService.class);
getReactApplicationContext().startService(intent);
} catch (Exception e) {
promise.reject(e);
return;
}
promise.resolve(result);
}
2)由定制的广播接收器启动后启动:
public class BootCompletedIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent pushIntent = new Intent(context, PhonePositionService.class);
context.startService(pushIntent);
}
}
}
我认为这就是我的应用程序在进入时崩溃的原因。有没有办法在启动时调用startService而不是像上面那样创建其他类?
答案 0 :(得分:1)
我无法分辨您的代码中有哪些内容和/或哪些部分正在运行和/或哪些部分崩溃。但您对@brandall的回复表明您并不关心崩溃,只想使用一个广播接收器。那么,您是否有理由不使用相同的BootCompletedIntentReceiver作为唯一的接收器?假设一切正常(或者您知道如何让它们工作),您是否可以使用一个接收器并修改BootCompletedIntentReceiver来过滤PhotoPostUpdate,例如:
public class BootCompletedIntentReceiver extends BroadcastReceiver {
@Override
//this is your code
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent pushIntent = new Intent(context, PhonePositionService.class);
context.startService(pushIntent);
}
//this part is added
if ("PhonePosUpdate".equals(intent.getAction())) {
//below is the same code you are using in phonePositionReceiver
float[] message = intent.getFloatArrayExtra("message");;
PhonePositionModule.this.sendEvent(message);
}
}
}
或许我误解了评论/问题。
答案 1 :(得分:-1)
试试这个:
public class BootCompletedIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent pushIntent = new Intent(context, PhonePositionService.class);
pushIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //New line added
context.startService(pushIntent);
}
}
}
对于广播接收器,您有时需要设置标志,您的可能就是其中之一。