前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 四大组件学习之Service三

Android 四大组件学习之Service三

作者头像
DragonKingZhu
发布2022-05-08 16:04:55
1990
发布2022-05-08 16:04:55
举报

上节我们学习了,如何用StartService启动服务,这节学习如何用BindService启动一个服务

首先看MyActivity的代码部分:

代码语言:javascript
复制
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的代码如下:

代码语言:javascript
复制
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启动服务就到这里

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档