您的位置:首页 > 移动开发 > Android开发

android学习之绑定Service并与之通信

2016-04-22 20:18 459 查看
这篇文章的代码来自疯狂讲义

本来打算今天写一篇关于aidl的文章的,但是感觉网上的代码都不是很能看懂,然后因为涉及到bindservice,然后就先写一篇bindservice的文章,稍后再添上使用aidl的关于进程间通信的文章

如果Service和访问者之间需要进行方法的调用或者交换数据,那么久应该使用bindservice和unbindservice的方法启动,关闭service。

Context的bindService()方法的完整方法的三个参数意义:

第一个:Service,通过该参数指定要启动的Service

第二个:conn,该参数的第一个是ServiceCoonnection对象,该对象用于监听访问者与Service之间的连接情况。当访问者与Sercvice之间连接成功的时候将回调该ServiceConnection对象的OnServiceConnected(),当Service所在进程因为异常终止或者其它原因终止,那么将回掉ServiceConnection对象的onServiceDisconnected(),这里的函数的参数我就没有打了。

需要注意:当调用者主动通过unBindService()方法断开Service的链接时,onServiceDisconnected不会被调用。

第三个参数:flags,指定绑定的时候是否自动创建Service,如果为0则不自动创建,或BIND_AUTO_CREATE(自动创建)

onServiceConnected()方法中有一个Ibinder对象,这个对象可以进行被绑定的Service之间的通信

主要是通过onBinder对象返回的Ibinder对象进行通信。

这里,我会画一个图来解释这个问题:



找个时间真的要研究一下这个画图应该怎么处理。

好吧,终于可以贴代码了:

package com.jk.bindservice;

import com.jk.bindservice.BindService.MyBinder;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
// declare three button
Button btn_bind, btn_unbind, btn_get;
// declare a binder to receive the binder
BindService.MyBinder binder;
Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
innit();
}

private void innit() {
// bundle the button with id
btn_bind = (Button) findViewById(R.id.btn_bindservice);
btn_unbind = (Button) findViewById(R.id.btn_unbindservice);
btn_get = (Button) findViewById(R.id.btn_getconservice);
// set the clicklistener
btn_bind.setOnClickListener(this);
btn_unbind.setOnClickListener(this);
btn_get.setOnClickListener(this);
// set the intent
intent = new Intent(this, BindService.class);

}

private ServiceConnection conn = new ServiceConnection() {
// 当Activity和Service连接成功时回调该方法
// invoke the method when the activity connect the service
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("service connected");
// get the mybinder that return by service's onBind
// 获取Service的onBind方法所返回的MyBinder对象
binder = (MyBinder) service;

}

// invoke the method when disconnected with service
// 当连接断开时调用该方法
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("service disconnected");

}

};

@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_bindservice:
// bind the service
// 绑定到指定的Service
bindService(intent, conn, Service.BIND_AUTO_CREATE);
break;
case R.id.btn_unbindservice:
// unbindservice
// 解除绑定
unbindService(conn);
break;
case R.id.btn_getconservice:
// get the binder data
Toast.makeText(this, "count" + binder.getCount(),
Toast.LENGTH_SHORT).show();
break;
}

}

}
package com.jk.bindservice;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class BindService extends Service {
private int count;
private boolean quit;
// define the object that return by onBinder
// 定义onBinder方法所返回的对象
private MyBinder binder = new MyBinder();

// extends binder to realize Ibinder
// 通过继承Binder来实现IBinder类
public class MyBinder extends Binder {
public int getCount() {
// 获取service的运行的状态:count
return count;
}
}

// we can sent message by this method
// 必须实现的方法,绑定该Service时回调改方法
@Override
public IBinder onBind(Intent arg0) {
System.out.println("service is binded");
// 返回Ibinder对象
return binder;
}

// invoke this method when service was created
// service 被创建时调用该方法
@Override
public void onCreate() {
super.onCreate();
System.out.println("Service is Created");
// launch a thread to change the count
// 启动一条线程,动态修改count状态值
new Thread() {
public void run() {
while (!quit) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
count++;
}
};
}.start();
}

// invoke this method when service was connetted
// service 被断开时回掉该方法
@Override
public boolean onUnbind(Intent intent) {
System.out.println("service is unbind");
return true;
}

// invoke this method when service was close
// service 被关闭之前回调该方法
@Override
public void onDestroy() {
super.onDestroy();
this.quit = true;
System.out.println("service is destroyed");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: