为什么用 unbindService() 方法解绑定服务后 仍然可以调用服务中的方法

作者:超级管理员 更新时间:2016-11-10 07:44:29 来源:未知 点击:15642
本帖最后由kokoromiro于2016-07-0321:40:09编辑    为什么我用 unbindService 方法解除了绑定后,仍然可以在 活动中调用 服务中的方法,解除绑定后,服务确实已经
本帖最后由 kokoromiro 于 2016-07-03 21:40:09 编辑
    为什么我用 unbindService 方法解除了绑定后,仍然可以在 活动中调用 服务中的方法,解除绑定后,服务确实已经调用了 onDestory方法销毁了服务,为什么还能调用服务中的方法呢?


活动的代码:

package com.example.myservicetest;

import com.example.myservicetest.MyService.*;

import android.app.*;
import android.content.*;
import android.view.*;
import android.view.View.*;
import android.os.*;
import android.util.Log;
import android.widget.*;

public class MainActivity extends Activity implements OnClickListener {

  //--------------------------------------------------------------------
  private Button b1, b2, b3, b4, b5;
  private ServiceConnection connection;
  private MyService myService;
  private Intent in;
  
  //--------------------------------------------------------------------
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    //获取按钮
    b1 = (Button)findViewById(R.id.bind);
    b2 = (Button)findViewById(R.id.unbind);
    b3 = (Button)findViewById(R.id.play);
    b4 = (Button)findViewById(R.id.start);
    b5 = (Button)findViewById(R.id.stop);
    
    //注册点击事件
    b1.setOnClickListener(this);
    b2.setOnClickListener(this);
    b3.setOnClickListener(this);
    b4.setOnClickListener(this);
    b5.setOnClickListener(this);
    
    //用于连接服务
    connection = new ServiceConnection()
    {
      @Override
      public void onServiceDisconnected(ComponentName name)
      {
        Log.e("connection", "连接意外丢失");
      }
      
      @Override
      public void onServiceConnected(ComponentName name, IBinder service)
      {
        myService = ((MyBinder)service).getMyService();
        Log.e("connection", "连接完成");
      }
    };
    
    //启动服务意图
    in = new Intent(this, MyService.class);
    
  }

  //--------------------------------------------------------------------
  @Override
  public void onClick(View v)
  {
    switch(v.getId())
    {
    //启动服务
    case R.id.start:
      startService(in);
      break;
      
    //停止服务
    case R.id.stop:
      stopService(in);
      break;
      
    //绑定服务
    case R.id.bind:
      bindService(new Intent(this, MyService.class), connection, BIND_AUTO_CREATE);
      break;
      
    //解绑服务
    case R.id.unbind:
      unbindService(connection);
      break;
      
    //调用服务中的方法
    case R.id.play:
      myService.play();
      break;
    }
  }

}


服务的代码:

package com.example.myservicetest;

import android.app.*;
import android.content.*;
import android.os.*;
import android.util.Log;

public class MyService extends Service {

  private MyBinder mBinder;

  public class MyBinder extends Binder {
    public MyService getMyService()
    {
      return MyService.this;
    }
  }

  //--------------------------------------------------------------------
  @Override
  public void onCreate()
  {
    super.onCreate();
    mBinder = new MyBinder();
    Log.e("Service", "创建服务");
  }

  //--------------------------------------------------------------------
  @Override
  public IBinder onBind(Intent intent)
  {
    Log.e("Service", "执行onBind");
    return mBinder;
  }

  //--------------------------------------------------------------------
  @Override
  public int onStartCommand(Intent intent, int flags, int startId)
  {
    Log.e("Service", "执行onStartCommand");
    return START_NOT_STICKY;
  }
  
  //--------------------------------------------------------------------
  @Override
  public boolean onUnbind(Intent intent)
  {
    Log.e("Service", "执行onUnbind");
    return false;
  }
  
  //--------------------------------------------------------------------
  @Override
  public void onDestroy()
  {
    Log.e("Service", "服务销毁");
    super.onDestroy();
  }
  
  
  
  
  //--------------------------------------------------------------------
  public void play()
  {
    Log.e("binder", "播放音乐");
  }

}




执行结果:
启动服务-绑定服务-播放-播放-解绑服务-停止服务-播放-播放
-------------------------------
你这是通过bindservice调用服务里面的方法?
你继承 Binder然后getMyService()里面返回的是这个类,你就根本没有通过bindservice调用服务里面的方法,你就直接调用了play方法,
-------------------------------
如上所说。你直接创建了myService对象,调用它的play方法,你的对象在,能调用它的方法,这是最正常不过的。
-------------------------------
引用 2 楼 dalor 的回复:
如上所说。你直接创建了myService对象,调用它的play方法,你的对象在,能调用它的方法,这是最正常不过的。


