Android - 在活动中使用服务中的方法?

时间:2010-02-16 11:14:55

标签: android service android-activity aidl

我的appplication中的服务中有以下方法:

public void switchSpeaker(boolean speakerFlag){

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

    }

所以我的问题是能够在如下的活动中使用此方法的最佳和最有效的方法

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还是有更简单的方法?

3 个答案:

答案 0 :(得分:70)

将服务与您的活动绑定有三种方法。

  1. IBinder实施
  2. 使用Messanger
  3. 使用AIDL
  4. 在这些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;
        }
    };
    }
    

    Messanger类的示例

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

    如需更多学习,请参阅this document

答案 1 :(得分:3)

您必须为客户端公开服务的 switchSpeaker 方法。定义.aidl文件。然后从您的活动绑定到该服务,只需调用 switchSpeaker 即可。 见documentation

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

答案 2 :(得分:3)

这是公开的,对吧:)

您可以调用bindService(Intent)方法。讲述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)来调用方法。

这就是全部:)