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 savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_myservice);

		btn_start = (Button)findViewById(R.id.button1);
		btn_end = (Button)findViewById(R.id.button2);
		btn_start.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 启动服务
				Intent intent = new Intent(MyActivity.this, MyService.class);
				//startService(intent);
				Log.i("MyActivity", "创建服务按钮被按下!");
				bindService(intent, sConnection, Context.BIND_AUTO_CREATE);
			}
		});

		btn_end.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 销毁服务
				Intent intent = new Intent(MyActivity.this, MyService.class);
				//stopService(intent);
				Log.i("MyActivity", "销毁服务按钮被按下!");
				unbindService(sConnection);
			}
		});
	}

	public class MyServiceConnection implements ServiceConnection
	{

		@Override//当连接服务成功后调用
		public void onServiceConnected(ComponentName arg0, IBinder arg1) {
			// TODO Auto-generated method stub
			Log.i("MyActivity", "onServiceConnected");

		}

		@Override//当server所在的进程由于异常终止或者其他原因终止调用
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			Log.i("MyActivity", "onServiceDisconnected");
		}
	}
}

这次我们用的是bindService启动服务,而bindService和StartServer明显不同的就是传递的参数不同。bindService需要三个参数:

参数1: Intent不用多说

参数2:该参数是一个ServiceConnection的对象,该对象用于监听访问者和Service之间的连接情况。其中,OnServiceConnected是当调用者与服务连接成功后调用,注意的是OnserviceDisconnected不是调用者与服务断开时后调用,而是由于某种原因异常终止等才调用

参数3:指定绑定时是否自动创建service,当然了是service还没创建时。

布局文件和上一次的一样,不再多说

MyService的代码如下:

public class MyService extends Service {

	private MyThread thread;
	private boolean stopFlag = false;

	@Override//必须实现的方法
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub

		//服务运行后,启动线程
		if(!stopFlag)
		{
			thread.start();
			thread.setFlag(true);
		}
		Log.i("MyService", "onBind------------");
		return null;
	}

	@Override//被创建时的调用
	public void onCreate() {
		// TODO Auto-generated method stub

		//服务创建时,实例化MyThread
		thread = new MyThread();
		Log.i("MyService", "onCreate------------");

		super.onCreate();
	}

	@Override
	@Deprecated//OnStart方法现在被OnStartCommd已经取代,其实在OnStartCommand也调用了OnStart
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		super.onStart(intent, startId);
		Log.i("MyService", "onStart------------");
	}

	@Override//启动时会调用
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		Log.i("MyService", "onStartCommand------------");
		//服务运行后,启动线程
		if(!stopFlag)
		{
			thread.start();
			thread.setFlag(true);
		}
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub

		//服务销毁时,停止线程任务
		thread.setFlag(false);
		Log.i("MyService", "onDestroy------------");

		super.onDestroy();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		Log.i("MyService", "onUnbind------------");
		return super.onUnbind(intent);
	}

	class MyThread extends Thread
	{
		//设置flag
		public void setFlag(Boolean flag)
		{
			stopFlag = flag;
		}

		@Override
		public void run() {

			super.run();
			while(stopFlag)
			{
				//设置时间的输出方式
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String  time = format.format(new Date());

				//显示时间
				Log.i("MyService", time);

				try {
					//延迟一秒
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

当然了记得在配置文件中注册service

接下来看结果分析:

当点击启动服务后:

可以看到服务已经绑定

当点击销毁服务后:

可以看到服务已经解绑,同时服务销毁了。

今天关于bindService启动服务就到这里

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

时间: 2024-08-29 15:43:49

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

Android 四大组件学习之Service七

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

Android 四大组件学习之Service五

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

Android 四大组件学习之Service六

上几节.我们学习怎样用StartServer启动一个服务,用bindServer去绑定一个服务.以及服务的生命周期,以及什么是IntentService. 也许有读者会发现,我们BindServer中的第二个參数也就是ServiceConnection这种方法在将用bindService时好像没用到. 那本节课就学习. 那我们先说个事.上大学的时候.我学习不好,还是那种常常旷课的同学. 长期下去,老师跟前就混的不好了. 有次班里评选党员,我就想竞争一下,可是因为我常常不上课的同学,自然几率就小,

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

上一节学习了通过Intent去启动另外一个Activity. 本节学习通过Intent传值. 还是依旧创建两个Activity,我依旧是用之前的MainActivity和SecondActivity 先看MainActivity的布局文件,SecondActivity的布局文件就不列出,和上节课一样: <TextView android:id="@+id/textView1" android:layout_width="wrap_content" androi

Android 四大组件学习之ContentProvider三

上节课学习如何自己创建一个ContentProvider,以及用ContentResolver去操作ContentProvider. 今天我们用系统提供的ContentProvider. 先来个简单的,读取系统的短信内容. 根据上节知道,既然要读取系统的短信,那就得先找到系统的短信在那里? 先找到短信数据库所在的问题,然后导出,查看里面的内容 既然已经分析好了,我们需要什么,不需要什么. 当然还需要知道短信提供者给第三方的URL.这个可以通过Android源码查看. 那我们就写一个程序,读取系统

Android 四大组件学习之Service四

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

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进行创