也就是说,即便解除绑定,服务调用过了destroy方法,服务对象依然存在呗,那正常的用法是怎么用的?
-------------------------------
引用 1 楼 liudashao0 的回复:
你这是通过bindservice调用服务里面的方法?
你继承 Binder然后getMyService()里面返回的是这个类,你就根本没有通过bindservice调用服务里面的方法,你就直接调用了play方法,


不经过绑定就无法获得服务对象啊,也就没法调用服务的方法,怎么叫直接调用呢? 难道不是通过绑定来获得服务对象从而执行服务的方法吗? 那正常应该怎么用?
-------------------------------
在service的onstart中调用自己的play方法。播放调用startservice(),停止播放调用stopservice
-------------------------------
play方法在,不代表service在运行,只是说明这个类没有被回收
-------------------------------
引用 3 楼 kokoromiro 的回复:
Quote: 引用 2 楼 dalor 的回复:

如上所说。你直接创建了myService对象,调用它的play方法,你的对象在,能调用它的方法,这是最正常不过的。


也就是说,即便解除绑定,服务调用过了destroy方法,服务对象依然存在呗,那正常的用法是怎么用的?


你还是要看看service的详细说明和使用。
销毁service,并不是把service对象设置为null.
-------------------------------
引用 6 楼 heaimnmn 的回复:
play方法在,不代表service在运行,只是说明这个类没有被回收

.
那bindService这个方法的作用是什么呢, 到底应该怎么用? 我一直都觉得是这么用,但现在看来应该不是这么用了.
-------------------------------
楼主解决没,可否告知,鄙人也是这点疑惑~

推荐阅读

热门内容

为什么用 unbindService()

本帖最后由kokoromiro于2016...

Gradle sync failed:

这个问题怎么解决呀???--------...

求教这个横向 可预览 view怎么做?

滴滴出行这种效果,   类似CoverF...

android studio补全代码和自

如题,突然就没了。查了查,那个省电模式我...

android-[IM]-仿微信聊天界面

求大神告知微信聊天页面 这个图片是怎么实...

安卓使用HttpUrlConnectio

客户端代码:服务端使用的WAMPSEVE...

Fragment上键盘输入问题

大神求教个问题,关于在Fragment上...

求助 客户端与服务器出错,返回的信息不对

客户端服务端客户端最后拿到的结果大家帮忙...

'<>' operator is not

作为一个Android菜鸟,遇到一个这样...

安卓系统自带的软键盘,

需求要修改字母背景,并字母之间留有间距,...

最新内容

获取可变长数组内的无素出现乱码

测试结果如下:正常应该是直接输出1 2 3 4 5 6换成定长数组测试,结果ok...

二进制文件写入失败

//二进制文件的写入int bin_text_write(){struct st...

Visual Studio开发mex文件

我想用Visual Studio开发mex文件,然后在matlab中用,可是产生...

为什么fgets没有读取到\n

int main(){       char buf[100] = { 0 };...

网吧最火10大游戏排名 玩过3款你就老了

当年这些游戏火遍大江南北,直接催生了网吧产业的兴起,你玩过几款?点击任意图片,进...

【请问】如何打开两个控制台窗口?

一个程序有两个线程。如何让每一个线程都有一个控制台窗口?控制台程序。下面的代码就...

关于链表

#include#include#incl...

c++学习方法

求c++学习方法,我是个菜鸟静下心看书,多实践,热爱编程,不要怕...........

while循环

while(low < high & data[high] = data[low...

如何确保 参数指针 不是右值指针

可能标题不是很明确,实例如下struct A{ A(){}; };struct ...

站长说说交流之为什么有些网站不设置关键词排名却很好

常有朋http://www.yixiin.com/sitemap/index-h...

站长说说交流之通过四个方法让你的新站排名首页技巧

很多新站http://www.yixiin.com/sitemap/index-...

类worksheet.Delete()方法无效。。。

类worksheet.Delete()方法无效。。。不能直接使用?是要先设置什么...

dialog 被软键盘顶上去了 下不来,,,

activity 在ManiFest.xml 里面设置的是  android:w...

seo入门者应该怎么做?

 很多人认为优化就是一种硬性的任务,每天必须完成的工作,其实非也,在我看来尤其是...

学c++前途还大吗

现在研二了,明年的这个时候就要找工作了。最近一直在想是学java还是c++的问题...

为什么用 unbindService() 方法解绑定服务后 仍然可以调用服务中的方法

本帖最后由kokoromiro于2016-07-0321:40:09编辑    ...

换一个角度看待搜索引擎优化

    众所周知,搜索引擎优化其实就是通过自己对于网站高质量信息的构建,外部高权...

Gradle sync failed: 你的主机中的软件中止了一个已建立的连接

这个问题怎么解决呀???----------------------------...

网站SEO优化执行力决定成绩

近年来,人们对搜索引擎的依赖性也越来越大。网站优化越来越重视。因此对SEO优化的...