上几节。我们学习怎样用StartServer启动一个服务,用bindServer去绑定一个服务。以及服务的生命周期,以及什么是IntentService。

也许有读者会发现,我们BindServer中的第二个參数也就是ServiceConnection这种方法在将用bindService时好像没用到。

那本节课就学习。

那我们先说个事。上大学的时候。我学习不好,还是那种常常旷课的同学。

长期下去,老师跟前就混的不好了。

有次班里评选党员,我就想竞争一下,可是因为我常常不上课的同学,自然几率就小,所以我就想到走后门。 咋给导员点钱呗,反正导员是贪官,是贪官哪有不贪的。可是我不认识导员啊,那怎么办? 可是我舍友那是导员之前的红人啊,能够通过我舍友把钱给导员。然后让导员给我整个党员呗。

大概流程是这种:

那我们把这个转化为代码:

这个就相当与我们用于一个Activity去启动一个服务。可是服务有个方法,Activity想用可是却拿不到,仅仅能通过第三方去帮他拿。

上图中Activity就是我, 而Seriver就是贪官导员,仅仅有导员能给你一个名额让你成为党员。可是你不认识导员,所以就得去找你舍友,也就是导员的亲信。

那问题如今转话为: 我要找我舍友,也就是导员的亲信了。

那两种启动服务的方式。那种服务当创建后能返回给你这个亲信呢? 明显startService启动的服务是没有的。

可是bindService启动服务有:

	@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

就是bindService启动服务后,通过return返回值,默认情况下是null的。

既然分析到,bindService是能够返回到服务的,担不是服务本身,仅仅是服务的代理而已。

public class MainActivity extends Activity {

	private Intent intent;
private MyServiceConn conn;
SheYou me;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); intent = new Intent(this, DangYuanService.class);
conn = new MyServiceConn();
//绑定服务
bindService(intent, conn, BIND_AUTO_CREATE);
} //我想成为党员的方法
public void toDoDangyuan(View v)
{
//调用舍友的方法
me.ToBeDangYuan();
} class MyServiceConn implements ServiceConnection
{
//当服务连接成功后调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 得到服务的代理
me = (SheYou) service;
} @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub }
}
}

服务代码:

public class DangYuanService extends Service {

	@Override
public IBinder onBind(Intent intent) {
//返回服务的代理。也就是贪官导员的亲信
return new SheYou();
} //舍友独有的能给我办党员的方法
class SheYou extends Binder
{
//中间中(舍友)独有的方法,让你成为党员
public void ToBeDangYuan()
{
DangYuan();
}
} //服务自己的方法,也即是导员的权利
public void DangYuan()
{
Log.i("DangYuanService", "仅仅需1000元就能成为党员!");
} }

执行效果就知道了:我舍友找到导员,导员说“仅仅需1000元吉行”。  看看,导员多贪

我当时就想举报贪官,但是我还想着毕业呢。 就没举报贪官。

接着,我们导员还有个嗜好。那就是喝酒,当然了我舍友那必需要參加的。

	class SheYou extends Binder
{
//中间中(舍友)独有的方法。让你成为党员
public void ToBeDangYuan()
{
DangYuan();
} public void HeJiu()
{
Log.i("DangYuanService", "陪导员喝酒!!!!");
}
}

给我舍友加上一个新方法,陪导员喝酒

当然了陪导员喝酒。那仅仅有导员的亲信才干參加。像我这样的级别的人。那是不能參加的。当然也就无权知道了

    //我想成为党员的方法
public void toDoDangyuan(View v)
{
//调用舍友的方法
me.ToBeDangYuan();
me.HeJiu(); }

那如今我訪问喝酒的方法还是ok的。

按道理我是无权知道的。

那就不行了。那就对服务改动

这时候我们创建一个专门仅仅有当党员的借口:

public interface DangYuanInterface {

	//仅仅有一个方法,你能知道。那就是党员的事情
public void ToBeDangYuan();
}

然后让舍友。也就是中间人,实现这个接口

	class SheYou extends Binder implements DangYuanInterface
{
//中间中(舍友)独有的方法,让你成为党员
public void ToBeDangYuan()
{
DangYuan();
} public void HeJiu()
{
Log.i("DangYuanService", "陪导员喝酒!!!!");
}
}

然后,Activity中定义一个党员的接口

DangYuanInterface dangyuan;

然后得到这个中间人对象:

    public void toDoDangyuan(View v)
{
//调用舍友的方法
dangyuan.ToBeDangYuan(); } class MyServiceConn implements ServiceConnection
{
//当服务连接成功后调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 得到服务的代理
dangyuan = (DangYuanInterface) service;
} @Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub }
}

这时候你仅仅能知道关于党员的事情。别的事情你无权过问。





这样以后想须要获取服务里的方法。就能够通过onBind的返回值得到服务的代理。记住不是服务的本身。

通常情况下把服务的代理或者中间人,一般把中间人独有的方法抽成接口。

最新文章

  1. PHP HTML代码反转义
  2. idea初使用之配置使用maven仓库
  3. 【Android市场】提交应用的一点经验分享
  4. UVA1213Sum of Different Primes(素数打表 + DP)
  5. CCF 最优配餐 (BFS)
  6. [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别
  7. udev/raw/asmlib/多路径 配置asm
  8. Android蓝牙传感应用
  9. 使用rsyslog+loganalzey收集日志显示客户端ip
  10. tomcat6-7配置管理用户
  11. android studio gradle自动签名构建实现
  12. UITableView的style详解
  13. 设计模式笔记之一:MVP架构模式入门(转)
  14. .Net Core MVC 过滤器(一)
  15. 从 RAID 到 Hadoop Hdfs 『大数据存储的进化史』
  16. expect使用
  17. Listener 快速开始
  18. Vue自学
  19. C++程序设计方法4:函数模板
  20. falsk 与 django 捕获异常

热门文章

  1. 使用.Net中的WeakDictionary — ConditionalWeakTable
  2. HOW TO CHECK FOR ACTIVE TRACE FLAGS ON MICROSOFT SQL SERVER
  3. chrome 技巧 记录一些以前不太熟悉的
  4. Layui 使用问题汇总
  5. Mac的文件比对工具:Meld、Beyond Compare
  6. 精通JavaScript攻击框架:AttackAPI
  7. python 未发现数据源名称并且未指定默认驱动程序
  8. 使用Python开发SQLite代理服务器(转载)
  9. 蓝点通用管理系统V13版发布了!
  10. PuTTY连接Linuxserver常常断线解决方式