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在非活动类中起作用。