积累系统性知识
积聚技术精华
  首页    个人中心    撰写积文    建立课题    订立目标    整理积文    管理课题    管理目标    技能Get    代码积累 
Service-boundService绑定服务(3)
error997 (error997)    2015-05-10 19:11:14      目标    课题
   EXAMP:
   利用两个按钮实现bindService()和unbindService()的研究;
   1.继承Service并实现其onBinder()方法:

切换到: 纯代码  
   
/** 
 * @author Lean 
 * 
 */  
public class LeanService extends Service {  
      
    private LocalBinder mBinder=new LocalBinder();  
      
    class LocalBinder extends Binder{  
        //获取本服务对象并调用其方法   
        public Service getService(){  
            return LeanService.this;  
        }  
          
        public String calledRemoteMethod(String str){  
            return "you called remote method args="+str;  
        }  
          
    }  
      
    @Override  
    public IBinder onBind(Intent arg0) {  
        return mBinder;  
    }  
      
    //同样 耗时操作也会促使界面卡屏   
    public void countNum(){  
        for (int i = 0; i < 20; i++) {  
            try {  
                Thread.sleep(1000l);  
                Log.v("log","countNum : "+i);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
      
    @Override  
    public boolean onUnbind(Intent intent) {  
        Log.v("log","onUnbind");  
        return super.onUnbind(intent);  
    }  
      
}


   /**
 * @author Lean
 *
 */
public class LeanService extends Service {
   
   private LocalBinder mBinder=new LocalBinder();
   
   class LocalBinder extends Binder{
      //获取本服务对象并调用其方法
      public Service getService(){
         return LeanService.this;
      }
      
      public String calledRemoteMethod(String str){
         return "you called remote method args="+str;
      }
      
   }
   
   @Override
   public IBinder onBind(Intent arg0) {
      return mBinder;
   }
   
   //同样 耗时操作也会促使界面卡屏
   public void countNum(){
      for (int i = 0; i < 20; i++) {
         try {
            Thread.sleep(1000l);
            Log.v("log","countNum : "+i);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
      }
   }
   
   @Override
   public boolean onUnbind(Intent intent) {
      Log.v("log","onUnbind");
      return super.onUnbind(intent);
   }
   
}
   2.并在AndroidManifest.xml中配置

切换到: 纯代码  
   
<service android:name="org.lean.LeanService"/>


   <service android:name="org.lean.LeanService"/>
   3.点击按钮实现绑定:

切换到: 纯代码  
   
/** 
 * @author Administrator 
 * 
 */  
public class MainActivity extends Activity {  
      
    private ServiceConnection mConnection;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        initUI();  
          
        mConnection=new ServiceConnection() {  
              
            <SPAN style="WHITE-SPACE: pre"> </SPAN>//只有在service因异常而断开连接的时候,这个方法才会用到   
            @Override  
            public void onServiceDisconnected(ComponentName name) {  
                Log.v("log","onServiceDisconnected"+name.getClassName());  
            }  
              
            //数据连接成功,通过IBinder的stub程序获取远程指针并调用相应内存的方法   
            @Override  
            public void onServiceConnected(ComponentName name, IBinder service) {  
//              String result=((LocalBinder)service).calledRemoteMethod("Lean");   
//              Log.v("log",result);   
//              ((LeanService)((LocalBinder)service).getService()).countNum();   
            }  
        };  
    }  
  
    private void initUI() {  
        findViewById(R.id.boundService).setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                Intent intent=new Intent(MainActivity.this,LeanService.class);  
                bindService(intent, mConnection,Service.BIND_AUTO_CREATE);  
            }  
        });  
        findViewById(R.id.unboundService).setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                unbindService(mConnection);  
            }  
        });  
    }  
  
}


   /**
 * @author Administrator
 *
 */
public class MainActivity extends Activity {
   
   private ServiceConnection mConnection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initUI();
        
        mConnection=new ServiceConnection() {
         
              //只有在service因异常而断开连接的时候,这个方法才会用到
         @Override
         public void onServiceDisconnected(ComponentName name) {
            Log.v("log","onServiceDisconnected"+name.getClassName());
         }
         
         //数据连接成功,通过IBinder的stub程序获取远程指针并调用相应内存的方法
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
//            String result=((LocalBinder)service).calledRemoteMethod("Lean");
//            Log.v("log",result);
//            ((LeanService)((LocalBinder)service).getService()).countNum();
         }
      };
    }

   private void initUI() {
      findViewById(R.id.boundService).setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
            Intent intent=new Intent(MainActivity.this,LeanService.class);
            bindService(intent, mConnection,Service.BIND_AUTO_CREATE);
         }
      });
      findViewById(R.id.unboundService).setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
            unbindService(mConnection);
         }
      });
   }

}
   1.继承Server的服务端提供一个IBinder接口,当绑定服务的客户端绑定成功后会获取其接口句柄,
   该句柄返回该服务端的实例本身。从而间接调用其Service的方法。
   2.系统绑定的顺序为 onCreate() -> onBind() -> onServiceConnected() ;
   3.从客户端发送Intent数据可以在服务端的onBind() 参数中获取。实现数据传输。
   4.在S端进行的耗时操作会导致界面卡屏或者ANR;

转自 http://blog.csdn.net/qq285016127/article/details/25171043
(+0)技能Get

建议楼主:搜索关键字 |参考其他资源 |回复 |追问
  error997(error997):   个人中心    课题    目标    代码积累