1

对于聊天应用程序,我需要管理用户和 Web 服务之间通信的服务。我决定使用通常的 Android 服务组件。

我现在如何启动服务,我也知道如何从服务向活动发送消息,但是如何从活动控制服务?例如,用户发送一条消息,所以我必须让服务发送例如包含该消息的 http 请求。或者用户想要结束聊天会话,因此活动必须使服务发送包含结束聊天会话命令的请求。

4

1 回答 1

1

您可以使用AIDL http://developer.android.com/guide/components/aidl.html

在 AIDL 中,您可以在 service 中实现方法,并通过 binder 从 Activity 调用这些方法。

所以在你的情况下,1)在服务中实现 sendMessage(String msg)

2)在aidl文件中声明此方法并从服务中调用

mService.sendMessage(msg);

不使用 AIDL 进行编辑:

服务等级

public class LocalService extends Service {
    private final IBinder mBinder = new LocalBinder();
    private final Random mGenerator = new Random();
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return mBinder;
    }

    public class LocalBinder extends Binder{
        LocalService getService(){
            return LocalService.this;
        }
    }

    public int getRandomNumber()
    {
        return mGenerator.nextInt(100);
    }

}

活动课

public class BindingActivity extends Activity {
    LocalService mService;
    boolean mbound = false;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_binding);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_binding, menu);
        return true;
    }

    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        Intent intent = new Intent(this, LocalService.class);
        bindService(intent,mConnection,Context.BIND_AUTO_CREATE);

    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        if(mbound)
        {
            unbindService(mConnection);
            mbound = false;
        }
    }
    private ServiceConnection mConnection = new ServiceConnection(){


        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            LocalBinder binder = (LocalBinder)service;
            mService = binder.getService();
            mbound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            mbound = false;

        }
    };

    public void onClick(View view)
    {
        if(mbound)
        {
            int num = mService.getRandomNumber();
            Toast.makeText(this, "number: "+num, Toast.LENGTH_SHORT).show();
        }
    }
}
于 2013-04-12T11:09:05.350 回答