Activity与Service通信之自定义接口

原创 2016年06月01日 16:42:58
一、实现原理:
        自定义一个接口,该接口中有一个获取当前下载进度的空方法。Server端用一个类继承自Binder并实现该接口,覆写了其中获取当前下载进度的方法。Client端通过ServiceConnection获取到该类的对象,从而能够使用该获取当前下载进度的方法,最终实现实时交互。
二、实现步骤:
1、自定一个接口:
public interface ICountService {
int getCurrentLoad();
}
2、定义一个类继承Service,其中要:
     (1) 自定义Binder实现上面的接口:
/**
* 自定义 Binder
*/
public class ServiceBinder extends Binder implements ICountService {

@Override
public int getCurrentLoad() {
return temp;
}

}
    (2)返回自定义Binder对象
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new ServiceBinder();
}
3、Client端使用bindService()绑定Server端,通过public void onServiceConnected(ComponentName name, IBinder service)方法获取服务端的自定义Binder对象,进而可以使用计时器不断的获取进度
/** 服务练级监听*/
private ServiceConnection serConn = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
serviceBinder = null;
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
serviceBinder = (CustomInfaceService.ServiceBinder) service;
if (serviceBinder != null){
timer.schedule(new MyTimerTask(), 0, 1000);
}
}
};
三、核心代码:
Service:
importandroid.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.annotation.Nullable;
import java.util.Timer;
import java.util.TimerTask;
import testndk.testservice.interf.ICountService;
/**
* <h3>Description</h3>
* TODO
* <h3>Author</h3> luzhenbang
* <h3>Date</h3> 2016/6/1 9:44
* <h3>Copyright</h3> Copyright (c)2016 Shenzhen Tentinet Technology Co., Ltd. Inc. All rights reserved.
*/
public class CustomInfaceService extends Service {

/** 计时器*/
private Timer timer;
private int temp = 0;

private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 21:
if (temp == 100){
temp = 0;
}else {
temp ++ ;
}
break;
}
}
};

@Nullable
@Override
public IBinder onBind(Intent intent) {
return new ServiceBinder();
}
@Override
public void onCreate() {
timer = new Timer();
timer.schedule(new MyTimerTask(), 0, 1000);
super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
/**计时器*/
class MyTimerTask extends TimerTask {
@Override
public void run() {
Message message = handler.obtainMessage();
message.what = 21;
handler.sendMessage(message);
}
}
/**
* 自定义 Binder
*/
public class ServiceBinder extends Binder implements ICountService {

@Override
public int getCurrentLoad() {
return temp;
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (timer != null){
timer.cancel();
}
}
}
Activity:
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;

import testndk.testservice.service.CustomInfaceService;

public class CustomInActivity extends Activity {
private boolean mIsBind;
private Button startBtn = null;
private Button stopBtn = null;
private TextView mTextView = null;
private Intent intent = null;
private ProgressBar mProgressBar = null;
private CustomInfaceService.ServiceBinder serviceBinder;

/** 计时器*/
private Timer timer;

private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 21:
int curLoad = serviceBinder.getCurrentLoad();
mTextView.setText(curLoad+"%");
mProgressBar.setProgress(curLoad);
break;
}
}
};

/** 服务练级监听*/
private ServiceConnection serConn = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
serviceBinder = null;
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
serviceBinder = (CustomInfaceService.ServiceBinder) service;
if (serviceBinder != null){
timer.schedule(new MyTimerTask(), 0, 1000);
}
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer = new Timer();

intent = new Intent(this,CustomInfaceService.class);
mProgressBar = (ProgressBar)findViewById(R.id.myProgressBar);
mProgressBar.setMax(100);
mTextView = (TextView)findViewById(R.id.loading_Tv);
startBtn = (Button)findViewById(R.id.start_Btn);
stopBtn = (Button)findViewById(R.id.stop_Btn);
startBtn.setOnClickListener(new ButtonClickListener());
stopBtn.setOnClickListener(new ButtonClickListener());

}
class ButtonClickListener implements OnClickListener {

@Override
public void onClick(View v) {
if (startBtn == v) {
mIsBind = bindService(intent, serConn, Context.BIND_AUTO_CREATE);//if bind success return true
} else if (stopBtn == v) {
if(mIsBind){
unbindService(serConn);
// timer.cancel();
mIsBind = false;
}
}
}

}


