Service的使用(1)
博客专区 > chuiyuan 的博客 > 博客详情
Service的使用(1)
chuiyuan 发表于4年前
Service的使用(1)
  • 发表于 4年前
  • 阅读 41
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

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

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

一. 新建 一个服务 

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

(1)新建 一个类,extends service 

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

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

Service与Activity的通信。

[java] view plaincopy

  1. public class MyBinder extends Binder{  

  2.     MySerivce getService(){  

  3.         return MySerivce.this;  

  4.     }  

  5. }  

  6. private final IBinder binder =new MyBinder();  

  7.   

  8. @Override  

  9. public IBinder onBind(Intent intent ) {  

  10.     // TODO Auto-generated method stub  

  11.     Log.i(TAG, "------->onBind");  

  12.     Toast.makeText(getBaseContext(), "onBind", Toast.LENGTH_SHORT).show();  

  13.     return binder;  

  14. }  

getSerivce()方法的作用是在Activity中得到Service的对象,这样 就可以操作Serivce 了。


二。使用Service

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

Service与Activity平级。

[html] view plaincopy

  1. <service  

  2.             android:enabled="true"  

  3.             android:name=".MySerivce"    >  

  4.         </service>  

启动Service 有两种方法



1.ContextWrapper.startService (Intent service)

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

还在运行。例子:

[java] view plaincopy

  1. btn1.setOnClickListener(new OnClickListener(){  

  2.         public void onClick(View v) {  

  3.             // TODO Auto-generated method stub  

  4.             Intent i = new Intent (getBaseContext(),MySerivce.class);  

  5.             startService(i);  //start  

  6.             }  

  7.     });  

  8.       

  9.     btn2.setOnClickListener(new OnClickListener(){  

  10.         public void onClick(View v) {  

  11.             // TODO Auto-generated method stub  

  12.             Intent i = new Intent (getBaseContext(),MySerivce.class);  

  13.             stopService(i);  //stop  

  14.         }  

  15.     });  


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

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

绑定。如下 

[java] view plaincopy

  1. MySerivce mService;  //for what   

  2.       

  3.     ServiceConnection mConnection = new ServiceConnection(){  

  4.         public void onServiceConnected(ComponentName name, IBinder service) {  

  5.             // TODO Auto-generated method stub  

  6.             mService = ((MySerivce.MyBinder)service).getService();  

  7.         }  

  8.         public void onServiceDisconnected(ComponentName name) {  

  9.             // TODO Auto-generated method stub  

  10.             mService = null;  

  11.         }  

  12.     }  

[java] view plaincopy

  1.   

事实 上,在连接Service时,会调用 Bind方法,这个 方法会返回一个IBinder对象 ,这个对象 就是onServiceConnected中的第二个参数 ,我们将IBinder类的 service转化为MyService中的内部 类MyBinder内部类

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

绑定的实现如下:

[java] view plaincopy

  1. btn1.setOnClickListener(new OnClickListener(){  

  2.             public void onClick(View v) {  

  3.                 // TODO Auto-generated method stub  

  4.                 Intent i = new Intent (getBaseContext(),MySerivce.class);  

  5.                 //startService(i);  //start  

  6.                 bindService(i, mConnection ,Context.BIND_AUTO_CREATE);  

  7.                 }  

  8.         });  

  9.           

  10.         btn2.setOnClickListener(new OnClickListener(){  

  11.             public void onClick(View v) {  

  12.                 // TODO Auto-generated method stub  

  13.                 //Intent i = new Intent (getBaseContext(),MySerivce.class);  

  14.                 //stopService(i);  //stop  

  15.                 unbindService(mConnection);  

  16.             }  

  17.         });  




                                 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也

还在运行。例子:

[java] view plaincopy

  1. btn1.setOnClickListener(new OnClickListener(){  

  2.         public void onClick(View v) {  

  3.             // TODO Auto-generated method stub  

  4.             Intent i = new Intent (getBaseContext(),MySerivce.class);  

  5.             startService(i);  //start  

  6.             }  

  7.     });  

  8.       

  9.     btn2.setOnClickListener(new OnClickListener(){  

  10.         public void onClick(View v) {  

  11.             // TODO Auto-generated method stub  

  12.             Intent i = new Intent (getBaseContext(),MySerivce.class);  

  13.             stopService(i);  //stop  

  14.         }  

  15.     });  


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

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

绑定。如下 

[java] view plaincopy

  1. MySerivce mService;  //for what   

  2.       

  3.     ServiceConnection mConnection = new ServiceConnection(){  

  4.         public void onServiceConnected(ComponentName name, IBinder service) {  

  5.             // TODO Auto-generated method stub  

  6.             mService = ((MySerivce.MyBinder)service).getService();  

  7.         }  

  8.         public void onServiceDisconnected(ComponentName name) {  

  9.             // TODO Auto-generated method stub  

  10.             mService = null;  

  11.         }  

  12.     }  

[java] view plaincopy

  1.   

事实 上,在连接Service时,会调用 Bind方法,这个 方法会返回一个IBinder对象 ,这个对象 就是onServiceConnected中的第二个参数 ,我们将IBinder类的 service转化为MyService中的内部 类MyBinder内部类

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

绑定的实现如下:

[java] view plaincopy

  1. btn1.setOnClickListener(new OnClickListener(){  

  2.             public void onClick(View v) {  

  3.                 // TODO Auto-generated method stub  

  4.                 Intent i = new Intent (getBaseContext(),MySerivce.class);  

  5.                 //startService(i);  //start  

  6.                 bindService(i, mConnection ,Context.BIND_AUTO_CREATE);  

  7.                 }  

  8.         });  

  9.           

  10.         btn2.setOnClickListener(new OnClickListener(){  

  11.             public void onClick(View v) {  

  12.                 // TODO Auto-generated method stub  

  13.                 //Intent i = new Intent (getBaseContext(),MySerivce.class);  

  14.                 //stopService(i);  //stop  

  15.                 unbindService(mConnection);  

  16.             }  

  17.         });  




                                 Service的生命周期

1,startService的生命周期

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

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

onCreate()。

2. bindService的生命周期

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

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


共有 人打赏支持
粉丝 10
博文 91
码字总数 40993
×
chuiyuan
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: