2011-08-17 13 views
20

मैं जिस एंड्रॉइड एप्लिकेशन को डिज़ाइन कर रहा हूं, उसमें मेरी सेवा केवल तब चलने की आवश्यकता है जब डिवाइस राउटर से कनेक्ट हो (स्पष्ट रूप से वाईफ़ाई के माध्यम से)। मैं एंड्रॉइड के लिए वास्तव में नया हूं, और अब तक जो कुछ भी मिला है, उसने मुझे हमेशा के लिए हासिल किया है, इसलिए मैं वास्तव में कुछ पॉइंटर्स की उम्मीद कर रहा हूं।एंड्रॉइड: वाईफाई राज्य के आधार पर सेवा रोकें/प्रारंभ करें?

फोन शुरू होने पर मेरी सेवा शुरू होने के लिए सेट है। साथ ही जब गतिविधि लॉन्च की जाती है तो यह जांचता है कि सेवा चल रही है या नहीं - और यदि यह नहीं शुरू होता है। मैं सोच रहा हूं कि वाईफाई राज्य खो जाने पर इसे बंद करने के लिए मैं अपनी सेवा में कौन सा कोड डाल सकता हूं - और वाईफाई कनेक्शन सक्रिय होने के बाद सेवा शुरू करने के लिए मुझे कौन सा कोड शुरू करना है?

धन्यवाद! :)

उत्तर

26

आप BroadcastReceiver बना सकते हैं जो वाईफ़ाई कनेक्शन परिवर्तनों को संभालता है।

अधिक स्पष्ट होने के लिए, आप एक वर्ग बनाना चाहते हैं जाएगा - कहते हैं कि NetWatcher:

public class NetWatcher extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //here, check that the network connection is available. If yes, start your service. If not, stop your service. 
     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo info = cm.getActiveNetworkInfo(); 
     if (info != null) { 
      if (info.isConnected()) { 
       //start service 
       Intent intent = new Intent(context, MyService.class); 
       context.startService(intent); 
      } 
      else { 
       //stop service 
       Intent intent = new Intent(context, MyService.class); 
       context.stopService(intent); 
      } 
     } 
    } 
} 

(आपकी सेवा का नाम करने के लिए MyService बदलना)।

इसके अलावा, आपके AndroidManifest में, आप निम्नलिखित लाइनों को जोड़ने की आवश्यकता:

<receiver android:name="com.example.android.NetWatcher"> 
    <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 

(अपने पैकेज के नाम के com.example.android बदलना)।

+2

धन्यवाद! यह मेरे समाधान का आधार था। नेटवॉचर वर्ग बिल्कुल वही था जो मुझे चाहिए - लेकिन यह समाधान सत्य रिपोर्ट करता है यदि मोबाइल डेटा कनेक्शन चालू है (सेवा केवल वाईफाई सक्रिय होने पर ही चलने की आवश्यकता है, मोबाइल डेटा नहीं)। समाधान: WifiManager wifiManager = (WifiManager) this.getSystemService (Context.WIFI_SERVICE); अगर (वाईफाई प्रबंधक।isWifiEnabled()) { // प्रारंभ सेवा } अन्य { // रोक सेवा } –

+0

यह 'इरादा इरादा = नया इरादा (संदर्भ, MyService.class) होना चाहिए;' इस 'को इरादे के लिए तर्क के रूप में उपयोग करना चाहिए कन्स्ट्रक्टर 'ब्रॉडकास्ट रिसीवर' के अंदर मान्य नहीं है। इसके अलावा यह 'context.startService (इरादा) होना चाहिए। क्लीनअप सुझावों के लिए – faizal

+0

@faizal धन्यवाद। मैंने इस पोस्ट को शामिल करने के लिए संपादित किया है। – Phil

7

जैसा कि @ फिल ने कहा है, आपको ब्रॉडकास्ट रिसीवर का विस्तार करना चाहिए, और ऑन-रीसीव विधि में सेवा शुरू या बंद करना चाहिए। कुछ की तरह:

class ConnectionChangeReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager connectivityManager = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
     if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
      //start service 
     } else { 
      //stop service 
     } 
    } 
} 

आप इस पर अपनी गतिविधि पर एक निजी वर्ग बना सकते हैं, और गतिविधि पर रजिस्टर रिसीवर बनाते हैं, और गतिविधि पर यह अपंजीकृत को नष्ट कर।

1

शुरू करने के लिए/आपकी सेवा रोक जब प्रार्थना करता हुआ वाईफ़ाई राज्य ठीक/NOK है:

  • रजिस्टर एक BroadcastReceiver
  • अपने BroadCastReceiver अंदर आशय वैधता की जांच तो आपकी सेवा शुरू वाईफ़ाई स्थिति परिवर्तन प्रसारित उद्देश्य प्राप्त करने के लिए

तो WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION प्राप्त करने के लिए अपने प्रसारण रिसीवर को पंजीकृत करें। अनुमति जोड़ें android.permission.CHANGE_WIFI_STATE या android.permission.ACCESS_NETWORK_STATE। मुझे यकीन नहीं है कि यह आवश्यक है या नहीं।

तो एक नमूना प्रसारण रिसीवर कोड हो सकता है:

public class MyWifiStatereceiver extends BroadcastReceiver { 
    //Other stuff here 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent srvIntent = new Intent(); 
     srvIntent.setClass(MyService.class); 
     boolean bWifiStateOk = false; 

     if (WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION.equals(intent.getAction()) { 
      //check intents and service to know if all is ok then set bWifiStateOk accordingly 
      bWifiStateOk = ... 
     } else { 
      return ; // do nothing ... we're not in good intent context doh ! 
     } 

     if (bWifiStateOk) { 
      context.startService(srvIntent); 
     } else { 
      context.stopService(srvIntent); 
     } 
    } 

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