从不同的 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);
            }
        });