startservice与bindservice混合使用问题

来源:互联网 发布:海关数据米课 编辑:程序博客网 时间:2024/05/19 03:42

求人不如 求己 多方查证 没有找到找到这个问题的答案 于是打开文档 照着英文一句一句看 在百度词霸和我自己的一点英文水平的帮助下 终于明白了

实践证明能看懂文档是一件多么重要的事 哎呀 不行要好好学学英语

首先我自己写了一个service测试程序图片:

 

图好像不清楚 凑活看吧 按钮依次是

start服务

stop服务

bind服务

unbind服务

调用服务的方法

首先我点

start服务

打印信息:

oncreate()

onstart()

然后我点击bind没有打印信息

然后我点击stop服务没有打印信息                  

然后我点击unbind

打印出:

unbind 

destory()

好的然后退出activity那么我们看看服务已经被停止了

好的那么 我是看的视频教学里说的 里面的老是说 用stop无法销毁服务 要用unbind 销毁服务 如果你是先startService再 bindService的话就要这样做

好的 那么上面的结果 已经显示了 老是说的话是正确 但是 你再这样试一下:

你首先startservice 然后bindservice 然后 unbind 然后你会发现 没有打印出destory() 方法咦。。。。。。。 奇怪了这是怎么回事

废话不多说 总之讲师讲错了 我在仔细查阅了文档之后 发现其实是这样的:

首先 有一个概念要澄清 那就是一个服务被stop之后不一定会被destory() 但是如果destory()了一定被stop了

这个停止服务 和销毁服务是两个概念

那么来看一下android帮助文档中的原文:

稍微有点 英文基础的同学应该已经看懂了 这段英文的意思是:

注意如果一个被停止的服务仍然有ServiceConnection对象通过BIND_AUTO_CREATE绑定到它上面,它不会被销毁知道绑定对象被移除。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

有了这个我们理解了 为什么有这样现象发生了 它只是stop了服务并没有销毁服务 所以 你点stop没有反应 但是这个时候 服务其实已经被停止了 你再点unbind因为所有绑定到服务上的客户端都已经解绑定了 所以android 操作系统就销毁了 这个 service

网上有很多人 有误解 认为 只要绑定到服务上的客户端全部解绑定了 这个服务就被销毁了 其实也错了 看下面这段原文:

 

第一段话的意思是:

如果你同意你的服务被开启和绑定,然后当服务被开启的时候,当所有的客户端都解除对服务的绑定android操作系统也不会销毁这个服务,相反的你必须显示的调用stopSelf()

或者stopService()方法来停止服务

第二段话的意思是:

当最后一个客户端从服务上被解绑定的时候操作系统就销毁服务(除非这个服务是使用startService()的方式启动的)

从这两段话就可以看出 问题的所在了

然后 很多人 可能看到了这句话:

这句话 很明显 也是说 如果是startService 方式开启才不会被销毁 因为onstartCommand()很明显是一个 startService的生命周期中才有的回调函数

所以说 很多人觉得 他没有说 startService方式 但是也是 都解绑定之后就销毁了 应该是解绑定之后就会销毁 其实不是这样的! 它暗含的意思就是告诉你这个方式是startService()

好了 说了 这么多 总之这个程序的执行流程就是这样的:

startservice->调用oncreate()方法->stopservice->停止service但没有销毁->unbind->调用unbind方法调用destory()方法

结束

好了 写完了给自己做个笔记 有不对的地方 还请大家指正 谢谢

附上代码:

package cn.itcast.testService;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;

public class DemoActivity extends Activity {
 Intent intent ;
 MyConn conn;
 IService iService;
 
 
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  intent = new Intent(this,MyService.class);
  conn = new MyConn();
 }

 public void start_service(View view) {
  startService(intent);
 }

 public void stop_service(View view) {
  stopService(intent);
 }

 public void bind_ervice(View view) {
  bindService(intent, conn, BIND_AUTO_CREATE);
 }

 public void unbind_ervice(View view) {
  unbindService(conn);
 }
 private class MyConn implements ServiceConnection{

  
  public void onServiceConnected(ComponentName name, IBinder service) {
   iService = (IService)service;
   
  }

  
  public void onServiceDisconnected(ComponentName name) {
   // TODO Auto-generated method stub
   
  }
  
 }
 public void call_service(View view){
  iService.callMethodInService();
 }

 @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();

 }
 
}

 

package cn.itcast.testService;

public interface IService {
 void callMethodInService();
}

 

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class MyService extends Service {

 @Override
 public IBinder onBind(Intent intent) {
  
  
  return new MyBinder();
 }
 
 
 public class MyBinder extends Binder implements IService{

  
  public void callMethodInService() {
  
   helloInservice();
  }
  
 }
 public void helloInservice(){
  System.out.println("hello in service");
 }

 @Override
 public void onCreate() {
  System.out.println("create");
  super.onCreate();
 }

 @Override
 public void onStart(Intent intent, int startId) {
  // TODO Auto-generated method stub
  super.onStart(intent, startId);
  System.out.println("onStart");
 }

 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  System.out.println("destroy");
 }

 @Override
 public boolean onUnbind(Intent intent) {
  // TODO Auto-generated method stub
  System.out.println("onUnbind");
  return super.onUnbind(intent);

 }

 
 
 
}