绑定服务:调用服务内部的方法

来源:互联网 发布:对象转成json 编辑:程序博客网 时间:2024/04/30 19:59

service:后台运行 没有界面的组件


Intent

startService();
stopService();



服务一旦被创建,就不会重新创建了.
服务的oncreate方法只会执行一次,如果服务已经开启,就不会再去执行oncreate方法
服务在停止的时候,会调用ondestroy方法

每一次开启服务的时候 都会调用 onStartCommand()  onStart();




服务有两种开启方式:
1. startService(); 服务一旦开启就跟开启者(activity)没有什么关系.activity挂了,
服务还会开心的在后台运行.

2. bindService();  服务跟activity就有了千丝万缕的联系. 如果调用者activity挂了
服务也跟着挂了.  不求同时生,但求同时死.
服务只能被显示的解除绑定一次,多次的解除绑定服务 应用程序会报异常

 

 

 

 

 

 

----------------------

绑定服务调用服务里面方法的流程:
1. 在activity 采用bindService方式开启服务...

2. 写一个实现类 MyConn implements ServiceConnection

3.  接口里面有一个方法onServiceConnected 在服务成功绑定的时候调用的方法

4.  在service代码 实现 onBind方法  返回一个IBinder接口的实现( 里面必须一个调用服务方法的api)

5.  在服务成功绑定的时候 服务里面返回的IBinder对象会传给 activity里面onServiceConnected 方法

6. 获取IBinder对象 中间人, 调用中间人的方法. 间接调用了服务里面的方法

 

 

 

 

 

-------------------------------------------------------------------------------------------

public class MainActivity extends Activity {

      private ServiceConnection  conn;
      private IService  mybinder;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
            setContentView(R.layout. activity_main);
      }

      /**
       * 开启服务:已绑定服务的方式获取服务中的代理人,间接调用服务内的方法
       */
      public void start(View view){
            System. out.println( "服务开启...");
          Intent intent= new Intent(getApplicationContext(),MyService.class );
          conn= new MyConn();
          bindService(intent, conn, BIND_AUTO_CREATE);
          // onBindService(conn);    conn=null;    关闭服务并将服务置为空
      }
      
      

       // 2.实现serviceConnection接口
      private class MyConn implements ServiceConnection{

             //服务成功绑定时
             @Override
             public void onServiceConnected(ComponentName name, IBinder service) {
                   mybinder= (IService) service;    //获取代理人对象
                  System. out.println( "Activity得到服务返回的代理人....." );
            }

             //当服务异常终止....失去连接的时候调用的方法
             @Override
             public void onServiceDisconnected(ComponentName name) {
            
                  
            }
            
            
            
      }
      
      
      
      
      
      
      /**
       * 调用服务内方法
       * @param view
       */
    public void getMethod(View view){
      
      mybinder.Method(15000);
    }
      
      
}



-------------------------------------------------------------------------------------------



      /**
       * 成功绑定服务时调用的方法
       */
      @Override
      public IBinder onBind(Intent arg0) {
            System. out.println( "服务被成功绑定时....返回代理人对象" );
            
             return new MyBind();
      }
      
      
      /**
       * 将服务分方法交给代理人代理
       * @author Administrator
       *
       */
      public class  MyBind extends Binder{
      
      /**
       * 服务内的方法
       * @param money
       */
       public boolean  Method( long money){
            
             if(money>10000){
                  System. out.println( "卖给你清华大学毕业证了...." );
                  Toast. makeText(getApplicationContext(), "卖给你清华大学毕业证了...." , 0).show();
                   return true;
            } else{
                  System. out.println( "没钱还想买证书?......" );
                  Toast. makeText(getApplicationContext(), "没钱还想买证书?......", 0).show();
                   return false;
                  
            }
            
            
      }
      
      }

}


--------------------------------------------------------------------------------------


public interface IService {

      public boolean  Method( long money);
}






 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击