Android之Service通信-(1)
一、本地Service通信
LocalService
/**
* Created by lsj on 2015/8/29.
* 这是一个LocalService
*/
public class StrReplaceService extends Service {
private final String TAG="StrReplaceService" ;
public class MyBinder extends Binder{
public StrReplaceService getService(){
return StrReplaceService.this ;
}
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return new MyBinder() ;
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
}
public String strReplace (){
String result = StringReplace.test() ;
Log.d(TAG,result) ;
return result ;
}
}
测试Activity
public class StringReplaceActivity extends BaseActivity {
private TextView resultTv ;
private ServiceConnection sc ;
private StrReplaceService strReplaceService ;
String result ="string" ;
@Override
public void onClick(View v) {
}
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, StrReplaceService.class);
//onCreate时候已经有了sc
bindService(intent, sc , Context.BIND_AUTO_CREATE) ;
}
@Override
protected void onStop() {
super.onStop();
unbindService(sc);
}
@Override
protected void findView() {
setContentView(R.layout.activity_str_replace);
}
@Override
protected void initView() {
resultTv = (TextView)findViewById(R.id.str_replace_resultTv);
sc = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
strReplaceService = ((StrReplaceService.MyBinder)service).getService() ;
//这个可以在onClick中调用
doService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
}
/**
* 调用StrReplaceService中的方法
*/
private void doService(){
result = strReplaceService.strReplace() ;
Log.d(TAG, result) ;
resultTv.setText(result);
}
@Override
protected void setOnClickListener() {
}
}
二、跨进程Service通信
RemoteService
/**
* this is remote service
*/
public class CQueueService extends Service {
private final String TAG ="CQueueService";
public static final int MSG_NO = 0;
class IncomingHandler extends Handler{
@Override
public void handleMessage(Message msg) {
if (msg.replyTo != null){
//收到消息后就向客户端发送一个回应
Message msg_to_client = this.obtainMessage() ;
msg_to_client.what = CQueueActivity.MSG_NO_TO_CLIENT;
try {
//得到客户端的Messenger,并向它发送消息
cMessenger = msg.replyTo ;
cMessenger.send(msg_to_client);
}catch (RemoteException e){
}
}
switch (msg.what){
case MSG_NO:
Toast.makeText(CQueueService.this, "msg from client", Toast.LENGTH_LONG).show();
break;
default:
super.handleMessage(msg);
}
}
}
/**
* 自己的Messenger
*/
Messenger sMessenger= new Messenger(new IncomingHandler());
//客户端的Messenger
Messenger cMessenger ;
public CQueueService() {
}
@Override
public void onCreate() {
Log.e(TAG, "onCreate");
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind");
//返回自己Messenger的binder,以供客户端通过Binder(new Messenger(binder))得到Service的Messenger对象。
return sMessenger.getBinder();
}
@Override
public boolean onUnbind(Intent intent) {
Log.e(TAG, "onUnbind");
return super.onUnbind(intent);
}
}
在配置文件中
<!-- remote service -->
<service
android:name=".service.CQueueService"
android:enabled="true"
android:exported="true"
android:process=":remote" >
</service>
测试Activity
public class CQueueActivity extends BaseActivity{
public static final int MSG_NO_TO_CLIENT=0;
ServiceConnection mSc ;
/**
* handler of incoming msg from serivce
*/
class IncomingHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MSG_NO_TO_CLIENT:
Toast.makeText(CQueueActivity.this,"ack_msg from service", Toast.LENGTH_LONG).show();
break;
default:
super.handleMessage(msg);
}
}
} ;
/**
* 自己的Messenger
*/
Messenger mMessenger = new Messenger(new IncomingHandler()) ;
//remote Service 的Messenger
Messenger sMessenger ;
@Override
protected void findView() {
setContentView(R.layout.activity_cqueue);
}
@Override
protected void initView() {
mSc = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "onServiceConnected");
//得到服务端的Messenger
sMessenger = new Messenger(service);
//向服务端发送消息
sendMsg() ;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisconnected");
}
} ;
}
/**
* 使用服务端的Messenger向它发送消息
*/
private void sendMsg(){
Message msg_to_service = new Message();
msg_to_service.replyTo = mMessenger;
try{
sMessenger.send(msg_to_service);
}catch (RemoteException e ){
e.printStackTrace();
}
}
@Override
protected void onStop() {
super.onStop();
this.unbindService(mSc);
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, this.getApplicationContext().getPackageCodePath()) ;
Intent service = new Intent(this, CQueueService.class) ;
this.bindService(service, mSc, Context.BIND_AUTO_CREATE) ;
}
@Override
public void onClick(View v) {
}
@Override
protected void setOnClickListener() {
}
}

浙公网安备 33010602011771号