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

时间:2022-04-16 06:25:28

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

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

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

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

【定义一个服务】

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

public class MyService extends Service{
  @Nullable
  @Override
  public IBinder onBind(Intent intent) { // 这是一个抽象方法,那么子类是必须要重写的
    return null;
  }
}

  

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

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

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

 

public void onCreate() {                                                // 服务创建时调用
  super.onCreate();
}

public int onStartCommand(Intent intent, int flags, int startId) { // 服务启动时调用
  return super.onStartCommand(intent, flags, startId);
}

public void onDestroy() { // 服务销毁时调用
  super.onDestroy();
}

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

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.xin02ma.myapplication">
  <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    ......
    <activity android:name=".MainActivity">
      ......
    </activity>
    <service android:name=".MyService" />
  </application>
</manifest>

【启动和停止服务】

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

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

<Button
  android:id="@+id/start_service"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="@string/start_service" />

<Button
  android:id="@+id/stop_service"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="@string/stop_service" />

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

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

public class MainActivity extends Activity implements View.OnClickListener{
  private Button startService;
  private Button stopService;

  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); // 采用布局
    startService = (Button) super.findViewById(R.id.start_service); // 取得Button实例
    stopService = (Button) super.findViewById(R.id.stop_service); // 取得Button实例
    startService.setOnClickListener(this); // 监控Button,注册按钮事件
    stopService.setOnClickListener(this); // 监控Button,注册按钮时间
  }

  public void onClick(View v) {
    switch (v.getId()) {
      case R.id.start_service:
        Intent startIntent = new Intent(this, MyService.class);
        startService(startIntent); // 启动服务
        break;
      case R.id.stop_service:
        Intent stopIntent = new Intent(this, MyService.class);
        stopService(stopIntent); // 停止服务
        break;
      default:
        break;    }
  }
}

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

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

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

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

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

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

  【小测试】

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

.....

private static final String TAG = "MyService";

...

public void onCreate() { // 服务创建时调用  super.onCreate();
  Log.d(TAG, "onCreate executed");}

public int onStartCommand(Intent intent, int flags, int startId) { // 服务启动时调用
  Log.d(TAG, "onStartCommand executed");  return super.onStartCommand(intent, flags, startId);
}

public void onDestroy() { // 服务销毁时调用
  super.onDestroy();
  Log.d(TAG, "onDestroy executed");}

  这个代码也太简单了吧,添加了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()方法被执行。

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

【后记】

  由于时间有限,Service就暂时先分析到这边,下面就要开始讲讲Service与Activity之间的通信过程,关于绑定和解绑的流程,小编会整理一下思路,好好写,要对得起Android爱好者。

  请相信我,虽然帖子写的很基础,很简单,但是基础是最重要的,里面总有大家能够感兴趣的地方,谢谢支持!欢迎批评指正啦~~