/**计时器*/
class MyTimerTask extends TimerTask {
@Override
public void run() {
Message message = handler.obtainMessage();
message.what = 21;
handler.sendMessage(message);
}
}


@Override
protected void onDestroy() {
super.onDestroy();
if (timer != null){
timer.cancel();
}
if (mIsBind){
unbindService(serConn);
}
}
}

源码下载地址:

http://download.csdn.net/detail/lu1024188315/9537991

效果图:


版权声明:请尊重劳动成果,转载请注明来处:Abang的博客 http://blog.csdn.net/lu1024188315,如果您有不同意见,请尽情留言

Android学习之Activity与Service进行通信的三种方式

Activity与Service进行通信的三种方式 第一种 简单通信 直接通过Intent进行传值,我们在启动一个Service的时候通过Intent的对象向Service进行传值,这种方式传...
  • qq_28468727
  • qq_28468727
  • 2016年08月07日 19:02
  • 15041

Android Service与Activity双向通信的两种方式

本博客只讲述同一个进程中activity和Service的通信,进程间通信可以使用AIDL,后续博客更新.关于Service的认识service是一种组件,不是单独的线程或者进程,它属于UI线程,只不...
  • ethanhola
  • ethanhola
  • 2017年03月10日 00:37
  • 1914

Android Service与Activity之间通信的几种方式

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ...
  • xiaanming
  • xiaanming
  • 2013年08月05日 00:11
  • 187982

实现Activity和Service通信的几种方案

Service作为Android四大组件之一,一直默默无闻的在后台保证程序能正常运作。按照Google的定义,Service能在后台执行长时间的运行操作而不使用用户界面,它与后台线程的区别是它是整个程...
  • csdnYF
  • csdnYF
  • 2016年06月10日 20:31
  • 666

Service与Activity之间通信的几种方式

转载请注明地址http://blog.csdn.net/xiaanming/article/details/9750689 在Android中,Activity主要负责前台页面的展示,Service...
  • dj0379
  • dj0379
  • 2016年06月05日 14:55
  • 2792

用Messenger实现Activity与Service的信息交互

Android环境下,基于Messenger技术实现Activity与Service数据交换的实例程序参考
  • u013615937
  • u013615937
  • 2016年07月21日 14:58
  • 453

Activity和Service通信方式总结

原文地址:http://blog.csdn.net/xiaanming/article/details/9750689;http://blog.csdn.net/stonecao/article/de...
  • pinghegood
  • pinghegood
  • 2015年02月05日 21:45
  • 1312

Android开发之Service与多个Activity通信

本文转载自:http://www.cnblogs.com/ivan-xu/archive/2014/11/02/4069479.html,感谢原文作者的贡献 !...
  • itluochen
  • itluochen
  • 2016年08月09日 23:18
  • 2043

android中Activity与service之间相互通信的实现方式

使用intent代参,intent可以带基础数据类型,基础数据类型的数组,序列化对象,集合 使用广播 使用单例模式,在activity与service中少用 bindService获取引用,AIDL(...
  • Dr_abandon
  • Dr_abandon
  • 2016年11月10日 19:47
  • 582

Activity与Service之间的通讯机制

进程内与服务通信 进程内与服务通信实际上就是通过bindService的方式与服务绑定,获取到通信中介Binder实例,然后通过调用这个实例的方法,完成对服务的各种操作。 下面来看具体代码演示: ...
  • wuseyukui
  • wuseyukui
  • 2015年08月20日 17:13
  • 1418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Activity与Service通信之自定义接口
举报原因:
原因补充:

(最多只允许输入30个字)