与用户交互的Service须要的是处理用户的操做,完成相应的功能。java
一:生命周期
ide
与用户交互时用到了绑定方式,触发了onBind方法一次,在其中能够进行用户的操做,取消绑定后触发的是unBind方法,若是此时用的是startService启动的Service,若取消绑定以后,再次绑定时,触发的是onRebind方法,终止Service时触发的是onDestory方法。
this
二:建立及方法
spa
使用Service时,必须继承自Service抽象类,实现其中的方法。经常使用的方法有:线程
(1)onCreate:启动Service时触发的方法,完成Service的建立及初始化工做
对象
(2)onBind:绑定Service,以完成某些操做
继承
(3)onUnbind:取消绑定
接口
(4)onRebind:从新绑定
生命周期
(5)onDestory:关闭Service时触发的方法
资源
三:启动、中止方式
启动方式:bindService(intent对象,当前Activity对象this,BIND_AUTO_CREATE自动建立Service常量)
终止方式:unbindService(当前Activity对象this)
四:与用户交互时的Service的实现
(1)建立类,继承自Service,由于onBind方法返回的是一个IBinder对象,因此咱们在类中建立一个内部类,让他在外部经过这个IBinder对象,得到Service的方法
(2)实现上述的几个方法,并添加计时输出的功能
public class MyService extends Service { private Timer timer; private TimerTask task; private int i = 0; // 提供Binder对象,对外提供得到Service的方法 private MyBinder biner = new MyBinder(); // 注意返回的方式 class MyBinder extends Binder { public MyService getMyService() { return MyService.this; } } @Override public IBinder onBind(Intent intent) { System.out.println("onBind-----"); startTimer();// 注意开启的位置****,放在这里的话,只有绑定的时候才会运行线程timer return biner;// 记住必定要返回binder } @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("onStartCommand------"); return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { System.out.println("onCreate----"); // startTimer();放在这里的话, 以start的话,就在运行 super.onCreate(); } @Override public boolean onUnbind(Intent intent) { System.out.println("onUnbind------"); // stopTimer();放在這裡的話ReBinder则不能继续执行了,应该放在Destory中 // return super.onUnbind(intent);这种状况下没法触发ReBinder return true;// 这时才能够触发ReBinder } @Override public void onRebind(Intent intent) { System.out.println("onRebind------"); super.onRebind(intent); } @Override public void onDestroy() { System.out.println("onDestory------"); stopTimer();// 中止计时器方法的调用 super.onDestroy(); } // 启动计时器 public void startTimer() { timer = new Timer(); task = new TimerTask() { @Override public void run() { i++; System.out.println(i); } }; timer.schedule(task, 1000, 1000); } // 中止计时器 public void stopTimer() { timer.cancel(); } public int getI() { return i; } public void setI(int i) { this.i = i; } } |
(3)主界面添加3个按钮,分别完成绑定,取消绑定,终止三个功能。主类需实现ServiceConnection接口及其中的方法
◆onServiceConnected:绑定Service时用到的方法,在其中建立IBinder对象,得到Service对象
◆onServiceDisconnected:是系统自动调用的方法
public class MainActivity extends Activity implements OnClickListener, ServiceConnection { private Button bindBtn, unbindBtn, getServiceBtn,startBtn,stopBtn;//声明界面上的5个按钮 private Intent intent;//INtent对象 private MyService myService;//Service对象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //查找资源 bindBtn = (Button) findViewById(R.id.bind); unbindBtn = (Button) findViewById(R.id.unbind); getServiceBtn = (Button) findViewById(R.id.getService); startBtn =(Button) findViewById(R.id.start); stopBtn = (Button) findViewById(R.id.stop); //添加监听 bindBtn.setOnClickListener(this); unbindBtn.setOnClickListener(this); getServiceBtn.setOnClickListener(this); startBtn.setOnClickListener(this); stopBtn.setOnClickListener(this); //Intent对象的实例化 intent = new Intent(this, MyService.class); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bind: bindService(intent, this, BIND_AUTO_CREATE);//绑定Service break; case R.id.unbind: unbindService(this);//取消绑定 break; case R.id.getService: Toast.makeText(MainActivity.this, "当前的I值为"+myService.getI(), Toast.LENGTH_SHORT).show();//得到后台信息 break; case R.id.start: startService(intent);//启动Service break; case R.id.stop: stopService(intent);//终止Service break; } } //在这里写一个取消绑定的方法,是为了保证主界面退出的同时也要终止Serivce @Override protected void onDestroy() { unbindService(this); super.onDestroy(); } //重写接口ServiceConnection中的方法,实现一链接,就得到Service的对象 @Override public void onServiceConnected(ComponentName name, IBinder service) { MyService.MyBinder binder = (MyBinder) service; myService = binder.getMyService(); } //重写接口ServiceConnection中的方法,系统自动调用的方法 @Override public void onServiceDisconnected(ComponentName name) { } } |
(4)结果
这里只列出几种状况,要知道根据在Service张方法调用位置的不一样,将会产生不一样的效果。这里只针对例子中的状况进行分析
◆直接单击Bind按钮,会触发onCreate和onBind方法,因为把启动计时器的方法放在了onBind方法中,因此直接计时器输出
◆这时在点击getService按钮时,能够得到当前的I值
◆此时点击onUnbind方法,会触发onUnbind和onDestory方法,因为把中止计时器的操做放在了onunbind方法中,因此此时中止了计时器的输出
◆若直接点击Start按钮,则能够看到,他只触发了onCreate和onStartCommand方法,并无触发计时器的操做
◆在单击onBind方法,能够看到这是只触发了onBind方法,并开始了计时器的输出
◆在点击getService按钮时,能够得到当前的I值
◆这时只能先单击onUnbind按钮,在单机Stop按钮,才会终止Service(由于此时咱们在Service中并无终止语句)这时触发的方法有onUnbind和onDestory两个方法