Android 通过 Activity 控制一个服务

标签 android service

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

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

最佳答案

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

在 AIDL 中,您可以在服务中实现方法,并通过 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);
    }

}

Activity 类

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

关于Android 通过 Activity 控制一个服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15969634/

相关文章:

c# - 通过 WCF 提供整个库的功能

java - 安卓 : Create Service as Independent Project

Linux:处理成服务

android - 扩展 AbsListView 示例

android - Recyclerview 滚动上的重复项

java - 以编程方式添加证书颁发机构,同时保留 Android 系统 SSL 证书

安卓音乐服务

java - 在 4.2.2 及更高版本的操作系统中获取 java.lang.NoSuchMethodError : android. os.FileUtils.getFatVolumeId

java - JUnit如何测试IntentService

android - 在 Android 9 中获取来电显示