Android 四大组件学习Service六

上几节,我们学习如何用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的返回值得到服务的代理,记住不是服务的本身。通常情况下把服务的代理或者中间人,一般把中间人独有的方法抽成接口。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 02:51:21

Android 四大组件学习Service六的相关文章

【Android的从零单排开发日记】之入门篇(五)——Android四大组件之Service

这几天忙着驾校考试,连电脑都碰不到了,今天总算告一段落了~~Service作为Android的服务组件,默默地在后台为整个程序服务,辅助应用与系统中的其他组件或系统服务进行沟通.它跟Activity的级别差不多,但不能自己运行只能后台运行.service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等, 总之服务总是藏在后台的. ps:Service运行在主线程中的,所

Android 四大组件之Service详解

                   Android四大组件之Service详解    来这实习已经10多天了,今天整理整理学习时的Android笔记.正所谓好记性不如烂笔头,今天来说说service组件. service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的. Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个

Android四大组件之一Service介绍-android学习之旅(十二)

基本概念: service是android四大组件之一,运行在后台执行耗时操作,并不提供用户界面.其他组件如acticity可以通过startService启动该组件,也可以通过bindService启动并把绑定该组件进行通信. 使用场景 后台下载文件,以及播放音乐等 注意 service运行在主线程中,他不会创建属于自己的线程,也不是运行在独立的线程中,所以在使用的时候,需要自己创建线程,而不应该直接使用,这样会造成ANR错误. service的两种形式 started service 其他组

Android成长日记-Android四大组件之Service组件的学习

1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它没有用户界面,所以绝不会到前台来.一旦Service被启动起来,它就与Activity一样.它完全具有自己的生命周期. A Service is an application component that can perform long-running operations in the back

Android 四大组件之Service(上)

1.Service简介 Service是Android四大组件中最与Activity相似的组件,他们都代表可执行的程序.Service一直运行于后台,不会与用户交互,可用来处理一些耗时的任务(比如:后台播放音乐,I/O操作等).它的创建.配置与Activity基本相似,下面将详细介绍Android Service的开发. 2.创建.配置Service 2.1 定义一个继承Service类的子类 2.2 在AndroidManifest.xml中配置该Service 需要注意的是 Service和

android四大组件学习总结以及各个组件示例(1)

android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通信. (3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity. (4)Activity生命周期>什么是

Android 四大组件之service与Broadcast

Android 四大组件之一:service: Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy 主要有绑定和非绑定两种方式 首相在Activity中设置四个Button,用于测试绑定和非绑定两种方式,按下Button播放音乐,停止音乐,非绑定用StopService停止,绑定方式用Bind Service启动,解绑用unbindService停止. 非绑定:Intent intent=new Intent(Mai

Android 四大组件学习之Activity一

Activity是Android四大组件中最基础也是最常用的组件之一.Activity作为一个应用程序组件,提供了一个与用户交互的界面.可以这么说Activity是和用户操作有密切相关的的,常用来负责与用户交互,可以通过setContentView来显示组件. 今天我们学习如何去创建一个Activity 第一步: 创建一个Android Application Project, 填入应用名称,工程名称,包名 点击Next下一步:下面的选择都是默认的. 直到 你就可以选择一个Activity进行创

Android 四大组件 (二) Service 使用

一. Service 介绍 Service属于android四大组件之一,在很多地方经常被用到.开启Service有两种不同的方式:startService和bindService.不同的开启方式,Service执行的生命周期方法也不同. 分 显示/隐示调用 ,但是官网推荐用显式的方式启动Service.下面 service使用 用的就是显示调用:注意事项用的就是隐示调用,在5.0系统上隐示调用会报错.所以这里只介绍使用显示调用. 不能再service里做耗时操作,否则ANR:需要开辟子线程进行