从不同的 activity Android 中删除 运行 服务
Delete a running Service from a different activity Android
我启动了一个服务来查看我的主 activity 上的加速度计数据,我在一个片段上有一个按钮,我想用那个按钮完成我的服务,但我一直收到这个错误
java.lang.NullPointerException: Attempt to invoke virtual method
'boolean android.content.Context.stopService(android.content.Intent)'
on a null object reference
这是我的主要activity 创建服务的地方
public class FragmentManager extends AppCompatActivity {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onPressStartService(Background_accelerometer.TAG);
}
public void onPressStartService(final String tag){
Log.e(LOG_TAG,"start");
intent = new Intent(FragmentManager.this, Background_accelerometer.class);
intent.addCategory(tag);
startService(intent);
}
public void onPressStopService(final String tag){
intent = new Intent(FragmentManager.this, Background_accelerometer.class);
intent.addCategory(tag);
stopService(intent);
}
}
这是我的服务
public class Background_accelerometer extends Service implements SensorEventListener {
public static final String TAG = "MyServiceTag";
public Background_accelerometer() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
Log.d("Service Started","Service Started");
mInitialized = false;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
return START_STICKY;
}
这是我的带有按钮的片段
public class FragmentDeveloper_2 extends Fragment {
FragmentManager FM = new FragmentManager();
Button stopBtn;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_developer, container, false);
stopBtn = (Button) view.findViewById(R.id.button_stop);
stopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FM.onPressStopService(Background_accelerometer.TAG);
}
});
return view;
}
如何在我的服务上添加标签以便能够将其关闭或从其他活动中回调?
此行有问题:
FragmentManager FM = new FragmentManager();
您的 class 名字引起混淆,它不是 FragementManager but an Activity。 Activity 不能像这样被你实例化。
您需要使片段的主机 Activity 执行 onPressStopService()
是 let it know through a ViewModel。您也可以通过注册回调来实现,但现在 ViewModel 是记录的方法。
否则你也可以走捷径直接运行:
stopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Activity a = requireActivity()
Intent intent = new Intent(a, Background_accelerometer.class);
intent.addCategory(tag);
a.stopService(intent);
}
});
我启动了一个服务来查看我的主 activity 上的加速度计数据,我在一个片段上有一个按钮,我想用那个按钮完成我的服务,但我一直收到这个错误
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.content.Context.stopService(android.content.Intent)' on a null object reference
这是我的主要activity 创建服务的地方
public class FragmentManager extends AppCompatActivity {
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onPressStartService(Background_accelerometer.TAG);
}
public void onPressStartService(final String tag){
Log.e(LOG_TAG,"start");
intent = new Intent(FragmentManager.this, Background_accelerometer.class);
intent.addCategory(tag);
startService(intent);
}
public void onPressStopService(final String tag){
intent = new Intent(FragmentManager.this, Background_accelerometer.class);
intent.addCategory(tag);
stopService(intent);
}
}
这是我的服务
public class Background_accelerometer extends Service implements SensorEventListener {
public static final String TAG = "MyServiceTag";
public Background_accelerometer() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
Log.d("Service Started","Service Started");
mInitialized = false;
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
return START_STICKY;
}
这是我的带有按钮的片段
public class FragmentDeveloper_2 extends Fragment {
FragmentManager FM = new FragmentManager();
Button stopBtn;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_developer, container, false);
stopBtn = (Button) view.findViewById(R.id.button_stop);
stopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FM.onPressStopService(Background_accelerometer.TAG);
}
});
return view;
}
如何在我的服务上添加标签以便能够将其关闭或从其他活动中回调?
此行有问题:
FragmentManager FM = new FragmentManager();
您的 class 名字引起混淆,它不是 FragementManager but an Activity。 Activity 不能像这样被你实例化。
您需要使片段的主机 Activity 执行 onPressStopService()
是 let it know through a ViewModel。您也可以通过注册回调来实现,但现在 ViewModel 是记录的方法。
否则你也可以走捷径直接运行:
stopBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Activity a = requireActivity()
Intent intent = new Intent(a, Background_accelerometer.class);
intent.addCategory(tag);
a.stopService(intent);
}
});