我的应用程序的服务中有以下方法:

public void switchSpeaker(boolean speakerFlag){

        if(speakerFlag){
        audio_service.setSpeakerphoneOn(false);
        }
        else{
        audio_service.setSpeakerphoneOn(true);
        }

    }

所以我的问题是在 Activity 中使用此方法的最佳和最有效的方法是什么,如下所示

final Button speaker_Button = (Button) findViewById(R.id.widget36);

            speaker_Button.setOnClickListener(new View.OnClickListener(){
                public void onClick(View v){

                    switchSpeaker(true); //method from Service

                }

            });

我必须做 AIDL 还是有更简单的方法?

有帮助吗?

解决方案

您不得不暴露service`s的 switchSpeaker 的客户端的方法。定义你的.aidl文件。比绑定从您的活动,服务,只需拨打的 switchSpeaker 的。 请参阅文档

没有其他简单的方法来调用此方法,只有当它静态)

其他提示

有 3 种方法可以将服务与您的活动绑定。

  1. IBinder实现
  2. 使用即时通讯工具
  3. 使用AIDL

其中 IBinder 实现是最适合您的情况的

IBinder 类示例

1.Server.java服务

public class Server extends Service{

    IBinder mBinder = new LocalBinder();


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

    public class LocalBinder extends Binder {
        public Server getServerInstance() {
            return Server.this;
        }
    }

    public void switchSpeaker(boolean speakerFlag){

        if(speakerFlag){
        audio_service.setSpeakerphoneOn(false);
        }
        else{
        audio_service.setSpeakerphoneOn(true);
        }

    }
}

2.Client.java 活动

public class Client extends Activity {

boolean mBounded;
Server mServer;
TextView text;
Button button;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

text = (TextView)findViewById(R.id.text);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            mServer.switchSpeaker(true);
        }
    });

}

@Override
protected void onStart() {
    super.onStart();
    Intent mIntent = new Intent(this, Server.class);
bindService(mIntent, mConnection, BIND_AUTO_CREATE);
};

ServiceConnection mConnection = new ServiceConnection() {

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

    public void onServiceConnected(ComponentName name, IBinder service) {
        Toast.makeText(Client.this, "Service is connected", 1000).show();
        mBounded = true;
        LocalBinder mLocalBinder = (LocalBinder)service;
        mServer = mLocalBinder.getServerInstance();
    }
};

@Override
protected void onStop() {
    super.onStop();
    if(mBounded) {
        unbindService(mConnection);
        mBounded = false;
    }
};
}

Messenger 类的示例

1.Server.java服务

public class Server extends Service{

    Messenger messenger = new Messenger(new LocalHandler());
    Messenger clientMessenger;
    static final int SysterTime = 0;
    static final int AddHandler = 1;
    List<Handler> mHandlers;

    @Override
    public void onCreate() {
        super.onCreate();
        mHandlers = new ArrayList<Handler>();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }

    public class LocalHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case SysterTime:
                SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                try {
                    clientMessenger.send(Message.obtain(null, SysterTime, mDateFormat.format(new Date())));
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;

            case AddHandler:
                clientMessenger = new Messenger((Handler) msg.obj);
                try {
                    clientMessenger.send(Message.obtain(null, AddHandler, "Registed messanger"));
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;

            default:
                break;
            }
            super.handleMessage(msg);
        }
    }
}

2.Client.java 活动

public class Client extends Activity {

    Messenger messenger;
    boolean mBounded;
    TextView text;
    Button button;
    Button register;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        text = (TextView)findViewById(R.id.text);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                Message message = Message.obtain(null, Server.SysterTime, null);
                try {
                    messenger.send(message);
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

        register = (Button) findViewById(R.id.register);
        register.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                Message message = Message.obtain(null, Server.AddHandler, new ClientHandle());
                try {
                    messenger.send(message);
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });

    }


    public class ClientHandle extends Handler {

        @Override
        public void handleMessage(Message msg) {

            switch (msg.what) {
            case Server.SysterTime:
                text.setText(msg.obj.toString());
                break;

            case Server.AddHandler:
                text.setText(msg.obj.toString());
                break;

            default:
                break;
            }

            super.handleMessage(msg);
        }


    }

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

        bindService(new Intent(this, Server.class), mConnection, BIND_AUTO_CREATE);
    }



    @Override
    protected void onStop() {
        super.onStop();
        if(mBounded) {
            unbindService(mConnection);
        }
    }



    ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceDisconnected(ComponentName name) {
            mBounded = false;
            messenger = null;
        }

        public void onServiceConnected(ComponentName name, IBinder service) {
            Toast.makeText(Client.this, "Service is connected", 1000).show();
            messenger = new Messenger(service);
            mBounded = true;
        }
    };
}

AIDL 示例

1.IRemoteService.aidl

package com.example.bindservice.aidl;

interface IRemoteService {

    String getMessage(String msg);
}

2.Server.java服务

public class Server extends Service{

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

    IRemoteService.Stub mStub = new IRemoteService.Stub() {

        public String getMessage(String msg) throws RemoteException {
            return msg;
        }
    };
}

3.Client.java 活动

public class Client extends Activity {

    Button button;
    TextView text;
    boolean mBound;
    IRemoteService mIRemoteService;
    EditText etMsg;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        text = (TextView)findViewById(R.id.text);
        button = (Button) findViewById(R.id.button);
        etMsg = (EditText)findViewById(R.id.etMsg);
        button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                if(mBound) {
                    try {
                        text.setText(mIRemoteService.getMessage(etMsg.getText().toString()));
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }                   
                }
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        bindService(new Intent(Client.this, Server.class), mConnection, BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        if(mBound) {
            unbindService(mConnection);
            mBound = false; 
        }
    }

    ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceDisconnected(ComponentName name) {
            mIRemoteService = null;
            mBound = false;
        }

        public void onServiceConnected(ComponentName name, IBinder service) {
            mIRemoteService = IRemoteService.Stub.asInterface(service);
            mBound = true;
        }
    };
}

更多学习可以参考 这个文件

这是公众,右:)

可以调用bindService(意向)方法。故事看看ApiDemos,类LocalServiceBinding。

在回调方法onServiceConnected,可以看到:

    public void onServiceConnected(ComponentName className, IBinder service) {
        // This is called when the connection with the service has been
        // established, giving us the service object we can use to
        // interact with the service.  Because we have bound to a explicit
        // service that we know is running in our own process, we can
        // cast its IBinder to a concrete class and directly access it.
        mBoundService = ((LocalService.LocalBinder)service).getService();

        // Tell the user about this for our demo.
        Toast.makeText(LocalServiceBinding.this, R.string.local_service_connected,
                Toast.LENGTH_SHORT).show();
    }

现在,使用该服务对象(mBoundService)调用的方法。

这是所有:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top