2016-08-29 8 views
6

नूगा जिस तरह से यह CONNECTIVITY_CHANGED उद्देश्य संभालती है (मूल रूप से यह अनदेखी, devs के लिए मजबूर कर काम अनुसूचक उपयोग करने के लिए) बदल तो यह मुझे सोच छोड़ देता है:पर एंड्रॉयड 7.0 नूगा कनेक्टिविटी परिवर्तन का पता लगाने जब एप्लिकेशन को अग्रभूमि में चलने

मैं एक है, तो ऐप जो कुछ डेटा पुनर्प्राप्त करने के बीच में है (और मैंने जांच की कि फ़ोन अनुरोध के समय ऑनलाइन था या नहीं, लेकिन उपयोगकर्ता चल रहा है और फोन एक अलग वाईफाई एक्सेस पॉइंट से जुड़ता है, उदाहरण के लिए) और यह विफल रहता है , मैं कैसे पता लगा सकता हूं कि कनेक्शन बहाल कर दिया गया है और मैं डेटा को डेटा लाने के लिए पुनः प्रयास कर रहा हूं?

तो इस मामले में मेरा ऐप अग्रभूमि में है, मुझे लगता है कि क्रोम (एंड्रॉइड के लिए) का एक समान कार्य है।

क्या मुझे इसे स्वयं मतदान करने की आवश्यकता है? या उस समय कुछ घटना है जिसकी अनुमति है?

उत्तर

4

चल रहे ऐप्स अभी भी CONNECTIVITY_CHANGE को अपने मुख्य थ्रेड पर सुन सकते हैं यदि वे ब्रॉडकास्ट रिसीवर के साथ अधिसूचना का अनुरोध करते हैं।

https://developer.android.com/about/versions/nougat/android-7.0-changes.html

+0

आह तो प्रकट या पृष्ठभूमि थ्रेड में एक श्रोता दर्ज की अब और काम नहीं करता है, लेकिन आप अभी भी एक गतिविधि के मुख्य धागे में (या सेवा, मुझे लगता है?) धन्यवाद! – REJH

+0

क्या अभी भी पृष्ठभूमि में CONNECTIVITY_CHANGE को सुनने का कोई तरीका है? –

+1

हां आपको जॉब शेड्यूलर का उपयोग करके ऐसा करना है। तो यह तुरंत आग नहीं होगा। यही विचार है क्योंकि प्रत्येक देव सोचता है कि उनके ऐप को इसके बारे में पता होना चाहिए और इस प्रकार आपका फोन नेटवर्क को बदलने के तुरंत बाद क्रॉल में धीमा हो जाता है: पी – REJH

9

एंड्रोमेडा के जवाब में इस्तेमाल किया जा सकता है, कि समाधान गूगल के इरादे से विकल्प नहीं है। आपका प्रश्न यह था कि कनेक्शन कब खो जाता है और नेटवर्क सेवा लौटने पर आपको ऑपरेशन फिर से शुरू करने की आवश्यकता होती है।

जबकि CONNECTIVITY_CHANGE तकनीकी रूप से काम करता है, यह हमेशा इस विशिष्ट आवश्यकता के लिए हैक का थोड़ा सा था और जैसे ही आपका ऐप पृष्ठभूमि में जाता है, यह नौगेट में काम करना बंद कर देगा। आपको वास्तव में क्या उपयोग करना चाहिए नौकरी शेड्यूलर एपीआई है। Google ने हमें अलग-अलग आवश्यकताओं और सुविधाओं के साथ कई विकल्प प्रदान किए हैं।

  1. JobScheduler

JobScheduler लॉलीपॉप में जोड़ा गया था और एक अनुसूचक जो नेटवर्क कनेक्टिविटी के लिए इंतजार कर सकते हैं एक नौकरी शेड्यूल करने के लिए कहते हैं। यह असमान या गैर रोमिंग कनेक्शन की जांच, कनेक्शन के प्रकार पर भी निर्भर हो सकता है। इस विकल्प में पिछली संगतता नहीं है, लेकिन Google Play सेवाओं के बिना काम करता है।

  1. GCM नेटवर्क प्रबंधक

GcmNetworkManager लॉलीपॉप से ​​पहले संस्करण के लिए JobScheduler कार्यक्षमता का एक सीधा बंदरगाह है, लेकिन यह Google Play सेवाओं की आवश्यकता है। जीसीएमनेटवर्क प्रबंधक को ज्यादातर फायरबेस जॉब डिस्पैचर द्वारा बहिष्कृत किया गया है।

  1. Firebase नौकरी डिस्पैचर

