Android四大组件——Service入门

Service是Android系统中的四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序。

但是Service是运行于UI线程中的,不能直接进行耗时操作,但可以新建个子线程执行耗时操作。

因为是四大组件之一,所以要在Manifests中注册。


Service的启动方式有两种,StartService和bindService .

1.startService:

被开启的service通过其他组件调用startService()被创建。
这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。
当service被停止时,系统会销毁它。
2.bindService

被绑定的service是当其他组件(一个客户)调用bindService()来创建的。
客户可以通过一个IBinder接口和service进行通信。
客户可以通过unbindService()方法来关闭这种连接。
一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。
我们通过一张图来看一下Service的生命周期:

Android四大组件——Service入门_第1张图片


我们再通过代码看一下:

xml文件:





    

Mainactivity:

package li.zhuoyuan.service;

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.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    Button btnstart, btnstop, btnbind, btnunbind;
    Intent serviceIntent;

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

    private void initevent() {
        btnstart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startService(serviceIntent);
            }
        });

        btnstop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stopService(serviceIntent);
            }
        });

        btnbind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                bindService(serviceIntent, conn, BIND_AUTO_CREATE);
            }
        });
        btnunbind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                unbindService(conn);
            }
        });
    }

    private void initview() {
        serviceIntent = new Intent(this, MyService.class);
        btnstart = (Button) findViewById(R.id.start);
        btnstop = (Button) findViewById(R.id.stop);
        btnbind = (Button) findViewById(R.id.bind);
        btnunbind = (Button) findViewById(R.id.unbind);
    }

    ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //拿到后台服务代理对象
            MyService.MyBinder myBinder = (MyService.MyBinder) iBinder;
            //调用后台服务的方法
            myBinder.showToast();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            Log.e("MainActivity", "onServiceDisconnected: onServiceDisconnected");
        }
    };
}

Service:

package li.zhuoyuan.service;

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

import static android.content.ContentValues.TAG;

public class MyService extends Service {

    private Thread a;
    private boolean threadrun;

    public MyService() {
    }

    //创建一个binder对象,给前台调用
    class MyBinder extends Binder {
        public void showToast() {
            Log.e("Service", "showToast");
        }
    }

    //绑定服务时调用
    @Override
    public IBinder onBind(Intent intent) {
        Log.e("Service", "onBind");
        startThread();
        return new MyBinder();
    }

    //服务创建时调用
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("Service", "onCreate");
    }

    //执行StartService时调用
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("Service", "onStartCommand");
        startThread();
        return super.onStartCommand(intent, flags, startId);
    }

    //服务被销毁时调用
    @Override
    public void onDestroy() {
        Log.e(TAG, "onDestroy: ");
        stopThread(a);
        super.onDestroy();
    }

    //停止线程
    public void stopThread(Thread t) {
        if (t == null) {
            return;
        }
        threadrun = false;
    }


    //解除绑定时调用
    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("Service", "onUnbind");
        return super.onUnbind(intent);
    }

    private void startThread() {
        a = new Thread(new Runnable() {
            @Override
            public void run() {
                //执行耗时操作
                threadrun = true;
                while (threadrun) {
                    try {
                        Log.e("Service", "doSomething");
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        a.start();
    }
}

代码如上,应用页面如图:

点击启动服务,查看后台输出:


然后点击停止服务:



点击绑定服务:



点击解绑服务:


简单说:startService启动的话,service的生命周期就是:onCreate->onStartCommand->onDestroy

bindService启动的话,service的生命周期就是:onCreate->onBind->onUnBind->onDestroy


Github的demo

你可能感兴趣的:(Android四大组件——Service入门)