美文网首页
Android Service学习总结

Android Service学习总结

作者: 张离山 | 来源:发表于2019-03-07 21:02 被阅读0次

service是Android的四大组件之一,是一个可以在后台长时间运行而不使用用户界面的应用组件。服务能够被其他组件启动、绑定、交互、通信。service本身不会创建子线程,而是运行在UI线程中,所以大多时候我们都需要在service中开辟一个子线程去执行任务。
service的典型应用场景是:音乐播放器的后台播放,进程的保活,和服务器保持心跳连接等。

Service的两种启动方式

  1. startService(): 通常用以执行单一的操作并且不会向调用者返回结果。
  2. bindService(): 绑定service。实现与调用者的交互和通信。绑定服务的生存期和被绑定的应用程序组件一致。多个组件同时与一个服务绑定时,当所有的组件都解除绑定后,服务才会被销毁。

Service的生命周期

service生命周期
  • onCreat():首次创建服务时被调用,再次调用服务时不会被被调用。
  • onstartCommand():当调用startService()请求启动服务时,系统调用此方法。一旦执行此方法,服务即会在后台无限期运行。可以通过stopSelf()来停止服务。
  • onBind():在使用bindService与服务绑定的时候调用(如果之前Service没有被创建,会先执行OnCreate()方法)。
  • onUnbind():当所有的组件都解除绑定时候会调用这个方法。
  • onDestroy():当服务不再使用被销毁时调用。

Activity和Service的通信实例

activity代码如下:

package com.example.zhangchao.test;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

  public static final String TAG = "MainActivity";
  private Button mBtStart;
  private Button mBtStop;
  private Button mBtBind;
  private Button mBtUnbind;
  private MyService.MyBind myBind;
  //与Service绑定的连接
  private final ServiceConnection serviceConnection = new ServiceConnection() {

    //当service被绑定时调用
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
      myBind = (MyService.MyBind)service;
      myBind.download();
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
      myBind = null;
    }
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
  }

  private void initView(){
    //启动service
    mBtStart = findViewById(R.id.start);
    mBtStart.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent startIntent = new Intent(MainActivity.this, MyService.class);
        startService(startIntent);
      }
    });
    //停止service
    mBtStop = findViewById(R.id.stop);
    mBtStop.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent stopIntent = new Intent(MainActivity.this, MyService.class);
        stopService(stopIntent);
      }
    });
    //绑定service
    mBtBind = findViewById(R.id.bind);
    mBtBind.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        Intent startIntent = new Intent(MainActivity.this, MyService.class);
        bindService(startIntent,serviceConnection,BIND_AUTO_CREATE);
      }
    });
    //解除与service的绑定
    mBtUnbind = findViewById(R.id.unbind);
    mBtUnbind.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        unbindService(serviceConnection);
      }
    });
    //调用service的方法
    findViewById(R.id.download).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        myBind.download();
      }
    });
  }

}

service代码如下:

package com.example.zhangchao.test;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

/**
 * 创建时间:2019/3/7
 * 作者:zhangchao
 * 描述:
 */
public class MyService extends Service{

  public static final String TAG = "MyService";

  @Override
  public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate() executed");
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "onStartCommand() executed");
    //Log.d(TAG,intent.getStringExtra("num"));
    return super.onStartCommand(intent, flags, startId);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy() executed");
  }

  private void function(){

  }

  @Override
  public IBinder onBind(Intent intent) {
    return new MyBind();//返回一个实例
  }

  //用来提供和其他组件绑定的内部类,继承自Binder
  class MyBind extends Binder{

    public void download(){

      Log.d(TAG,"start download");
      function();

    }

  }

}

IntentService的使用

特点:

  1. InteniService自带一个工作线程,不需要自己创建
  2. 将要做的工作放到onHandleIntent()方法中。
  3. 当有多个任务传入IntentService中的时候,IntentService也只会维护一个线程,每个任务会采用先来先处理的方法进行执行,当认为所有任务被执行完,会执行onDestroy()回掉方法。
import android.app.IntentService;
import android.content.Intent;

/**
 * 创建时间:2019/3/7
 * 作者:zhangchao
 * 描述:
 */
public class MyIntentService extends IntentService {
  /**
   * Creates an IntentService.  Invoked by your subclass's constructor.
   *
   * @param name Used to name the worker thread, important only for debugging.
   */
  public MyIntentService(String name) {
    super(name);
  }

  @Override
  public void onCreate() {
    super.onCreate();
  }

  @Override
  public void onStart( Intent intent, int startId) {
    super.onStart(intent, startId);
  }

  @Override
  public int onStartCommand( Intent intent, int flags, int startId) {
    return super.onStartCommand(intent, flags, startId);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
  }

  @Override
  protected void onHandleIntent( Intent intent) {
    /**
     * 在这里处理操作
     * 不需要自己创建新的线程
     */
  }
}

相关文章

网友评论

      本文标题:Android Service学习总结

      本文链接:https://www.haomeiwen.com/subject/putkpqtx.html