Sevicio de aprendizaje

Sevicio de aprendizaje

El servicio puede entenderse como una actividad invisible, que se divide en dos tipos, uno es el servicio local y algunas notas:
1. El otro es el servicio remoto. Cuando se llama a startservice () y bindservice () al mismo tiempo, debe Llame a stopservcie () y unbindservice () al mismo tiempo; de lo contrario, el servicio no se detendrá.
2. Al llamar a unbindservice, debe pasar el parámetro ServiceConnection. Este parámetro es coherente con el ServiceConnection entrante en bindService, por lo que el ciclo de vida de ServiceConnection puede cubrir estos dos métodos (generalmente declarados como variables miembro)
3. Use AIDL para comunicarse a través de procesos Algunas consideraciones
después de (1) el establecimiento del archivo AIDL, necesita construir-> hacer proyecto para producir los archivos .class correspondientes
(2) el cliente y el servidor tienen el mismo archivo AIDL, y el archivo donde local AIDL para el el nombre del paquete y el nombre del paquete donde se encuentra AIDL en el servidor es el mismo
(3) Cuando inicie el servicio con Intent localmente, también debe llamar al método intent.setPackage ("nombre del paquete AIDL"), de lo contrario, informará un error La intención del servicio debe ser explícita: este método parece ser anterior a 5.0 no lo llame
nota incorrecta al escribir interfaces (4) AIDL pasa objetos complejos, no hace una explicación detallada de los
siguientes códigos asignados, superando el mapa con la verdad
primero al servicio local
primero MainActivity.class

public class MainActivity extends ActionBarActivity implements View.OnClickListener {
    
    
    private Button start;
    private Button bind;
    private Button cancelbind;
    private Button cancelstart;
    ServiceConnection sc;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sample_main);
        start=(Button)findViewById(R.id.start);
        start.setOnClickListener(this);
        bind=(Button)findViewById(R.id.bind);
        bind.setOnClickListener(this);
        cancelbind=(Button)findViewById(R.id.cancelbind);
        cancelbind.setOnClickListener(this);
        cancelstart=(Button)findViewById(R.id.cancelstart);
        cancelstart.setOnClickListener(this);
        sc=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                MyService ms=((MyService.Localbinder)service).getService();
                ms.HellowWorld(MainActivity.this);
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                System.out.println("service onservicedisconneccted");
            }
        };
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View v) {
        Intent i=new Intent(this.getApplicationContext(),MyService.class);
        switch(v.getId()){
            case R.id.start:

                startService(i);
                break;
            case R.id.bind:

                Intent j=new Intent(this,MyService.class);
                bindService(j,sc, Context.BIND_AUTO_CREATE);
                break;
            case R.id.cancelstart:
                stopService(i);
                break;
            case R.id.cancelbind:
                unbindService(sc);
                break;
        }
    }
}

Entonces servicio

public class MyService extends Service {
    
    
    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("service onbind");
        return new Localbinder();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("service oncreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("service onstartcommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("service onunbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        System.out.println("service ondestroy");
        super.onDestroy();
    }

    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
        System.out.println("service rebind");
    }
    public void HellowWorld(Context context)
    {
        Toast.makeText(context,"HellowWorld",Toast.LENGTH_SHORT).show();
    }
    public class Localbinder extends Binder {
    
    
             MyService getService(){
                 return MyService.this;
             }
    }
}

Por supuesto, no olvide declarar el servicio en el archivo de configuración.

Dos, la comunicación AIDL
primero es el
archivo 1AIDL del servidor

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void printInformation();
}

2 、 MiServicio

public class MyService extends Service {
    
    
    @Override
    public void onCreate() {
        super.onCreate();
    }

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

    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    private IMyAidlInterface.Stub stub=new IMyAidlInterface.Stub() {
        @Override
        public void printInformation() throws RemoteException {
            System.out.println("跨进程通信");
        }
    };
}

En segundo lugar, el final local

public class MainActivity extends ActionBarActivity implements View.OnClickListener {
    
    
   private Button start;
   private Button bind;
   private Button stopservice;
   private Button unbind;
   private ServiceConnection sc;
   private IMyAidlInterface aidlservice;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        start=(Button)findViewById(R.id.start);
        start.setOnClickListener(this);
        bind=(Button)findViewById(R.id.bind);
        bind.setOnClickListener(this);
        stopservice=(Button)findViewById(R.id.cancelstart);
        stopservice.setOnClickListener(this);
        unbind=(Button)findViewById(R.id.cancelbind);
        unbind.setOnClickListener(this);
        sc=new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                     aidlservice=IMyAidlInterface.Stub.asInterface(service);
                try {
                    aidlservice.printInformation();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onClick(View v) {
        switch(v.getId())
        {
            case R.id.start:
                break;
            case R.id.bind:
                Intent i=new Intent("demo.haoxuan.com.remoteservice.myservice");
                i.setPackage("demo.haoxuan.com.remoteservice");
                bindService(i,sc, Context.BIND_AUTO_CREATE);
                break;
            case R.id.cancelstart:
                break;
            case R.id.cancelbind:
                unbindService(sc);
                break;
        }
    }

Supongo que te gusta

Origin blog.csdn.net/skateboard1/article/details/44998835
Recomendado
Clasificación