Android中后台service的使用

Service简介

Service 是Android中四大组件之一,能够长时间的在后台(不和用户交互)运行,能够给当前App或者其他App的组件提供服务。创建一个Service和创建一个Activity很相似,但是我们需要继承Service这个类。

Service生命周期

Service的启动有两种方式startService()和bindService().

startService(): 启动服务,当一个Android组件(如一个Activity)调用startService()的时候,启动一个服务。服务一旦启动,就可以一直在后台运行下去,即使这个启动它的组件被摧毁。这样的服务模式,通常用于执行一个操作而不需要返回结果给调用者。

bindService(): 绑定服务,当一个Android组件(如一个Activity)调用bindService()。一个绑定服务提供了一个客户端到服务端的接口,允许组件与服务之间进行交互,这样可以实现跨进程的通信。绑定服务的生命周期默认是跟随它的绑定组件的,但是一个绑定服务可以绑定多个Android组件,如果这些Android组件都被销毁,那么这个绑定服务也将被销毁。
这里写图片描述
这是Service的生命周期示意图

下面是运用StartService实例
Service代码

public class MyService extends Service {
    public  String TAG = "MyService";

    @Override
    public void onCreate() {
        super.onCreate();
        //定义log方法在后台打印
        Log.e(TAG, "onCreate() ++++++++++++++++++++++++++++++++++++++++++"+Thread.currentThread().getName());
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand() ++++++++++++++++++++++++++++++++++++++++");

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
       throw new UnsupportedOperationException("Not yet implemented");
    }
    }

Activity代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
  //定义两个按钮来向Service发信息
    private Button startBtn;
    private Button stopBtn;
    public  String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //绑定id与监听事件
        startBtn =  findViewById(R.id.start_service);
        stopBtn =  findViewById(R.id.stop_service);
        startBtn.setOnClickListener(this);
        stopBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.start_service:
                //和Activity一样都用Intent传值
                Intent startIntent = new Intent(this, MyService.class);
                //启动service用startService方法
                startService(startIntent);
                break;
            case R.id.stop_service:
                Intent stopIntent = new Intent(this, MyService.class);
                //停止service用stopService方法
                stopService(stopIntent);
                break;
            default:
                break;
        }
    }
}

bindService绑定Service的步骤

  1. 新建类继承Service
  2. 实现onBind抽象方法(需要在此方法中返回一个Binder子类对象
  3. 重写onCreate方法
  4. 重写onUnbind方法
  5. 重写onDestory方法
  6. 在AndroidManifest中注册Service
  7. 在有Context环境中实现ServiceConnection接口
  8. 在有Context环境中通过bindService绑定Service
  9. 在有Context环境中通过unbindService解绑Service

在onBind方法中返回Binder子类对象,通过此对象获得Service对象
示例代码
Service代码

public class MyService2 extends Service {
    private String TAG="MyService2";
    private int count;
    private MyBinder binder = new MyBinder();
    private boolean stopFlag;

    public class MyBinder extends Binder {
        public int getCount(){
            return count;//返回子类对象
        }
    }
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("执行onBind方法...");
        return binder;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("执行onUnBind方法...");
        return true;
    }


    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("执行onCreate方法");
        Log.e(TAG, "onCreate: +++++++++++++++++++++++++++++++++++++++++++++++" );
//      new Thread(new MyThread()).start();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("执行onStartCommand方法");
        //三种返回值(仅限使用startService方法启动时有效果)
        //START_STICKY,服务被异常杀掉后,会重启服务
        //START_NOT_STICKY,服务被异常杀掉后,不会重启服务
        //START_REDELIVER_INTENT,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
        System.out.println("rebind");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopFlag = true;
        System.out.println("执行onDestroy方法");
        Log.e(TAG, "onDestroy: +++++++++++++++++++++++++++++++++++++++++++++++" );
    }

    class MyThread extends Thread{
        @Override
        public void run() {
            while(!stopFlag){
                try {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName()+"---"+Thread.currentThread().getId());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count++;
                System.out.println(count);
            }
        }
    }
}

Activity代码

public class ServiceActivity extends AppCompatActivity implements View.OnClickListener {
    //在xml中定义三个按钮
    private Button btn1;
    private Button btn2;
    private Button btn3;
    //定义Service子类对象,返回获得Service对象
    private ServiceConnection conn = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            System.out.println("onDisConnected");
        }
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            System.out.println("connected");

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_service);
        //绑定id
        btn1 = findViewById(R.id.service_btn1);
        btn2 = findViewById(R.id.service_btn2);
        btn3 = findViewById(R.id.service_btn3);
        //设置监听事件
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        btn3.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.service_btn1:
                //传值启动绑定Service
                Intent intent=new Intent(this,MyIntentService.class);
                startService(intent);
                break;
            case R.id.service_btn2:
            //传值解绑Service
                unbindService(conn);
                break;
            case R.id.service_btn3:
                Intent intent1=new Intent(ServiceActivity.this,Service2Activity.class);
                startActivity(intent1);
                break;

        }
    }
}
startService与bindService

startService
优点:使用简单,和Activity一样,只要几行代码即可启动Service
缺点:使用startService无法获得Service对象,不能直接操作Service中的属性和方法,只能通过Intent传递不同参数,重复调用startService,触发onStartCommand

bindService
优点:可以得到Service对象,灵活控制Service内部的属性和方法
缺点:使用较为复杂

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值