Service的使用

14 篇文章 0 订阅

服务可以看成是没有界面的 Activity,运行在后台,不可交互,不可以自己启动,要其它 的Context执行

startService() 开始服务or 执行bindService()进行绑定服务 。

一. 新建 一个服务 

服务类似一个没有界面的Activity。steps:

(1)新建 一个类,extends service 

(2)重写 Service的几个重要的方法。共6个,分别是

onCreate()  ,onDestroy()   onRebind()  onStart()  onUnbind().其中 的onBind返回的是Ibinder类型的,作用是负责 

Service与Activity的通信。

	public class MyBinder extends Binder{
		MySerivce getService(){
			return MySerivce.this;
		}
	}
	private final IBinder binder =new MyBinder();
	
	@Override
	public IBinder onBind(Intent intent ) {
		// TODO Auto-generated method stub
		Log.i(TAG, "------->onBind");
		Toast.makeText(getBaseContext(), "onBind", Toast.LENGTH_SHORT).show();
		return binder;
	}
getSerivce()方法的作用是在Activity中得到Service的对象,这样 就可以操作Serivce 了。


二。使用Service

要使用Serivce还要在Manifest中注册,否则 系统 找不到service。如下,

Service与Activity平级。

<service
            android:enabled="true"
            android:name=".MySerivce"    >
        </service>
启动Service 有两种方法



1.ContextWrapper.startService (Intent service)

启动后Service会运行在后台 ,不受Activity生命周期的影响 ,也就是说,即使所有 的Activity都退出 了,Service也

还在运行。例子:

	btn1.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent i = new Intent (getBaseContext(),MySerivce.class);
				startService(i);  //start
				}
		});
		
		btn2.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent i = new Intent (getBaseContext(),MySerivce.class);
				stopService(i);  //stop
			}
		});

2. ContextWrapper.bindService (Intent intent ,ServiceConnection conn, int flags)

就是将Service 与 Activity结合 起来,我们还要一个ServiceConnection对象 ,作用是实现 Activity与Service的

绑定。如下 

MySerivce mService;  //for what 
	
	ServiceConnection mConnection = new ServiceConnection(){
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			mService = ((MySerivce.MyBinder)service).getService();
		}
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			mService = null;
		}
	}
事实 上,在连接Service时,会调用 Bind方法,这个 方法会返回一个IBinder对象 ,这个对象 就是onServiceConnected中的第二个参数 ,我们将IBinder类的 service转化为MyService中的内部 类MyBinder内部类

对象 ,再用这个 对象 的getService()得到Service的操作对象 。

绑定的实现如下:

btn1.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent i = new Intent (getBaseContext(),MySerivce.class);
				//startService(i);  //start
				bindService(i, mConnection ,Context.BIND_AUTO_CREATE);
				}
		});
		
		btn2.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//Intent i = new Intent (getBaseContext(),MySerivce.class);
				//stopService(i);  //stop
				unbindService(mConnection);
			}
		});



                                 Service的生命周期

1,startService的生命周期

onCreate() ->onStart()->onDestroy() .

如果 重复startService(),则不会进入onCreate(),而是直接 进入 onStart()方法。Service有个原则,只执行一次

onCreate()。

2. bindService的生命周期

onCreate() -> onBind() -> onUnbind() -> onDestroy() 

服务 被 绑定后不能直接Destroy() ,要先onUnbind()。






1.ContextWrapper.startService (Intent service)

启动后Service会运行在后台 ,不受Activity生命周期的影响 ,也就是说,即使所有 的Activity都退出 了,Service也

还在运行。例子:

	btn1.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent i = new Intent (getBaseContext(),MySerivce.class);
				startService(i);  //start
				}
		});
		
		btn2.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent i = new Intent (getBaseContext(),MySerivce.class);
				stopService(i);  //stop
			}
		});

2. ContextWrapper.bindService (Intent intent ,ServiceConnection conn, int flags)

就是将Service 与 Activity结合 起来,我们还要一个ServiceConnection对象 ,作用是实现 Activity与Service的

绑定。如下 

MySerivce mService;  //for what 
	
	ServiceConnection mConnection = new ServiceConnection(){
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			mService = ((MySerivce.MyBinder)service).getService();
		}
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			mService = null;
		}
	}
事实 上,在连接Service时,会调用 Bind方法,这个 方法会返回一个IBinder对象 ,这个对象 就是onServiceConnected中的第二个参数 ,我们将IBinder类的 service转化为MyService中的内部 类MyBinder内部类

对象 ,再用这个 对象 的getService()得到Service的操作对象 。

绑定的实现如下:

btn1.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent i = new Intent (getBaseContext(),MySerivce.class);
				//startService(i);  //start
				bindService(i, mConnection ,Context.BIND_AUTO_CREATE);
				}
		});
		
		btn2.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				// TODO Auto-generated method stub
				//Intent i = new Intent (getBaseContext(),MySerivce.class);
				//stopService(i);  //stop
				unbindService(mConnection);
			}
		});



                                 Service的生命周期

1,startService的生命周期

onCreate() ->onStart()->onDestroy() .

如果 重复startService(),则不会进入onCreate(),而是直接 进入 onStart()方法。Service有个原则,只执行一次

onCreate()。

2. bindService的生命周期

onCreate() -> onBind() -> onUnbind() -> onDestroy() 

服务 被 绑定后不能直接Destroy() ,要先onUnbind()。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值