Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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,我想做一些像topic说的事情,但我不知道该怎么做 我可以为每个活动绑定服务,并调用服务方法或服务调用活动方法 public class Screen1 extends BaseActivity implements BaseActivity.onServiceAttached { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); La

我想做一些像topic说的事情,但我不知道该怎么做

我可以为每个活动绑定服务,并调用服务方法或服务调用活动方法

public class Screen1 extends BaseActivity implements BaseActivity.onServiceAttached  {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View contentView = inflater.inflate(R.layout.main, null, false);
    mDrawer.addView(contentView, 0);

    setServiceAttachedListener(Screen1.this);
}

@Override
public void doServiceConnected() {

    try {
        mService.send("info","topic1/sensor1");
    } catch (MqttException e) {
        e.printStackTrace();
    }
}

@Override
public void doServiceReturn(String act) {
    if (act.equals("SCREEN1")) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                updateCurrentFragment();
            }
        });
    }
}
这是一些变通办法。我使用IBinder方法在服务和活动之间进行沟通

@Override
protected void onStart() {
    super.onStart();

    mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Toast.makeText(Screen1.this, "Service is connected", 1000).show();
            mBounded = true;
            MqttPushService.LocalBinder mLocalBinder = (MqttPushService.LocalBinder)service;
            mService = mLocalBinder.getServerInstance();
            mService.setServiceCallbacks(Screen1.this);
            //get temp info
            try {
                mService.send("info","topic1/sensor1");
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Toast.makeText(Screen1.this, "Service is disconnected", 1000).show();
            mBounded = false;
            mService = null;
        }
    };


    //Bind Service and Activity
    Intent mIntent = new Intent(this,MqttPushService.class);
    bindService(mIntent, mConnection, BIND_AUTO_CREATE);

}//END of onStart()

@Override
protected void onStop() {
    super.onStop();
    if(mBounded) {
        mService.setServiceCallbacks(null); // unregister
        unbindService(mConnection);
        mBounded = false;
    }
}//END of onStop()
然而,我不能一次将服务绑定到所有活动

我想用基本的活动课,但没有希望

我尝试在基类中实现绑定服务,并让其他人扩展这个基类服务

基类

当Screen1.class第一个活动设置回调方法时

调用服务方法并执行一些任务 倾听返回的结果并执行一些任务 在这个类中没有问题,但是当我使用intent和new screenselepmode.class时 这是类似于此类的实现,但service Log.d告诉我serviceCallBacks为空。 当服务想要调用活动方法时

public class Screen1 extends BaseActivity implements BaseActivity.onServiceAttached  {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View contentView = inflater.inflate(R.layout.main, null, false);
    mDrawer.addView(contentView, 0);

    setServiceAttachedListener(Screen1.this);
}

@Override
public void doServiceConnected() {

    try {
        mService.send("info","topic1/sensor1");
    } catch (MqttException e) {
        e.printStackTrace();
    }
}

@Override
public void doServiceReturn(String act) {
    if (act.equals("SCREEN1")) {
        this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                updateCurrentFragment();
            }
        });
    }
}
}

最后

我的目标是将服务与所有活动绑定在一起。此外,服务和活动应该能够相互交谈。。有可能吗??请给我一些建议

我试图总结我的问题,但我不知道从哪里开始

我试着展示一些作品,想告诉大家发生了什么

很抱歉,这个问题有点长。

首先,您的服务不是绑定到活动的服务,您的服务是执行某些操作的组件,而您的活动是绑定到服务以便从服务或其他内容获取数据的组件

因此,每次打开一个新活动时,您都需要绑定到您的服务,让一个基本活动在其onCreate中绑定到服务的方法非常好

然后,您可以拥有服务实现的接口,这样您就可以与您的服务进行通信,还可以拥有一些回调,这样当您的服务需要与活动进行通信时,您的活动就会得到通知

@Override
protected void onStart() {
    super.onStart();

    mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Toast.makeText(Screen1.this, "Service is connected", 1000).show();
            mBounded = true;
            MqttPushService.LocalBinder mLocalBinder = (MqttPushService.LocalBinder)service;
            mService = mLocalBinder.getServerInstance();
            mService.setServiceCallbacks(Screen1.this);
            //get temp info
            try {
                mService.send("info","topic1/sensor1");
            } catch (MqttException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Toast.makeText(Screen1.this, "Service is disconnected", 1000).show();
            mBounded = false;
            mService = null;
        }
    };


    //Bind Service and Activity
    Intent mIntent = new Intent(this,MqttPushService.class);
    bindService(mIntent, mConnection, BIND_AUTO_CREATE);

}//END of onStart()

@Override
protected void onStop() {
    super.onStop();
    if(mBounded) {
        mService.setServiceCallbacks(null); // unregister
        unbindService(mConnection);
        mBounded = false;
    }
}//END of onStop()