服务安卓的4大组件之一
服务的启动有两种方式:第一种startService启动和stopService关闭,这种启动方式访问者无法和服务进行通讯,交换数据,这种启动方式不会随着访问者的关闭而关闭。第二种是bindService绑定启动和unBindService接触绑定并关闭,这种访问者和服务之间可以通过IBinder接口进行通讯。
使用1 startService
定义一个Service,清单文件注册,启动关闭服务
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Intent intent = new Intent(MainActivity.this, MyService.class); findViewById(R.id.btn_start_service).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MainActivity.this.startService(intent); } }); findViewById(R.id.btn_stop_service).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MainActivity.this.stopService(intent); } }); findViewById(R.id.btn_close_activity).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MainActivity.this.finish(); } }); } }
public class MyService extends Service { @Override public void onCreate() { super.onCreate(); Log.v("PDA", "onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.v("PDA", "onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onDestroy() { Log.v("PDA", "onDestroy"); super.onDestroy(); } }这是多次启动服务的日志记录,可以得知,多次调用startservice只有第一次会调用oncreate和onstartcommand
启动成功后不进行关闭服务,直接finish Activity 在系统中查看应用程序的服务并没有被关闭,仍然处于运行状态
当我们点击关闭服务系统就会将启动的服务进行关闭,再看手机后台则可以看到服务已经关闭。
使用2 bindService绑定服务
绑定服务
bindService(intent, connection, Context.BIND_AUTO_CREATE);
Intent 是指定打开服务的意图,connction是ServiceConnection,在该对象中有访问者和服务之间的连接状态的回调,Context.BIND_AUTO_CREATE是flags是指定绑定时是否自动创建Service(若Service未创建),可指定0不自动创建,BIND_AUTO_CREATE自动创建。
ServiceConnection:当访问者和Service之间连接成功时将回调onServiceConnected方法,当Service所在的宿主进程由于异常中止或其他原因终止,导致Service与访问者之间断开连接时回调该ServiceConnection对象的onServiceDisconnected方法。
public class MyBinder extends Binder { public int add(int one, int two) { return one + two; } }
public class MyService extends Service { private MyBinder binder; @Override public void onCreate() { super.onCreate(); Log.v("PDA", "onCreate"); binder = new MyBinder(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.v("PDA", "onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Nullable @Override public IBinder onBind(Intent intent) { Log.v("PDA", "onBind"); return binder; } @Override public boolean onUnbind(Intent intent) { Log.v("PDA", "onUnbind"); return super.onUnbind(intent); } @Override public void onDestroy() { super.onDestroy(); Log.v("PDA", "onDestroy"); } }
public class MainActivity extends AppCompatActivity { private MyBinder binder; private Button btn_tongxun; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Intent intent = new Intent(MainActivity.this, MyService.class); findViewById(R.id.btn_start_service).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MainActivity.this.startService(intent); } }); findViewById(R.id.btn_stop_service).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MainActivity.this.stopService(intent); } }); findViewById(R.id.btn_close_activity).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { MainActivity.this.finish(); } }); final ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { binder = (MyBinder) iBinder; } @Override public void onServiceDisconnected(ComponentName componentName) { } }; findViewById(R.id.btn_bind_service).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { bindService(intent, connection, Context.BIND_AUTO_CREATE); } }); findViewById(R.id.btn_unbind_service).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { unbindService(connection); } }); btn_tongxun = (Button) findViewById(R.id.btn_tongxun); btn_tongxun.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { btn_tongxun.setText(binder.add(1, 2) + ""); } }); } }
绑定服务bindservice调用的是下面的方法,多次点击不会出重复调用
06-12 18:02:15.637 26543-26543/androidpos.zy.com.servicetest V/PDA: onCreate
06-12 18:02:15.639 26543-26543/androidpos.zy.com.servicetest V/PDA: onBind
不解除绑定就关闭Activity,会报错,但服务会关闭,日志是
解除绑定的日志:
06-12 18:14:28.716 12148-12148/androidpos.zy.com.servicetest V/PDA: onUnbind
06-12 18:14:28.717 12148-12148/androidpos.zy.com.servicetest V/PDA: onDestroy绑定的形式的话销毁activity时必须解除绑定