Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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 在Android启动服务中调用函数_Java_Android - Fatal编程技术网

Java 在Android启动服务中调用函数

Java 在Android启动服务中调用函数,java,android,Java,Android,我正在开发一个应用程序来监控接近传感器值的变化。在应用程序中,应该有两个单独的按钮来启动服务,然后开始监控接近传感器 这是我的服务课 public class MyService extends Service{ Sensor proxSensor; SensorManager sm; public static MyService instance; @Override public int onStartCommand(Intent intent, int flags, int star

我正在开发一个应用程序来监控接近传感器值的变化。在应用程序中,应该有两个单独的按钮来启动服务,然后开始监控接近传感器

这是我的服务课

public class MyService extends Service{

Sensor proxSensor;
SensorManager sm;
public static MyService instance;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    instance = this;
    return Service.START_STICKY;
}

public void startScan(){
    sm=(SensorManager)getSystemService(SENSOR_SERVICE);
    proxSensor=sm.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    SensorEventListener eventListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            Log.e("Sensor","Value "+sensorEvent.values[0]);
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {
        }
    };
    sm.registerListener(eventListener, proxSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
我从我的主要活动开始服务

public void viewNotification(View view){
    startService(new Intent(this,MyService.class));
}

public void viewNotification2(View view){
    MyService.instance.startScan();
}
当应用程序运行时,日志输出正确打印,但当我关闭活动并将其从以前的应用程序列表中删除时,不会给出输出。但如果我在onStartCommand中调用startScan,即使在我关闭应用程序后,它也会继续运行

为什么它不继续提供输出?
有没有其他方法可以代替使用静态MyService来实现这一点

首先-使用服务绑定或aidl方法处理您的服务。见:

例如:

假设我们有一个名为MyService的服务。 在这节课上,你需要写下一个

private final IBinder mBinder = new LocalServiceBinder();

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

public class LocalServiceBinder extends Binder {
    public MyService getBinder() {
        return MyService.this;
    }
}
活动的下一步:

private MyService mService;
boolean isBounded;
private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d(TAG, "onServiceConnected");
            MyService.LocalServiceBinder binder = (MyService.LocalServiceBinder) service;
            mService = binder.getBinder();
            isBounded = true;

        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d(TAG, "onServiceDisconnected");
            isBounded = false;
        }
    };

现在,您可以调用以下服务方法:

private void activityMethod(){
    if (isBounded){
        mService.someMethod();
    }
}

第二,对于在前台工作,调用startForeground int-id,通知方法

将活动绑定到服务,不要使用静态方法访问它。从我看到的情况来看,即使关闭应用程序,您仍希望输出传感器的值吗?也不要以静态方式调用服务。我尝试绑定服务,但只有在活动处于活动状态时才会打印传感器输出。我希望服务不确定地运行这里的问题是当有界应用程序重新启动时,服务正在重新启动。解决方案是将服务作为前台服务在单独的进程中启动。是否可以绑定到已启动的服务?
private void activityMethod(){
    if (isBounded){
        mService.someMethod();
    }
}