尝试从非 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。
我之前有一个从 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。