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

Android-在活动中使用来自服务的方法?,android,service,android-activity,aidl,Android,Service,Android Activity,Aidl,我在应用程序中的服务中有以下方法: public void switchSpeaker(boolean speakerFlag){ if(speakerFlag){ audio_service.setSpeakerphoneOn(false); } else{ audio_service.setSpeakerphoneOn(true); } } 所以我的问题是,在下面的活动中使用这种方法

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

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

您必须为客户端公开服务的switchSpeaker方法。定义您的.aidl文件。而不是从您的活动绑定到该服务,只需呼叫switchSpeaker。 看

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

它是公共的,对吗:)

您可以调用bindService(Intent)方法。请看ApiDemos,LocalServiceBinding类

在ServiceConnected的回调方法中,您可以看到:

    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)调用该方法


仅此而已:)

将服务与活动绑定有3种方法

  • IBinder实现
  • 使用Messanger
  • 使用AIDL
  • 在这些IBinder实现中,最适合您的情况

    IBinder类示例

    一,。java服务

    二,。Client.java活动

    Messanger类示例

    一,。java服务

    AIDL示例

    一,。艾德汽车旅馆

    二,。java服务

    三,。Client.java活动


    有关更多研究,您可以参考

    了解aidl。我们必须处理多线程,因此这不是实现aidl以使用本地服务的正确方法。除此之外,我们还可以使用另外两个选项,即使用IBinder和Messanger。如果存在与activity.link的本地服务绑定,则IBinder将是最好的:p@ponkinI使用示例3使用aidl,在此处获取空指针异常字符串a=mIRemoteService.getMessage(“msg”)@RajaReddyPolamReddy用你的代码问一个新问题,这样你就可以得到更多更好的答案。在我的例子中,我完全遵循了你的“IBinder类示例”,但我得到了NullPointerException。我认为我的服务根本没有约束力。你能看看我的问题吗:很好的答案,正是我想要的。谢谢哪一个更可靠?但它将成为一个有界服务,即使在活动组件被销毁后,我也无法使用它。还有其他方法吗?如果您希望在活动被销毁时服务仍在后台运行,那么您可以正常启动服务,而无需将其绑定到您的活动。然后,为了从服务调用该方法,而不是直接调用,您可以使用Intent调用startService,因为它具有预定义的操作或额外数据,无论该服务是否已在运行,都将调用它onStartCommand方法-->检查Intent并在Intent匹配时调用所需的方法。这里的关键区别是这个调用是异步的,您不能直接获得方法结果。
    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);
            }
    
        }
    }
    
    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;
        }
    };
    }
    
    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);
            }
        }
    }
    
    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;
            }
        };
    }
    
    package com.example.bindservice.aidl;
    
    interface IRemoteService {
    
        String getMessage(String msg);
    }
    
    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;
            }
        };
    }
    
    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;
            }
        };
    }