2010-02-16 8 views
12

मैं अपने appplication में एक सेवा में folowing विधि है:एंड्रॉइड - एक गतिविधि में किसी सेवा से विधि का उपयोग करना?

public void switchSpeaker(boolean speakerFlag){ 

     if(speakerFlag){ 
     audio_service.setSpeakerphoneOn(false); 
     } 
     else{ 
     audio_service.setSpeakerphoneOn(true); 
     } 

    } 

तो मेरे सवाल का क्या सबसे अच्छा और सबसे प्रभावी तरीका एक गतिविधि में इस विधि का उपयोग करने में सक्षम होना है की तरह इस प्रकार

final Button speaker_Button = (Button) findViewById(R.id.widget36); 

      speaker_Button.setOnClickListener(new View.OnClickListener(){ 
       public void onClick(View v){ 

        switchSpeaker(true); //method from Service 

       } 

      }); 

क्या मुझे एआईडीएल करना है या क्या कोई आसान तरीका है?

उत्तर

3

आपको ग्राहकों के लिए सेवा की स्विचस्पीकर विधि का खुलासा करना होगा। अपनी .aidl फ़ाइल को परिभाषित करें। अपनी गतिविधि से उस सेवा से जुड़ें और बस स्विचस्पीकर पर कॉल करें। documentation

कोई अन्य सरल इस विधि कॉल करने के लिए जिस तरह से, है, है ना देखें केवल यह स्थिर हो)

+1

उल्लेख कर सकते हैं .aidl के लिए हम बहु सूत्रण को संभालने के लिए है और इसलिए इस लागू करने के लिए एक उचित तरीका नहीं है स्थानीय सेवा का उपयोग करने के लिए सहायता। इसके बजाए दो अन्य विकल्प हैं जिनका हम उपयोग कर सकते हैं और वे आईबींडर का उपयोग कर रहे हैं और मेसेंजर का उपयोग कर रहे हैं। गतिविधि के साथ बाध्यकारी स्थानीय सेवा होने पर आईबींडर सबसे अच्छा होगा। – Dharmendra

+1

लिंक टूटा हुआ है: p @ponkin – Pankaj

3

यह सार्वजनिक है :)

आप bindService (आशय) विधि कॉल कर सकते हैं। ApiDemos, क्लास LocalService बाइंडिंग क्लास पर एक नज़र डालें।

कॉलबैक विधि onServiceConnected में, आप देख सकते हैं:

public void onServiceConnected(ComponentName className, IBinder service) { 
     // This is called when the connection with the service has been 
     // established, giving us the service object we can use to 
     // interact with the service. Because we have bound to a explicit 
     // service that we know is running in our own process, we can 
     // cast its IBinder to a concrete class and directly access it. 
     mBoundService = ((LocalService.LocalBinder)service).getService(); 

     // Tell the user about this for our demo. 
     Toast.makeText(LocalServiceBinding.this, R.string.local_service_connected, 
       Toast.LENGTH_SHORT).show(); 
    } 

अब, सेवा वस्तु (mBoundService) का उपयोग विधि कॉल करने के।

बस इतना ही :)

+0

लेकिन फिर यह एक बाध्य सेवा बन जाएगा और मैं गतिविधि घटक नष्ट होने के बाद भी इसका उपयोग नहीं कर पाऊंगा .. किसी अन्य तरीके से? –

+0

यदि आप गतिविधि को नष्ट होने पर पृष्ठभूमि में चलने की सेवा चाहते हैं तो आप अपनी गतिविधि में बाध्य किए बिना सामान्य रूप से सेवा शुरू कर सकते हैं। फिर सेवा से विधि को कॉल करने के बजाय, सीधे कॉल करने के बजाय, आप इंटेंट के साथ startService को कॉल कर सकते हैं, एक पूर्वनिर्धारित कार्रवाई या अतिरिक्त डेटा है, चाहे सेवा पहले से चल रही है या नहीं, यह ऑनस्टार्ट कमांड विधि लागू की जाएगी -> इरादे की जांच करें और यदि इरादा मेल खाता है तो आप जिस विधि को चाहते हैं उसे कॉल करें। यहां महत्वपूर्ण अंतर यह है कि यह कॉल असीमित है और आप सीधे विधि परिणाम प्राप्त नहीं कर सकते हैं। –

68

है वहाँ आपकी गतिविधि से सेवा बाध्यकारी करने के लिए 3 तरीके हैं।

  1. IBinder कार्यान्वयन
  2. मैसेन्जर
  3. का उपयोग AIDL

का उपयोग करते हुए इन IBinder कार्यान्वयन में अपने मामले

IBinder वर्ग के उदाहरण में सबसे अच्छा सूट है

1. Server.java सेवा

public class Server extends Service{ 

    IBinder mBinder = new LocalBinder(); 


    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    public class LocalBinder extends Binder { 
     public Server getServerInstance() { 
      return Server.this; 
     } 
    } 

    public void switchSpeaker(boolean speakerFlag){ 

     if(speakerFlag){ 
     audio_service.setSpeakerphoneOn(false); 
     } 
     else{ 
     audio_service.setSpeakerphoneOn(true); 
     } 

    } 
} 

2. Client.java गतिविधि

public class Client extends Activity { 

boolean mBounded; 
Server mServer; 
TextView text; 
Button button; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

text = (TextView)findViewById(R.id.text); 
button = (Button) findViewById(R.id.button); 
button.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      mServer.switchSpeaker(true); 
     } 
    }); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Intent mIntent = new Intent(this, Server.class); 
