Android 四大组件_Service

818 阅读2分钟
原文链接: www.haotianyi.win

简介

Service本质作用就是一个没有界面的Activity,它可以在后台执行代码永远不用到前台来,所以一个模块只要不想要与用户交互就可以使用Service。

基本创建

依旧是两种方式一个是as的快捷使用,一个凡事靠自己:

  • 快捷使用,可以建立Service和IntentService两种

sp161025_201123

  • 自己来
  1. 首先在app/src/main/AndroidManifest.xml创建Service标签
  2. 创建类继承自Service
    sp161025_201251

表示可以使用,而且可以被外部的应用调用这个服务

两种启动模式

StartService

  • 在Service配置action标签
  • 在MainActiviy中启动Service

sp161025_201821

MainActivity代码


 @Override
public void onCreate() {
    super.onCreate();
    System.out.println("成功了");
}

MyServie代码


 @Override
public void onCreate() {
    super.onCreate();
    System.out.println("成功了");
}

BindService

  • 重写onBind方法并且创建一个类继承自Binder
  • 在Activity中初始化ServiceConnection和自己刚刚继承的Binder类
  • 调用bindService绑定服务

全部代码


  public class MainActivity extends AppCompatActivity {
 
     MyService.MyBinder mBinder;
     ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mBinder = (MyService.MyBinder) service;
            System.out.println("--------nimeil-------");//没有在OonCreate方法中初始化
        }
 
        @Override
        public void onServiceDisconnected(ComponentName name) {
 
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    public void start(View view) {
        Intent intent = new Intent();
        intent.setAction("haotianyi.win");
//        startService(intent);
        bindService(intent, mConnection, MyService.BIND_AUTO_CREATE);
//        System.out.println(mBinder.getCount());这时会报空指针异常
    }
 
 
    public void start1(View view) {
        System.out.println(mBinder.getCount());
    }
}

在连接的时候比较耗时,可能在初始化Service没有及时给mBinder赋值

生命周期

sp161025_204943

正常的生命周期有两种,有一种比较特殊就是onCreat--->onStartCommend----->onBind--->onUnBind

Start的生命周期

sp161025_205219

当多次启动Service的时候OnCreate方法只是执行一次,onStartCommand执行多次

Bind的生命周期

sp161025_205450

无论绑定多少次都是onCreate然后onBind,onServiceConnected是连接成功时候调用的方法

IntentService

Service中也无法执行大量的耗时操作,所以Android官方推出一个IntentService当使用它是时候系统会自动创建一个进程,不会阻塞主线程,开发者只要重写onHandleIntent方法即可:

测试代码

分别再onHandleIntent方法和onStartCommand方法中添加耗时逻辑,看是否弹出ANR:


  @Override
protected void onHandleIntent(Intent intent) {
    System.out.println("---------onHandleIntent----------");
    long endTime = System.currentTimeMillis() + 100 * 1000;
    while (System.currentTimeMillis() < endTime) {
        synchronized (MyIntentService.this) {
            try {
                wait(endTime - System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

onStartCommand


 @Override
public int onStartCommand(Intent intent, int flags, int startId) {
    System.out.println("---------onStartCommand----------");
    long endTime = System.currentTimeMillis() + 100 * 1000;
    while (System.currentTimeMillis() < endTime) {
        synchronized (MyService.this) {
            try {
                wait(endTime - System.currentTimeMillis());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    return super.onStartCommand(intent, flags, startId);
}

在onStartCommand中会弹出:

sp161026_183335