android重启后台服务,Android后台服务---交互时的Service

与用户交互的Service需要的是处理用户的操作,完成相应的功能。

一:生命周期

与用户交互时用到了绑定方式,触发了onBind方法一次,在其中可以进行用户的操作,取消绑定后触发的是unBind方法,如果此时用的是startService启动的Service,若取消绑定之后,再次绑定时,触发的是onRebind方法,终止Service时触发的是onDestory方法。

二:创建及方法

使用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两个方法

还有很多种情况,我们还得自行研究啊。。。33a4524ef1ca0ccea2fd28de42aa8d6b.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值