尝试从非 activity class 启动服务时出错

Error trying to launch service from non-activity class

我之前有一个从 activity 启动的前台服务。启动服务的代码包含在 activity.

现在我想用非 activity class 启动这项服务,可以从不同的活动中调用。这样做我得到一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ComponentName android.content.Context.startService(android.content.Intent)' on a null object reference

工作代码块之前包含在单数 activity 中(我们称之为 'ActivityClass'),看起来像这样:

private void serviceWrapper(String command){
        Intent service = new Intent(ActivityClass.this, Recorder.class);
        switch (command){
            case "start":
                    service.setAction(Constants.ACTION.STARTFOREGROUND_ACTION);
                    service.putExtra("recordAudio", RECORD_AUDIO);
                    startService(service);
                    break;
            etc...
         }
}

我尝试将其移动到非 activity class 看起来像这样:

public class ServiceWrapper extends AppCompatActivity {
   // variable to hold context passed
   private Context context;
   public ServiceWrapper(Context context){
      this.context=context;
   }
   public void serviceControl(String command){
        Intent service = new Intent(context, Recorder.class);
        switch (command)
        {
            case "start":
                    service.setAction(Constants.ACTION.STARTFOREGROUND_ACTION);
                    service.putExtra("recordAudio", RECORD_AUDIO);
                    startService(service);
                    break;
            etc....
        }

我想从这样的多个活动中调用它:

    private void startWrapper() {
        //Instantiate the class
        ServiceWrapper serviceWrapper = new ServiceWrapper(ActivityClass.this);
        //Check for permissions needed
        if (hasPermissionsGranted(Constants.PERMISSION_SETTINGS.VIDEO_PERMISSIONS)){
            serviceWrapper.serviceControl("start");
        }
        else {
            //kick off async request for permission
            ActivityCompat.requestPermissions(this, Constants.PERMISSION_SETTINGS.VIDEO_PERMISSIONS, REQUEST_VIDEO_PERMISSIONS);
        }
    }

但不幸的是我收到了这个错误。我不是一个知识渊博的程序员,所以如果这很明显,请原谅我。

通常这不是在 android 上启动前台服务的方式。

应该是这样的:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            context.startForegroundService(new Intent(context, HelloService.class));
 } else {
            context.startService(new Intent(context, HelloService.class));
        }

如果您在 activity 之外,您需要一种方法来检索应用程序上下文。通常,这将通过构造函数将上下文存储为变量来完成,以便您以后可以使用它。例如,创建一个新的 class 实例,将应用程序上下文存储为变量,在应用程序的其他地方使用该上下文启动服务。

或者取决于您的 class 扩展或实现的内容

getActivity().getApplicationContext();

如果您使用的是 Intent 服务,您应该首先启动该服务,以便对其进行初始化并在之后传递您的 Intent。