Android - Using method from a Service in an Activity?

后端 未结 3 1475
庸人自扰
庸人自扰 2020-12-07 15:06

I have the folowing method in a Service in my appplication:

public void switchSpeaker(boolean speakerFlag){

        if(speakerFlag){
        audio_service.s         


        
3条回答
  •  再見小時候
    2020-12-07 15:38

    There are 3 ways to binding service with your activity.

    1. IBinder Implementation
    2. Using Messanger
    3. Using AIDL

    Among these IBinder Implementation is the best suit in your case

    Example of IBinder class

    1. Server.java Service

    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 Activity

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

    Example of Messanger class

    1. Server.java service

    public class Server extends Service{
    
        Messenger messenger = new Messenger(new LocalHandler());
        Messenger clientMessenger;
        static final int SysterTime = 0;
        static final int AddHandler = 1;
        List mHandlers;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mHandlers = new ArrayList();
        }
    
        @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 Activity

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

    Example of AIDL

    1. IRemoteService.aidl

    package com.example.bindservice.aidl;
    
    interface IRemoteService {
    
        String getMessage(String msg);
    }
    

    2. Server.java Service

    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 Activity

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

    For more study you can refer this document

提交回复
热议问题