Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试从非活动类启动服务时出错_Java_Android_Android Service_Android Context - Fatal编程技术网

Java 尝试从非活动类启动服务时出错

Java 尝试从非活动类启动服务时出错,java,android,android-service,android-context,Java,Android,Android Service,Android Context,我以前有一个前台服务,我从一个活动启动。启动服务的代码包含在上述活动中 现在我想用一个非活动类来启动这个服务,这个类可以从不同的活动中调用。在执行此操作时,我会遇到一个错误: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ComponentName android.content.Context.startService(android.content.Intent)' on a

我以前有一个前台服务,我从一个活动启动。启动服务的代码包含在上述活动中

现在我想用一个非活动类来启动这个服务,这个类可以从不同的活动中调用。在执行此操作时,我会遇到一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.ComponentName android.content.Context.startService(android.content.Intent)' on a null object reference
工作代码块以前包含在单个活动中(我们称之为“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...
         }
}
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);
        }
    }
我尝试将其移动到非活动类,如下所示:

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...
         }
}
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);
        }
    }
我想从多个活动中称之为:

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...
         }
}
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));
        }
如果您在活动之外,则需要一种检索应用程序上下文的方法。通常,通过构造函数将上下文存储为变量,以便以后使用。例如,创建一个将应用程序上下文存储为变量的新类实例,在应用程序的其他地方使用该上下文启动服务

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

getActivity().getApplicationContext();

如果您使用的是intent服务,您应该首先启动该服务,使其初始化,然后再传递您的intent。

谢谢。我想因为我的活动扩展了AppCompatActivity,所以我的solo startService命令起作用,将其更新为context.startService在非活动类中起作用。