Android - 启动后自动运行服务

时间:2018-03-04 19:00:00

标签: android react-native

我在这里知道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而不是像上面那样创建其他类?

2 个答案:

答案 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);
    }
  }
}

对于广播接收器,您有时需要设置标志,您的可能就是其中之一。