bindService(mIntent, mConnection, BIND_AUTO_CREATE); 
}; 

ServiceConnection mConnection = new ServiceConnection() { 

    public void onServiceDisconnected(ComponentName name) { 
     Toast.makeText(Client.this, "Service is disconnected", 1000).show(); 
     mBounded = false; 
     mServer = null; 
    } 

    public void onServiceConnected(ComponentName name, IBinder service) { 
     Toast.makeText(Client.this, "Service is connected", 1000).show(); 
     mBounded = true; 
     LocalBinder mLocalBinder = (LocalBinder)service; 
     mServer = mLocalBinder.getServerInstance(); 
    } 
}; 

@Override 
protected void onStop() { 
    super.onStop(); 
    if(mBounded) { 
     unbindService(mConnection); 
     mBounded = false; 
    } 
}; 
} 

मैसेन्जर वर्ग के उदाहरण

1. Server.java सेवा

public class Server extends Service{ 

    Messenger messenger = new Messenger(new LocalHandler()); 
    Messenger clientMessenger; 
    static final int SysterTime = 0; 
    static final int AddHandler = 1; 
    List<Handler> mHandlers; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mHandlers = new ArrayList<Handler>(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return messenger.getBinder(); 
    } 

    public class LocalHandler extends Handler { 

     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case SysterTime: 
       SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       try { 
        clientMessenger.send(Message.obtain(null, SysterTime, mDateFormat.format(new Date()))); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
       break; 

      case AddHandler: 
       clientMessenger = new Messenger((Handler) msg.obj); 
       try { 
        clientMessenger.send(Message.obtain(null, AddHandler, "Registed messanger")); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
       break; 

      default: 
       break; 
      } 
      super.handleMessage(msg); 
     } 
    } 
} 

2. ग्राहक।जावा गतिविधि

public class Client extends Activity { 

    Messenger messenger; 
    boolean mBounded; 
    TextView text; 
    Button button; 
    Button register; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     text = (TextView)findViewById(R.id.text); 
     button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       Message message = Message.obtain(null, Server.SysterTime, null); 
       try { 
        messenger.send(message); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

     register = (Button) findViewById(R.id.register); 
     register.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       Message message = Message.obtain(null, Server.AddHandler, new ClientHandle()); 
       try { 
        messenger.send(message); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

    } 


    public class ClientHandle extends Handler { 

     @Override 
     public void handleMessage(Message msg) { 

      switch (msg.what) { 
      case Server.SysterTime: 
       text.setText(msg.obj.toString()); 
       break; 

      case Server.AddHandler: 
       text.setText(msg.obj.toString()); 
       break; 

      default: 
       break; 
      } 

      super.handleMessage(msg); 
     } 


    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     bindService(new Intent(this, Server.class), mConnection, BIND_AUTO_CREATE); 
    } 



    @Override 
    protected void onStop() { 
     super.onStop(); 
     if(mBounded) { 
      unbindService(mConnection); 
     } 
    } 



    ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceDisconnected(ComponentName name) { 
      mBounded = false; 
      messenger = null; 
     } 

     public void onServiceConnected(ComponentName name, IBinder service) { 
      Toast.makeText(Client.this, "Service is connected", 1000).show(); 
      messenger = new Messenger(service); 
      mBounded = true; 
     } 
    }; 
} 

AIDL का उदाहरण

1. IRemoteService.aidl

package com.example.bindservice.aidl; 

interface IRemoteService { 

    String getMessage(String msg); 
} 

2. Server.java सेवा

public class Server extends Service{ 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mStub; 
    } 

    IRemoteService.Stub mStub = new IRemoteService.Stub() { 

     public String getMessage(String msg) throws RemoteException { 
      return msg; 
     } 
    }; 
} 

3. Client.java गतिविधि

public class Client extends Activity { 

    Button button; 
    TextView text; 
    boolean mBound; 
    IRemoteService mIRemoteService; 
    EditText etMsg; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     text = (TextView)findViewById(R.id.text); 
     button = (Button) findViewById(R.id.button); 
     etMsg = (EditText)findViewById(R.id.etMsg); 
     button.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       if(mBound) { 
        try { 
         text.setText(mIRemoteService.getMessage(etMsg.getText().toString())); 
        } catch (RemoteException e) { 
         e.printStackTrace(); 
        }     
       } 
      } 
     }); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     bindService(new Intent(Client.this, Server.class), mConnection, BIND_AUTO_CREATE); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if(mBound) { 
      unbindService(mConnection); 
      mBound = false; 
     } 
    } 

    ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceDisconnected(ComponentName name) { 
      mIRemoteService = null; 
      mBound = false; 
     } 

     public void onServiceConnected(ComponentName name, IBinder service) { 
      mIRemoteService = IRemoteService.Stub.asInterface(service); 
      mBound = true; 
     } 
    }; 
} 

अधिक अध्ययन के लिए आप this document

+3

अच्छे उदाहरण वहाँ! –

+0

मैं सहायता का उपयोग कर उदाहरण 3 का उपयोग कर रहा हूं, यहां शून्य सूचक अपवाद प्राप्त करना एक = miremoteService.getMessage ("msg") स्ट्रिंग; –

+0

@RajaReddyPolamReddy अपने कोड के साथ एक नया प्रश्न पूछें ताकि आप अधिक से अधिक बेहतर उत्तर प्राप्त कर सकें। – Dharmendra

संबंधित मुद्दे