android 基础一 <Service bind方式>
第一步:创建service服务器类
public class MyService extends Service
第二步:定义对外提供的接口,我这里定义了两个对外扫描的函数
public interface IScanner { public void startScan(); public void stopScan(); }
第三步:在服务里面定义内部类继承 Binder,实现对外提供的接口
class MyBinder extends Binder implements IScanner
第四步:在onBind 函数里面返回 Binder对象
public IBinder onBind(Intent intent) { Log.e(TAG,"onBind!"); return new MyBinder(); }
第五步:在Activity 实现 ServiceConnection接口,获取服务接口来调用服务函数
private class ServiceConnect implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { iScanner=(IScanner)service; } @Override public void onServiceDisconnected(ComponentName name) { } }
第六步:在Activity 启动服务
Intent intent=new Intent(MainActivity.this,MyService.class);
bindService(intent,serviceConnect,BIND_AUTO_CREATE);
第七步:销毁服务
unbindService(serviceConnect);
第八步:配置文件清单
<service android:name=".MyService" />
MyService代码
public class MyService extends Service { String TAG="MyService"; @Override public IBinder onBind(Intent intent) { Log.e(TAG,"onBind!"); return new MyBinder(); } @Override public void onCreate() { super.onCreate(); Log.e(TAG,"onCreate!"); } @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); } class MyBinder extends Binder implements IScanner{ @Override public void startScan() { Log.e(TAG,"开始扫描!"); } @Override public void stopScan() { Log.e(TAG,"停止扫描!"); } } }
Activity 代码
public class MainActivity extends Activity { IScanner iScanner; ServiceConnect serviceConnect= new ServiceConnect(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent=new Intent(MainActivity.this,MyService.class); bindService(intent,serviceConnect,BIND_AUTO_CREATE); } @Override protected void onDestroy() { super.onDestroy(); unbindService(serviceConnect); } public void start(View v){
//调用服务里面实现的接口 iScanner.startScan(); } public void stop(View v){
//调用服务里面实现的接口 iScanner.stopScan(); } private class ServiceConnect implements ServiceConnection{ @Override public void onServiceConnected(ComponentName name, IBinder service) { iScanner=(IScanner)service; } @Override public void onServiceDisconnected(ComponentName name) { } } }
startService 和 bindService 的区别:
bindService的生命周期:
onCreate->
onBind->
onUnbind->
onDestroy
1.Activity被销毁之后service服务将自动销毁。
2.多次调用bindservice只会执行一次,onCreate 和 onBind
3.不可以在广播中bindService方式启动服务
startService的生命周期:
onCreate->
onStartCommand->
onDestroy
1.service 一直在后台运行,不会跟随Activity一起销毁
2.多次调用sartService,只执行一次OnCreate 但是每次都会执行onStartCommand
3.可以在广播中startService方式启动服务