Firebase JobDispatcher लॉलीपॉप, गूगल डिफ़ॉल्ट रूप से Play सेवाओं का उपयोग करता है जो पहले के संस्करणों के लिए कार्य शेड्यूल करने के लिए एक और साधन प्रदान करता है, लेकिन आवश्यकता नहीं करने के लिए विन्यस्त किया जा सकता यह निर्भरता

सभी तीन विकल्प बैटरी-अनुकूल तरीके से आपकी ज़रूरत को पूरा करेंगे और आपकी नौकरियां अभी भी निर्धारित हो जाएंगी, भले ही डिवाइस डोज मोड से संक्षिप्त रूप से उठ जाए।

https://developer.android.com/topic/performance/scheduling.html https://developer.android.com/topic/performance/background-optimization.html#sched-jobs

+0

पूर्ण प्रकटीकरण के लिए धन्यवाद लेकिन मेरा प्रश्न विशेष रूप से जब एप अग्रभूमि में है:) – REJH

+0

मेरा समाधान उस मामले को भी शामिल करता है। अन्य मामलों की तुलना में, ज्यादातर मामलों में यह अधिक लचीला और बेहतर अभ्यास है। एकमात्र ऐसा मामला जो कवर नहीं करता है वह मुझे अभी चाहिए, जो नेटवर्क नेटवर्क कनेक्शन के बीच स्विचिंग और ऐप को जागने जैसी किसी भी नेटवर्क परिवर्तन का पता लगाने का तरीका है। – colintheshots

+0

इसे एक अंगूठे देने के लिए लॉग इन किया गया है। वास्तव में महान जानकारी! – vvolkgang

2

मेरे मामले में मैं सेवा में CONNECTIVITY_CHANGE फिल्टर के साथ प्रसारित करने के लिए सदस्यता ले लिया है और यह काम कर रहा:

यहाँ गूगल द्वारा दिए गए उदाहरणों के साथ विभिन्न विकल्पों के बारे में अधिक जानकारी है।

ऐप्स को लक्षित एंड्रॉयड 7.0 (एपीआई स्तर 24) और उच्च CONNECTIVITY_ACTION प्रसारण प्राप्त नहीं है अगर वे में अपने प्रसारण रिसीवर की घोषणा:

Service जीवित रखने के लिए कैसे एक और कहानी :)

+0

मुझे लगता है कि आपको इसे अग्रभूमि में चलाना होगा? यह बहुत अजीब बात है कि एंड्रॉइड अभी भी कॉन परिवर्तनों को सुनने के लिए सेवाओं (जो लगभग हमेशा पृष्ठभूमि प्रक्रियाओं) की अनुमति देगा। चूंकि नौकरी शेड्यूलर का उपयोग करने से सेवा सामान्य रूप से आसान होती है, इसलिए हर देव सेवा करने के लिए बहुत मोहक होगा और इसके बारे में भूल जाएगा ..? यूपीडी: और आप मूल रूप से मेरा बिंदु बीटीडब्ल्यू साबित करते हैं: पी जॉबस्च – REJH

+0

के बजाय एक सेवा का उपयोग करना मेरे ऐप में पहले से ही यह किसी भी मामले में था, इसलिए मैंने अभी पंजीकृत किया है – Penzzz

3

अनुसार doc है प्रकट। ऐप्स को CONNECTIVITY_ACTION ब्रॉडकास्ट प्राप्त होंगे यदि वे BroadcastReceiverContext.registerReceiver() के साथ पंजीकृत करते हैं और वह संदर्भ अभी भी मान्य है।

+0

प्रत्यक्ष और सही उत्तर – saksham

0

सार्वजनिक वर्ग ConnectivityReceiver {

public static boolean getWifiStatus(Context context) 
{ 
    // To get System Connectivity status 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 


    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    if (null != activeNetwork) 
    { 
     // Check For Wifi Status 
     if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) 
      return true; 
     else 
      return false; 
    } 

    return false; 
} 

सार्वजनिक वर्ग NetworkMgr फैली BroadcastReceiver {

@Override 
public void onReceive(Context context, Intent intent) { 

    ConnectivityReceiver cf = new ConnectivityReceiver(); 
    boolean status = cf.getWifiStatus(context); 

    if(status) 
    { 
     Toast.makeText(context,"Wifi Connection is On.", Toast.LENGTH_SHORT).show(); 
    } 
    else 
    { 
     Toast.makeText(context,"Wifi Connection is Off.", Toast.LENGTH_SHORT).show(); 
    } 
} 

}

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