您的位置:首页 > 其它

startservice与bindservice混合使用问题

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

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

首先我自己写了一个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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: