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;
}
}