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-10-04 02:45:49

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

Android 四大组件学习之Service七

本节学习Service的分类: 本地服务, 远程服务 本地服务: 指的是服务和启动服务的activity在同一个进程中 远程服务:指的是服务和启动服务的activity不在同一个进程中 我们以前使用的都是本地服务,今天我们学习远程服务.学习远程服务就必须要学习AIDL(Android Interface Definition Language)安卓接口定义语言.编译器通过AIDL文件的描述信息生成符合通信协议的JAVA代码.我们在进程间通信的时候只需要调用即可. 既然要实现远程服务,就需要一个服

Android 四大组件学习之Activity六

本节学习Activity的状态保存与恢复. 先用例子开始: 布局文件主要是实现如下,大家自行编写 Activity逻辑代码: public class FiveActivity extends Activity { private Button setButton; private Button getButton; private EditText editText; private float value; @Override protected void onCreate(Bundle s

Android 四大组件学习之Service五

本节学习IntentService, 可能就有人问了, 什么是IntentService, IntentService有什么作用? 不是已经有了Service,那为什么还要引入IntentService呢? 带着这两个问题,我们先来看一个例子: 我们新建一个MyIntentService例子: public class MyIntentService extends IntentService { private int count = 5; public MyIntentService() {

Android 四大组件学习之Service二

上节学习如何创建了一个Service,并且用Activity启动一个Service.这节我们在上节的基础上更加完善 这节学习用StartServer启动服务,并且在服务中每隔一秒打印出当前时间 举例说明: MyActivity代码: public class MyActivity extends Activity { private Button btn_start; private Button btn_end; @Override protected void onCreate(Bundle

Android 四大组件学习之Service四

本节学习Service的生命周期. 既然Activity有生命周期,那同理Service也有自己的生命周期. 和学习Activity一样,我们先贴出Google官网给Service下的定义,以及生命周期图 从图中可以看到,左面一路下来是我们第二节课中说的用StartServer启动服务的流程.右面一路下来的是第三节中说的用BindService启动服务的流程. 在上两节中都看到了如何启动服务,同时销毁服务.既然这年代是混搭的年代,那当然也需要这两种服务混搭起来使用. 先来看看MyActivity

Android 四大组件学习之Service三

上节我们学习了,如何用StartService启动服务,这节学习如何用BindService启动一个服务 首先看MyActivity的代码部分: public class MyActivity extends Activity { private Button btn_start; private Button btn_end; private MyServiceConnection sConnection; @Override protected void onCreate(Bundle sa

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 四大组件学习之Activity一

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

Android 四大组件学习之BroadcastReceiver一

本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比如在现实社会中,以前每个人家都有一台收音机,这可就可以去接受广播发出来的消息.大家都知道,程序世界也是参照的显示生活设计出来的,那在Android系统中也引入了广播这个概念.那在Android系统中广播有什么作用呢? 举个例子:比如你正在玩游戏或者看视频突然手机电量过低,这时候就会弹出一个框,提醒您手机电量过低,请充电的提示.其实电量改变就是一种广播类型,当电量过低时,系统就会发生一条广播,这时候正在运行的程序就会收