Android - método bindService () para iniciar el servicio

Si comienza vinculando el servicio, debe prestar atención a la creación de una clase para implementar la interfaz ServiceConnection y reescribir los métodos onServiceConnected() y onServiceDisconnected(). Esta clase se utiliza para conexiones de servicio. Cuando el servicio se vincula con éxito, se llamará al método onServiceConnected() y se obtendrá el objeto IBinder en este método. Llame a onServiceDisconnected() cuando el servicio no esté vinculado. Este método no necesita escribir ninguna operación.

Cree una clase interna en la clase de servicio, herede la clase Binder y llame al método en el servicio como el proxy del servicio.

El método onBind() del servicio devuelve el objeto proxy.

actividad_principal.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas .android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@drawable/ bg"> 

    <androidx.appcompat.widget.AppCompatButton 
        android:id="@+id/btn_bind" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_marginLeft="250dp" 
        android:layout_marginTop="250dp" 
        android:background="#F5F5DC" 
        android:text="Servicio de enlace" />

    <androidx.appcompat.widget.AppCompatButton 
        android:id="@+id/btn_invoke" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_below="@+id/btn_bind" 
        android:layout_alignLeft="@ +id/btn_bind" 
        android:layout_marginTop="100dp" 
        android:background="#F5F5DC" 
        android:padding="10dp" 
        android:text="调用服务中的方法" /> 

    <androidx.appcompat.widget.AppCompatButton 
        android: id="@+id/btn_unbind" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_below="@+id/btn_invoke"wrap_content" 
        android:layout_alignLeft="@+id/btn_bind"
        android:layout_marginTop="100dp" 
        android:background="#F5F5DC" 
        android:padding="10dp" 
        android:text="Desvincular servicio" /> 

</RelativeLayout>

MainActivity.java 

package com.example.bindservice;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatButton;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    AppCompatButton bind,invoke,unbind;
    MyService.MyBinder myBinder;
    MyConnection myConnection;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        bind.setOnClickListener(this);
        invoke.setOnClickListener(this);
        unbind.setOnClickListener(this);
    }
    private void init(){
        bind=findViewById(R.id.btn_bind);
        invoke=findViewById(R.id.btn_invoke);
        unbind=findViewById(R.id.btn_unbind);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btn_bind:
                if(myConnection==null){
                    myConnection=new MyConnection();
                }
                Intent intent=new Intent(MainActivity.this,MyService.class);
                bindService(intent,myConnection,BIND_AUTO_CREATE);
                break;
            case R.id.btn_invoke:
                myBinder.callMethodInService();
                break;
            case R.id.btn_unbind:
                if (myConnection!=null) {
                    unbindService(myConnection);
                    myConnection=null;
                }

        }
    }
    class MyConnection implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            myBinder=(MyService.MyBinder)iBinder;
            Log.i("MyActivity","服务成功绑定,内存地址为:"+myBinder.toString());
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    }
}

MiServicio.java

package com.example.bindservice;

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

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.i("service","绑定服务,执行onBind方法。");
        return new MyBinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("service","创建服务,执行onCreate方法。");
    }


    @Override
    public boolean onUnbind(Intent intent) {
        Log.i("service","解绑服务,执行onUnbind方法。");
        return super.onUnbind(intent);
    }

    class MyBinder extends Binder{
        public void callMethodInService(){
            methodInService();
        }
    }


    public void methodInService(){
        Log.i("service","调用服务内的方法。");
    }
}

resultado de la operación:

1. Haga clic en el botón de servicio de vinculación y salida en la consola:

 Se puede ver que el método onServiceConnected() se llama después de que se completa el enlace, de modo que la variable global

MiServicio.MiBinder miBinder;

Este objeto proxy está vinculado al objeto IBinder devuelto por el método onBind(). Entonces la función en el servicio se puede llamar con éxito.

2. Haga clic en el botón de llamada de método en el servicio para ejecutar el método en el servicio.

3. Haga clic en el botón de desvincular servicio, llame al método unbindService() (el parámetro interno del método es el objeto de la clase de conexión) y desvincule el servicio. Al mismo tiempo, llame al método onUnbind() en el ciclo de vida del servicio, que se puede generar en la consola.

Supongo que te gusta

Origin blog.csdn.net/qq_64628470/article/details/130511361
Recomendado
Clasificación