求人不如 求己 多方查证 没有找到找到这个问题的答案 于是打开文档 照着英文一句一句看 在百度词霸和我自己的一点英文水平的帮助下 终于明白了
实践证明能看懂文档是一件多么重要的事 哎呀 不行要好好学学英语
首先我自己写了一个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);
}
}