前面一个帖子,小编和大家大概了解了一下AsyncTask的多线程编程技术,今天我想聊一聊Android的四大组件(神器)之一的Service

  要想精通Service的相关知识点,还是需要学习很多东西的,当然小编今天写的这篇文章只能算是让新手快速了解何为Service、如何快速上手并且快速掌握Service的使用方法,算是入门级的教程。好了,老规矩了,废话不多说,我们直接上代码来看看Service如何使用。

  PS:在这边小编想插一句嘴,如果大家还在用EclipseADT开发项目,强烈介意尝试或转向AS(Android Studio),至于原因,你问度娘,反正小编自从用了AS,像吃了麦炫,手指停不下来。

  ----------------------------------------------------------------------------------------------------------------------------------------

  【定义一个服务】

  首先,我们定义一个MyService.java类,当然作为一个服务类,必须要继承Service(android.app.Service),看代码:

Java代码
  1. public class MyService extends Service{  
  2.   @Nullable  
  3.   @Override  
  4.   public IBinder onBind(Intent intent) {        // 这是一个抽象方法,那么子类是必须要重写的  
  5.     return null;  
  6.   }  
  7. }  

  Service  --> public abstract IBinder onBind(Intent intent)  这是一个抽象方法,必须被子类重写!

  ok,服务定义好了,不能就这么空吧,光溜溜的总得放点干货,不然这个服务就是个摆设,那么下面我们就让这个服务发挥它的作用!

  我们在服务里面重写Service中的另一些常用的方法,看代码:

Java代码
  1. public void onCreate() {                                                // 服务创建时调用  
  2.   super.onCreate();  
  3. }  
  4.   
  5. public int onStartCommand(Intent intent, int flags, int startId) {      // 服务启动时调用  
  6.   return super.onStartCommand(intent, flags, startId);  
  7. }  
  8.   
  9. public void onDestroy() {                                               // 服务销毁时调用  
  10.   super.onDestroy();  
  11. }  

  这边不得不重点提一下onStartCommand()这个方法,因为我们服务所需要处理的逻辑代码都写在这个方法中。

  和添加Activity一样,我们添加了一个服务,那么在AndroidManifest.xml文件中必须进行注册才能生效,而且我需要告诉你,这是Android四大组件所共有的特点!!!

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.   package="com.example.xin02ma.myapplication">  
  4.   <application  
  5.     android:allowBackup="true"  
  6.     android:icon="@mipmap/ic_launcher"  
  7.     ......  
  8.     <activity android:name=".MainActivity">  
  9.       ......  
  10.     </activity>  
  11.     <service android:name=".MyService" />  
  12.   </application>  
  13. </manifest>  

  【启动和停止服务】

  服务定义好了,下面我们就直接上代码,来看看这个服务如何启动和停止。

  (1)先添加两个Button(activity_main.xml)

XML/HTML代码
  1. <Button  
  2.   android:id="@+id/start_service"  
  3.   android:layout_width="match_parent"  
  4.   android:layout_height="wrap_content"  
  5.   android:text="@string/start_service" />  
  6.   
  7. <Button  
  8.   android:id="@+id/stop_service"  
  9.   android:layout_width="match_parent"  
  10.   android:layout_height="wrap_content"  
  11.   android:text="@string/stop_service" />  

Android实用技术(3)—— Service简析(I)

  (2)接下来,修改主函数MainActivity的代码:

Java代码
  1. public class MainActivity extends Activity implements View.OnClickListener{  
  2.   private Button startService;                                                
  3.   private Button stopService;  
  4.   
  5.   protected void onCreate(Bundle savedInstanceState) {  
  6.     super.onCreate(savedInstanceState);  
  7.     setContentView(R.layout.activity_main);                               // 采用布局  
  8.     startService = (Button) super.findViewById(R.id.start_service);       // 取得Button实例  
  9.     stopService = (Button) super.findViewById(R.id.stop_service);         // 取得Button实例  
  10.     startService.setOnClickListener(this);                                // 监控Button,注册按钮事件  
  11.     stopService.setOnClickListener(this);                                 // 监控Button,注册按钮时间  
  12.   }  
  13.   
  14.   public void onClick(View v) {  
  15.     switch (v.getId()) {  
  16.       case R.id.start_service:  
  17.         Intent startIntent = new Intent(this, MyService.class);  
  18.         startService(startIntent);                                          // 启动服务  
  19.         break;  
  20.       case R.id.stop_service:  
  21.         Intent stopIntent = new Intent(this, MyService.class);  
  22.         stopService(stopIntent);                                            // 停止服务  
  23.         break;  
  24.       default:  
  25.         break;  
  26.     }  
  27.   }  
  28. }  

  上面的代码真的是太简单了,主要作了以下工作:

  (1)取得startService和stopService两个按钮实例,并且注册了点击事件;

  (2)通过Intent对象,调用Activity的startService()和stopService()方法来启动和停止服务。

  Notice:你们有没有发现一个问题?这里的活动的启动和停止完全是由活动本身控制的,如果我们start了服务,但是没有点击stop,那么服务会一直处于运行状态,此时服务如何让自己停止下来?

  庆幸的是,我们可以在不点击stopService按钮的前提下,调用stopSelf()这个方法就能让服务停下来!这么说不明白?没关系,下面我们会通过代码告诉你怎么用它。

  ----------------------------------------------------------------------------------------------------------------------------------------

  【小测试】

  既然上面的代码已经能够完成服务的启动和停止的逻辑流程了,那么口说无凭,也很难让人信服,那小编就打个Log给你看看,我们一起看看Service是如何运作的,来,上代码!

Java代码
  1. .....  
  2.   
  3. private static final String TAG = "MyService";  
  4.   
  5. ...  
  6.   
  7. public void onCreate() {                                                // 服务创建时调用  
  8.   super.onCreate();  
  9.   Log.d(TAG, "onCreate executed");  
  10. }  
  11.   
  12. public int onStartCommand(Intent intent, int flags, int startId) {      // 服务启动时调用  
  13.   Log.d(TAG, "onStartCommand executed");  
  14.   return super.onStartCommand(intent, flags, startId);  
  15. }  
  16.   
  17. public void onDestroy() {                                               // 服务销毁时调用  
  18.   super.onDestroy();  
  19.   Log.d(TAG, "onDestroy executed");  
  20. }  

  这个代码也太简单了吧,添加了3行Log,目的就是看:在我们点击两个按钮的时候,整个Service什么时候创建,什么时候启动,什么时候毁灭!

  请相信我,虽然代码很简单,逻辑也很low,但是这样的学习和思考的过程在以后你编写代码的时候,了解Service的生命周期是很很很重要的!

  我们来看一下执行结果,运行程序,查看Logcat中的打印日志:

Android实用技术(3)—— Service简析(I)

  (1)第一次点击StartService按钮后,MyService中的onCreate()和onStartCommand()方法都执行了,图中黄色箭头所示!

  此时,我们可以在手机 --> 设置 --> 应用 --> 运行中看到这个服务,小编给您截个图体验一下:

Android实用技术(3)—— Service简析(I)

Android实用技术(3)—— Service简析(I)

  (2)然后我们点击stopService按钮后,MyService中的onDestory()方法被执行,图中蓝色箭头所示!

  (3)此时可能你会有一个疑问?当我们点击了startService按钮以后,onCreate()和onStartCommand()方法同时被执行,这两个方法有什么区别?

  OK!图中的红色箭头给了我们答案:onCreat()方法是在服务第一次创建的时候调用的,而onStartCommand()方法则在每次启动服务的时候都会被调用。

  当我们在服务未启动的时候,点击startService按钮,则此时会执行两个方法;

  但是服务启动完成之后,再次点击(随便你点几次)startService按钮,你会发现只有onStartCommand()方法被执行。

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/course/694.html
2017年7月17日
发布:鸡啄米 分类:Android开发教程 浏览: 评论:0