适用于所有活动的Android :: Bind服务

时间:2014-08-14 09:04:43

标签: java android

我想做像话题一样的事情,但我不知道应该采取什么措施。

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

这是一些解决方法。我使用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()

但是,我无法一次性将服务绑定到所有活动。

我想使用Base Activity Class但没有希望。

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

基类

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

    mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mBounded = true;
            MqttPushService.LocalBinder mLocalBinder = (MqttPushService.LocalBinder)service;
            mService = mLocalBinder.getServerInstance();
            mService.setServiceCallbacks(BaseActivity.this);

            mListener.doServiceConnected();

            Toast.makeText(getBaseContext(), "Service is connected", 0).show();
        }

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

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

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

    if(mBounded) {
        mService.setServiceCallbacks(null); // unregister
        unbindService(mConnection);
        mBounded = false;
    }
}

@Override
public void doSomething(String act) {
    mListener.doServiceReturn(act);
}

protected void setServiceAttachedListener(onServiceAttached listener) {
    mListener = listener;
}

public interface onServiceAttached{
    void doServiceConnected();
    void doServiceReturn(String act);
}

当Screen1.class(First Activity)设置回调方法

  1. 呼叫服务方法并执行一些任务
  2. 听取返回结果并做一些任务
  3. 这个类没有问题,但是我的意图和新屏幕(SleepMode.class) 这是类这样的实现,但服务Log.d我是serviceCallBacks的null。 当服务想要调用活动方法时。

    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();
                }
            });
        }
    }
    

    }

    最后

    我的目标是想要将服务绑定到所有活动。此外,服务和活动应该能够相互交谈..有可能吗?请告诉我一些方法。

    注意

    我试着总结一下我的问题,但我不知道从哪里开始。

    我尝试展示一些工作,并想知道发生了什么。

    很抱歉让它成为一个长长的问题。

1 个答案:

答案 0 :(得分:0)

首先,您的Service不是绑定到活动的那个,Service是正在执行某些操作的组件,您的活动是按顺序绑定到服务的活动从中获取数据或其他东西。

因此,每次打开新活动时都需要绑定到您的服务,您的onCreate中具有绑定到服务的基本活动的方法非常好。

然后您可以拥有服务实现的接口,以便您可以与您的服务进行通信,并进行一些回调,以便在您的服务需要与活动进行通信时通知您的活动。