নেটওয়ার্ক অবস্থা পড়ুন

অ্যান্ড্রয়েড অ্যাপগুলিকে সংযোগের গতিশীল পরিবর্তন সম্পর্কে জানতে সক্ষম করে। সংযোগের পরিবর্তনগুলি ট্র্যাক করতে এবং প্রতিক্রিয়া জানাতে নিম্নলিখিত ক্লাসগুলি ব্যবহার করুন:

  • ConnectivityManager আপনার অ্যাপকে সিস্টেমের সংযোগের অবস্থা সম্পর্কে জানায়।
  • Network ক্লাসটি এমন একটি নেটওয়ার্ককে প্রতিনিধিত্ব করে যার সাথে ডিভাইসটি সংযুক্ত। আপনি ConnectivityManager সাহায্যে নেটওয়ার্ক সম্পর্কে তথ্য সংগ্রহ করতে বা নেটওয়ার্কে সকেটগুলি বাঁধতে Network অবজেক্টটিকে একটি কী হিসাবে ব্যবহার করতে পারেন। যখন নেটওয়ার্ক সংযোগ বিচ্ছিন্ন হয়ে যায়, তখন Network অবজেক্টটি ব্যবহারযোগ্য হওয়া বন্ধ করে দেয়। এমনকি যদি ডিভাইসটি পরে একই অ্যাপ্লায়েন্সের সাথে পুনরায় সংযোগ স্থাপন করে, একটি নতুন Network অবজেক্ট নতুন নেটওয়ার্ককে প্রতিনিধিত্ব করে।
  • LinkProperties অবজেক্টে নেটওয়ার্কের লিঙ্ক সম্পর্কে তথ্য থাকে, যেমন DNS সার্ভারের তালিকা, স্থানীয় IP ঠিকানা এবং নেটওয়ার্কের জন্য ইনস্টল করা নেটওয়ার্ক রুট।
  • NetworkCapabilities অবজেক্টে নেটওয়ার্কের বৈশিষ্ট্য সম্পর্কে তথ্য থাকে, যেমন পরিবহন (ওয়াই-ফাই, মোবাইল, ব্লুটুথ) এবং নেটওয়ার্ক কী করতে সক্ষম। উদাহরণস্বরূপ, নেটওয়ার্কটি MMS পাঠাতে সক্ষম কিনা, ক্যাপটিভ পোর্টালের পিছনে আছে কিনা, নাকি মিটার করা আছে তা নির্ধারণ করতে আপনি অবজেক্টটিকে জিজ্ঞাসা করতে পারেন।

যেকোনো সময়ে সংযোগের তাৎক্ষণিক অবস্থা সম্পর্কে আগ্রহী অ্যাপগুলি কোন ধরণের নেটওয়ার্ক উপলব্ধ তা জানতে ConnectivityManager পদ্ধতিতে কল করতে পারে। এই পদ্ধতিগুলি ডিবাগিং এবং মাঝে মাঝে যেকোনো সময়ে উপলব্ধ সংযোগের স্ন্যাপশট পর্যালোচনা করার জন্য সহায়ক।

তবে, সিঙ্ক্রোনাস ConnectivityManager পদ্ধতিগুলি আপনার অ্যাপকে কলের পরে কিছু ঘটছে কিনা তা জানায় না, তাই তারা আপনাকে আপনার UI আপডেট করতে দেয় না। নেটওয়ার্ক সংযোগ বিচ্ছিন্ন হওয়ার সময় বা নেটওয়ার্ক ক্ষমতা পরিবর্তনের সময় তারা অ্যাপের আচরণ সামঞ্জস্য করতে পারে না।

যেকোনো সময় কানেক্টিভিটি পরিবর্তন হতে পারে এবং বেশিরভাগ অ্যাপের ডিভাইসে নেটওয়ার্কিং অবস্থা সম্পর্কে সর্বদা তাজা এবং হালনাগাদ ধারণা থাকা প্রয়োজন। অ্যাপটি যে পরিবর্তনগুলি সম্পর্কে সতর্ক থাকতে ConnectivityManager সাথে একটি কলব্যাক নিবন্ধন করতে পারে। কলব্যাক ব্যবহার করে, আপনার অ্যাপ সংযোগের যেকোনো প্রাসঙ্গিক পরিবর্তনের সাথে সাথে প্রতিক্রিয়া জানাতে পারে, ব্যয়বহুল পোলিং ব্যবহার না করে যা দ্রুত আপডেট মিস করতে পারে।

NetworkCallback এবং ডিভাইসের সংযোগ অবস্থা সম্পর্কে জানার অন্যান্য উপায় ব্যবহার করার জন্য কোনও নির্দিষ্ট অনুমতির প্রয়োজন হয় না। তবে, কিছু নেটওয়ার্ক নির্দিষ্ট অনুমতির অধীন। উদাহরণস্বরূপ, অ্যাপগুলিতে সীমাবদ্ধ নেটওয়ার্ক উপলব্ধ নাও থাকতে পারে। একটি ব্যাকগ্রাউন্ড নেটওয়ার্কের সাথে সংযুক্ত করার জন্য CHANGE_NETWORK_STATE অনুমতি প্রয়োজন। এবং কিছু কল চালানোর জন্য নির্দিষ্ট অনুমতির প্রয়োজন হতে পারে। বিস্তারিত জানার জন্য প্রতিটি কলের জন্য নির্দিষ্ট ডকুমেন্টেশন দেখুন।

তাৎক্ষণিক অবস্থা পান

একটি অ্যান্ড্রয়েড-চালিত ডিভাইস একই সময়ে অনেকগুলি সংযোগ বজায় রাখতে পারে। বর্তমান নেটওয়ার্ক অবস্থা সম্পর্কে তথ্য পেতে, প্রথমে ConnectivityManager এর একটি উদাহরণ পান:

কোটলিন

val connectivityManager = getSystemService(ConnectivityManager::class.java)

জাভা

ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);

এরপর, আপনার অ্যাপের বর্তমান ডিফল্ট নেটওয়ার্কের একটি রেফারেন্স পেতে এই উদাহরণটি ব্যবহার করুন:

কোটলিন

val currentNetwork = connectivityManager.getActiveNetwork()

জাভা

Network currentNetwork = connectivityManager.getActiveNetwork();

কোনও নেটওয়ার্কের রেফারেন্সের মাধ্যমে, আপনার অ্যাপটি এটি সম্পর্কে তথ্যের জন্য অনুরোধ করতে পারে:

কোটলিন

val caps = connectivityManager.getNetworkCapabilities(currentNetwork)
val linkProperties = connectivityManager.getLinkProperties(currentNetwork)

জাভা

NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork);
LinkProperties linkProperties = connectivityManager.getLinkProperties(currentNetwork);

আরও কার্যকর কার্যকারিতার জন্য, একটি NetworkCallback নিবন্ধন করুন। নেটওয়ার্ক কলব্যাক নিবন্ধন সম্পর্কে আরও তথ্যের জন্য, নেটওয়ার্ক ইভেন্টগুলি শুনুন দেখুন।

নেটওয়ার্ক সক্ষমতা এবং লিঙ্কপ্রোপার্টি

NetworkCapabilities এবং LinkProperties অবজেক্টগুলি সিস্টেমের নেটওয়ার্ক সম্পর্কে জানা সমস্ত বৈশিষ্ট্য সম্পর্কে তথ্য প্রদান করে।

LinkProperties অবজেক্ট রুট, লিঙ্ক ঠিকানা, ইন্টারফেসের নাম, প্রক্সি তথ্য (যদি থাকে) এবং DNS সার্ভার সম্পর্কে জানে। আপনার প্রয়োজনীয় তথ্য পুনরুদ্ধার করতে LinkProperties অবজেক্টের প্রাসঙ্গিক পদ্ধতিতে কল করুন।

NetworkCapabilities অবজেক্টটি নেটওয়ার্ক পরিবহন এবং তাদের ক্ষমতা সম্পর্কে তথ্য ধারণ করে।

ট্রান্সপোর্ট হলো একটি ভৌত ​​মাধ্যমের একটি বিমূর্তকরণ যার উপর ভিত্তি করে একটি নেটওয়ার্ক পরিচালিত হয়। ট্রান্সপোর্টের সাধারণ উদাহরণ হল ইথারনেট, ওয়াই-ফাই এবং মোবাইল। ভিপিএন এবং পিয়ার-টু-পিয়ার ওয়াই-ফাইও ট্রান্সপোর্ট হতে পারে। অ্যান্ড্রয়েডে, একটি নেটওয়ার্কে একই সময়ে একাধিক ট্রান্সপোর্ট থাকতে পারে। এর একটি উদাহরণ হল ওয়াই-ফাই এবং মোবাইল নেটওয়ার্ক উভয়ের মাধ্যমেই পরিচালিত একটি ভিপিএন। ভিপিএন-তে ওয়াই-ফাই, মোবাইল এবং ভিপিএন ট্রান্সপোর্ট রয়েছে। একটি নেটওয়ার্কে একটি নির্দিষ্ট ট্রান্সপোর্ট আছে কিনা তা জানতে, NetworkCapabilities.hasTransport(int) পদ্ধতিটি NetworkCapabilities.TRANSPORT_* ধ্রুবকগুলির একটি ব্যবহার করুন।

একটি ক্ষমতা নেটওয়ার্কের একটি বৈশিষ্ট্য বর্ণনা করে। উদাহরণস্বরূপ ক্ষমতাগুলির মধ্যে রয়েছে MMS , NOT_METERED এবং INTERNET । MMS ক্ষমতা সম্পন্ন একটি নেটওয়ার্ক মাল্টিমিডিয়া মেসেজিং পরিষেবা বার্তা পাঠাতে এবং গ্রহণ করতে পারে, এবং এই ক্ষমতা ছাড়া একটি নেটওয়ার্ক পারে না। NOT_METERED ক্ষমতা সম্পন্ন একটি নেটওয়ার্ক ব্যবহারকারীকে ডেটার জন্য বিল করে না। আপনার অ্যাপ NetworkCapabilities.NET_CAPABILITY_* ধ্রুবকগুলির একটি ব্যবহার করে NetworkCapabilities.hasCapability(int) পদ্ধতি ব্যবহার করে উপযুক্ত ক্ষমতা পরীক্ষা করতে পারে।

সবচেয়ে কার্যকর NET_CAPABILITY_* ধ্রুবকগুলির মধ্যে রয়েছে:

  • NET_CAPABILITY_INTERNET : নির্দেশ করে যে নেটওয়ার্কটি ইন্টারনেট অ্যাক্সেস করার জন্য সেট আপ করা হয়েছে। এটি সেটআপ সম্পর্কে, পাবলিক সার্ভারে পৌঁছানোর প্রকৃত ক্ষমতা সম্পর্কে নয়। উদাহরণস্বরূপ, ইন্টারনেট অ্যাক্সেস করার জন্য একটি নেটওয়ার্ক সেট আপ করা যেতে পারে তবে এটি একটি ক্যাপটিভ পোর্টালের অধীনে থাকতে পারে।

    একটি ক্যারিয়ারের মোবাইল নেটওয়ার্কে সাধারণত INTERNET ক্ষমতা থাকে, যেখানে স্থানীয় P2P ওয়াই-ফাই নেটওয়ার্কে সাধারণত তা থাকে না। প্রকৃত সংযোগের জন্য, NET_CAPABILITY_VALIDATED দেখুন।

  • NET_CAPABILITY_NOT_METERED : নির্দেশ করে যে নেটওয়ার্কটি মিটার করা হয়নি। যখন ব্যবহারকারী আর্থিক খরচ, ডেটা সীমাবদ্ধতা, বা ব্যাটারির কর্মক্ষমতা সংক্রান্ত সমস্যার কারণে সেই সংযোগে অতিরিক্ত ডেটা ব্যবহারের প্রতি সংবেদনশীল হন তখন একটি নেটওয়ার্ককে মিটার করা হিসাবে শ্রেণীবদ্ধ করা হয়।

  • NET_CAPABILITY_NOT_VPN : নির্দেশ করে যে নেটওয়ার্কটি একটি ভার্চুয়াল প্রাইভেট নেটওয়ার্ক নয়।

  • NET_CAPABILITY_VALIDATED : নির্দেশ করে যে নেটওয়ার্কটি যখন অনুসন্ধান করা হয় তখন পাবলিক ইন্টারনেটে প্রকৃত অ্যাক্সেস প্রদান করে। ক্যাপটিভ পোর্টালের পিছনে থাকা নেটওয়ার্ক বা ডোমেন নাম রেজোলিউশন প্রদান করে না এমন নেটওয়ার্কের এই ক্ষমতা নেই। এটি সিস্টেমটি আসলে অ্যাক্সেস প্রদানকারী নেটওয়ার্ক সম্পর্কে বলতে পারে এমন সবচেয়ে কাছাকাছি, যদিও একটি বৈধ নেটওয়ার্ক নীতিগতভাবে, IP-ভিত্তিক ফিল্টারিংয়ের বিষয় হতে পারে বা দুর্বল সংকেতের মতো সমস্যার কারণে হঠাৎ সংযোগ বিচ্ছিন্ন হতে পারে।

  • NET_CAPABILITY_CAPTIVE_PORTAL : নেটওয়ার্কটি অনুসন্ধান করার সময় একটি ক্যাপটিভ পোর্টাল রয়েছে তা নির্দেশ করে।

আরও কিছু ক্ষমতা আছে যেগুলোতে আরও বিশেষায়িত অ্যাপ আগ্রহী হতে পারে। আরও তথ্যের জন্য, NetworkCapabilities.hasCapability(int) এ প্যারামিটার সংজ্ঞাগুলি পড়ুন।

একটি নেটওয়ার্কের ক্ষমতা যেকোনো সময় পরিবর্তন হতে পারে। যখন সিস্টেমটি একটি ক্যাপটিভ পোর্টাল সনাক্ত করে, তখন এটি ব্যবহারকারীকে লগ ইন করার জন্য আমন্ত্রণ জানিয়ে একটি বিজ্ঞপ্তি দেখায়। এটি চলমান থাকাকালীন, নেটওয়ার্কটিতে NET_CAPABILITY_INTERNET এবং NET_CAPABILITY_CAPTIVE_PORTAL ক্ষমতা রয়েছে কিন্তু NET_CAPABILITY_VALIDATED ক্ষমতা নেই।

যখন ব্যবহারকারী পদক্ষেপ নেয় এবং ক্যাপটিভ পোর্টাল পৃষ্ঠায় লগ ইন করে, তখন ডিভাইসটি পাবলিক ইন্টারনেট অ্যাক্সেস করতে সক্ষম হয় এবং নেটওয়ার্ক NET_CAPABILITY_VALIDATED ক্ষমতা অর্জন করে এবং NET_CAPABILITY_CAPTIVE_PORTAL ক্ষমতা হারায়।

একইভাবে, একটি নেটওয়ার্কের পরিবহন গতিশীলভাবে পরিবর্তিত হতে পারে। উদাহরণস্বরূপ, একটি VPN নিজেকে নতুন করে তৈরি একটি দ্রুত নেটওয়ার্ক ব্যবহার করার জন্য পুনরায় কনফিগার করতে পারে, যেমন তার অন্তর্নিহিত নেটওয়ার্কের জন্য মোবাইল থেকে Wi-Fi এ স্যুইচ করা। এই ক্ষেত্রে, নেটওয়ার্ক TRANSPORT_CELLULAR পরিবহন হারায় এবং TRANSPORT_WIFI পরিবহন লাভ করে, একই সাথে TRANSPORT_VPN পরিবহন বজায় রাখে।

নেটওয়ার্ক ইভেন্টগুলি শুনুন

নেটওয়ার্ক ইভেন্ট সম্পর্কে জানতে, ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback) এবং ConnectivityManager.registerNetworkCallback(NetworkCallback) এর সাথে NetworkCallback ক্লাসটি ব্যবহার করুন। এই দুটি পদ্ধতি ভিন্ন উদ্দেশ্যে কাজ করে।

সমস্ত অ্যান্ড্রয়েড অ্যাপের একটি ডিফল্ট নেটওয়ার্ক থাকে, যা সিস্টেম দ্বারা নির্ধারিত হয়। সিস্টেমটি সাধারণত মিটারযুক্ত নেটওয়ার্কের চেয়ে মিটারবিহীন নেটওয়ার্ক এবং ধীর নেটওয়ার্কের চেয়ে দ্রুত নেটওয়ার্ক পছন্দ করে।

যখন কোনও অ্যাপ নেটওয়ার্ক অনুরোধ জারি করে, যেমন HttpsURLConnection , তখন সিস্টেমটি ডিফল্ট নেটওয়ার্ক ব্যবহার করে এই অনুরোধটি পূরণ করে। অ্যাপগুলি অন্যান্য নেটওয়ার্কেও ট্র্যাফিক পাঠাতে পারে। আরও তথ্যের জন্য, অতিরিক্ত নেটওয়ার্ক সম্পর্কে বিভাগটি দেখুন।

ডিফল্ট নেটওয়ার্ক হিসেবে সেট করা নেটওয়ার্কটি একটি অ্যাপের জীবদ্দশায় যেকোনো সময় পরিবর্তন হতে পারে। এর একটি সাধারণ উদাহরণ হল ডিভাইসটি একটি পরিচিত, সক্রিয়, মিটারবিহীন এবং মোবাইলের চেয়ে দ্রুততর ওয়াই-ফাই অ্যাক্সেস পয়েন্টের সীমার মধ্যে আসে। ডিভাইসটি এই অ্যাক্সেস পয়েন্টের সাথে সংযোগ স্থাপন করে এবং সমস্ত অ্যাপের জন্য ডিফল্ট নেটওয়ার্কটিকে নতুন ওয়াই-ফাই নেটওয়ার্কে স্যুইচ করে।

যখন একটি নতুন নেটওয়ার্ক ডিফল্ট হয়ে যায়, তখন অ্যাপটি যে কোনও নতুন সংযোগ খোলে সেই নেটওয়ার্কটি এই নেটওয়ার্ক ব্যবহার করে। পরে কিছু সময় পরে, পূর্ববর্তী ডিফল্ট নেটওয়ার্কের সমস্ত অবশিষ্ট সংযোগ জোর করে বন্ধ করে দেওয়া হয়। যদি অ্যাপটির জন্য ডিফল্ট নেটওয়ার্ক কখন পরিবর্তিত হয় তা জানা গুরুত্বপূর্ণ হয়, তাহলে এটি নিম্নরূপ একটি ডিফল্ট নেটওয়ার্ক কলব্যাক নিবন্ধন করে:

কোটলিন

connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network : Network) {
        Log.e(TAG, "The default network is now: " + network)
    }

    override fun onLost(network : Network) {
        Log.e(TAG, "The application no longer has a default network. The last default network was " + network)
    }

    override fun onCapabilitiesChanged(network : Network, networkCapabilities : NetworkCapabilities) {
        Log.e(TAG, "The default network changed capabilities: " + networkCapabilities)
    }

    override fun onLinkPropertiesChanged(network : Network, linkProperties : LinkProperties) {
        Log.e(TAG, "The default network changed link properties: " + linkProperties)
    }
})

জাভা

connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        Log.e(TAG, "The default network is now: " + network);
    }

    @Override
    public void onLost(Network network) {
        Log.e(TAG, "The application no longer has a default network. The last default network was " + network);
    }

    @Override
    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
        Log.e(TAG, "The default network changed capabilities: " + networkCapabilities);
    }

    @Override
    public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
        Log.e(TAG, "The default network changed link properties: " + linkProperties);
    }
});

যখন একটি নতুন নেটওয়ার্ক ডিফল্ট হয়ে যায়, তখন অ্যাপটি নতুন নেটওয়ার্কের জন্য onAvailable(Network) এ একটি কল পায়। সংযোগের পরিবর্তনের সাথে যথাযথভাবে প্রতিক্রিয়া জানাতে onCapabilitiesChanged(Network,NetworkCapabilities) , onLinkPropertiesChanged(Network,LinkProperties) , অথবা উভয়ই প্রয়োগ করুন।

registerDefaultNetworkCallback() এর সাথে নিবন্ধিত কলব্যাকের জন্য, onLost() এর অর্থ হল নেটওয়ার্কটি ডিফল্ট নেটওয়ার্কের স্থিতি হারিয়েছে। এটি সংযোগ বিচ্ছিন্ন হতে পারে।

যদিও আপনি NetworkCapabilities.hasTransport(int) অনুসন্ধান করে ডিফল্ট নেটওয়ার্ক কোন পরিবহন ব্যবহার করছে তা জানতে পারেন, এটি নেটওয়ার্কের ব্যান্ডউইথ বা মিটারডনেসের জন্য একটি খারাপ প্রক্সি। আপনার অ্যাপ ধরে নিতে পারে না যে Wi-Fi সর্বদা মিটারবিহীন থাকে এবং সর্বদা মোবাইলের চেয়ে ভাল ব্যান্ডউইথ সরবরাহ করে।

পরিবর্তে ব্যান্ডউইথ পরিমাপ করতে NetworkCapabilities.getLinkDownstreamBandwidthKbps() এবং মিটারডনেস নির্ধারণ করতে NET_CAPABILITY_NOT_METERED আর্গুমেন্ট সহ NetworkCapabilites.hasCapability(int) ব্যবহার করুন। আরও তথ্যের জন্য, NetworkCapabilities এবং LinkProperties সম্পর্কে বিভাগটি দেখুন।

ডিফল্টরূপে, কলব্যাক পদ্ধতিগুলি আপনার অ্যাপের কানেক্টিভিটি থ্রেডে কল করা হয়, যা ConnectivityManager দ্বারা ব্যবহৃত একটি পৃথক থ্রেড। যদি আপনার কলব্যাকগুলির বাস্তবায়নের জন্য আর কাজ করার প্রয়োজন হয়, তাহলে ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler) ভেরিয়েন্ট ব্যবহার করে একটি পৃথক ওয়ার্কার থ্রেডে কল করুন।

যখন আপনার আর কোনও কাজে না লাগে, তখন কল করে কলটি আনরেজিস্টার করুন। ConnectivityManager.unregisterNetworkCallback(NetworkCallback) কল করুন। আপনার প্রধান কার্যকলাপ onPause() এটি করার জন্য একটি ভাল জায়গা, বিশেষ করে যদি আপনি onResume() এ কলব্যাক নিবন্ধন করেন।

অতিরিক্ত নেটওয়ার্ক (উন্নত ব্যবহারের ক্ষেত্রে)

যদিও বেশিরভাগ অ্যাপের জন্য ডিফল্ট নেটওয়ার্কই একমাত্র প্রাসঙ্গিক নেটওয়ার্ক, কিছু অ্যাপ অন্যান্য উপলব্ধ নেটওয়ার্কগুলিতে আগ্রহী হতে পারে। এইগুলি সম্পর্কে জানতে, অ্যাপগুলি তাদের চাহিদা অনুসারে একটি NetworkRequest তৈরি করে এবং ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback) কল করে।

এই প্রক্রিয়াটি একটি ডিফল্ট নেটওয়ার্ক শোনার মতো। যাইহোক, যদিও যেকোনো সময়ে একটি অ্যাপের জন্য প্রযোজ্য শুধুমাত্র একটি ডিফল্ট নেটওয়ার্ক থাকতে পারে, এই সংস্করণটি আপনার অ্যাপটিকে একই সাথে সমস্ত উপলব্ধ নেটওয়ার্ক দেখতে দেয়, তাই onLost(Network) এ কল করার অর্থ হল নেটওয়ার্কটি চিরতরে সংযোগ বিচ্ছিন্ন হয়ে গেছে, এমন নয় যে এটি আর ডিফল্ট নেই।

অ্যাপটি একটি NetworkRequest তৈরি করে যা ConnectivityManager জানায় যে এটি কোন ধরণের নেটওয়ার্ক শুনতে চায়। নিম্নলিখিত উদাহরণে দেখানো হয়েছে কিভাবে একটি NetworkRequest তৈরি করতে হয় এমন একটি অ্যাপের জন্য যা শুধুমাত্র মিটারবিহীন ইন্টারনেট সংযোগে আগ্রহী:

কোটলিন

val request = NetworkRequest.Builder()
  .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
  .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .build()

connectivityManager.registerNetworkCallback(request, myNetworkCallback)

জাভা

NetworkRequest request = new NetworkRequest.Builder()
  .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
  .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .build();

connectivityManager.registerNetworkCallback(request, myNetworkCallback);

এর অর্থ হল আপনার অ্যাপটি সিস্টেমের যেকোনো মিটারবিহীন নেটওয়ার্ক সম্পর্কিত সমস্ত পরিবর্তন সম্পর্কে শুনতে পাবে।

ডিফল্ট নেটওয়ার্ক কলব্যাকের ক্ষেত্রে, registerNetworkCallback(NetworkRequest, NetworkCallback, Handler) এর একটি সংস্করণ রয়েছে যা একটি Handler গ্রহণ করে যাতে এটি আপনার অ্যাপের Connectivity থ্রেড লোড না করে।

কলব্যাক আর প্রাসঙ্গিক না হলে ConnectivityManager.unregisterNetworkCallback(NetworkCallback) এ কল করুন। একটি অ্যাপ একই সাথে একাধিক নেটওয়ার্ক কলব্যাক নিবন্ধন করতে পারে।

সুবিধার জন্য, NetworkRequest অবজেক্টে বেশিরভাগ অ্যাপের প্রয়োজনীয় সাধারণ ক্ষমতা রয়েছে, যার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

আপনার অ্যাপ লেখার সময়, ডিফল্টগুলি পরীক্ষা করে দেখুন যে সেগুলি আপনার ব্যবহারের ক্ষেত্রে মেলে কিনা, এবং যদি আপনি চান যে আপনার অ্যাপকে এমন নেটওয়ার্ক সম্পর্কে অবহিত করা হোক যেখানে এই ক্ষমতাগুলি নেই। অন্যদিকে, আপনার অ্যাপ যে নেটওয়ার্কগুলির সাথে ইন্টারঅ্যাক্ট করে না সেগুলিতে কোনও সংযোগ পরিবর্তনের জন্য বলা এড়াতে ক্ষমতাগুলি যুক্ত করুন।

উদাহরণস্বরূপ, যদি আপনার অ্যাপের MMS বার্তা পাঠানোর প্রয়োজন হয়, তাহলে NetworkRequestNET_CAPABILITY_MMS যোগ করুন যাতে MMS বার্তা পাঠাতে পারে না এমন সমস্ত নেটওয়ার্ক সম্পর্কে আপনাকে জানানো না হয়। যদি আপনার অ্যাপটি শুধুমাত্র P2P Wi-Fi সংযোগে আগ্রহী হয় তবে TRANSPORT_WIFI_AWARE যোগ করুন। ইন্টারনেটে সার্ভারের মাধ্যমে ডেটা স্থানান্তর করার ক্ষমতা সম্পর্কে আগ্রহী হলে NET_CAPABILITY_INTERNET এবং NET_CAPABILITY_VALIDATED সহায়ক।

নমুনা কলব্যাক ক্রম

এই বিভাগে একটি অ্যাপ যদি মোবাইল সংযোগ আছে এমন ডিভাইসে ডিফল্ট কলব্যাক এবং নিয়মিত কলব্যাক উভয়ই নিবন্ধন করে তাহলে কী ধরণের কলব্যাক পেতে পারে তা বর্ণনা করা হয়েছে। এই উদাহরণে, ডিভাইসটি একটি ভাল ওয়াই-ফাই অ্যাক্সেস পয়েন্টের সাথে সংযোগ স্থাপন করে, তারপর এটি থেকে সংযোগ বিচ্ছিন্ন করে। উদাহরণটি আরও ধরে নেয় যে ডিভাইসটিতে মোবাইল ডেটা সর্বদা চালু থাকা সেটিং সক্ষম করা আছে।

সময়রেখাটি নিম্নরূপ:

  1. যখন অ্যাপটি registerNetworkCallback() কল করে, তখন কলব্যাকটি তাৎক্ষণিকভাবে onAvailable() , onNetworkCapabilitiesChanged() এবং onLinkPropertiesChanged() থেকে মোবাইল নেটওয়ার্কের জন্য কল গ্রহণ করে, কারণ শুধুমাত্র সেই নেটওয়ার্কটিই উপলব্ধ। যদি অন্য নেটওয়ার্ক উপলব্ধ থাকে, তাহলে অ্যাপটি অন্য নেটওয়ার্কের জন্যও কলব্যাক গ্রহণ করে।

    রেজিস্টার নেটওয়ার্ক কলব্যাক ইভেন্ট এবং ইভেন্টের ফলে ট্রিগার হওয়া কলব্যাকগুলি দেখানো স্টেট ডায়াগ্রাম
    চিত্র ১. registerNetworkCallback() কল করার পর অ্যাপের অবস্থা।

  2. তারপর, অ্যাপটি registerDefaultNetworkCallback() কল করে। ডিফল্ট নেটওয়ার্ক কলব্যাক মোবাইল নেটওয়ার্কের জন্য onAvailable() , onNetworkCapabilitiesChanged() এবং onLinkPropertiesChanged() এ কল গ্রহণ শুরু করে, কারণ মোবাইল নেটওয়ার্কটি ডিফল্ট নেটওয়ার্ক। যদি অন্য একটি, অ-ডিফল্ট নেটওয়ার্ক চালু থাকে, তাহলে অ্যাপটি অ-ডিফল্ট নেটওয়ার্কের জন্য কল গ্রহণ করতে পারবে না।

    ডিফল্ট নেটওয়ার্ক কলব্যাক ইভেন্ট এবং ইভেন্ট দ্বারা ট্রিগার হওয়া কলব্যাকগুলি নিবন্ধন করার স্টেট ডায়াগ্রাম দেখানো হচ্ছে
    চিত্র ২. একটি ডিফল্ট নেটওয়ার্ক নিবন্ধনের পরে অ্যাপের অবস্থা।

  3. পরে, ডিভাইসটি একটি (মিটারবিহীন) ওয়াই-ফাই নেটওয়ার্কের সাথে সংযোগ স্থাপন করে। নিয়মিত নেটওয়ার্ক কলব্যাক ওয়াই-ফাই নেটওয়ার্কের জন্য onAvailable() , onNetworkCapabilitiesChanged() এবং onLinkPropertiesChanged() এ কল গ্রহণ করে।

    অ্যাপটি একটি নতুন নেটওয়ার্কের সাথে সংযোগ স্থাপন করলে কলব্যাকগুলি কীভাবে সক্রিয় হয় তা দেখানো স্টেট ডায়াগ্রাম
    চিত্র ৩. একটি মিটারবিহীন ওয়াই-ফাই নেটওয়ার্কের সাথে সংযোগ স্থাপনের পরে অ্যাপের অবস্থা।

  4. এই মুহুর্তে, ওয়াই-ফাই নেটওয়ার্ক যাচাই করতে কিছুটা সময় লাগতে পারে। এই ক্ষেত্রে, নিয়মিত নেটওয়ার্ক কলব্যাকের জন্য onNetworkCapabilitiesChanged() কলগুলিতে NET_CAPABILITY_VALIDATED ক্ষমতা অন্তর্ভুক্ত থাকে না। কিছুক্ষণ পরে, এটি onNetworkCapabilitiesChanged() এ একটি কল পায়, যেখানে নতুন ক্ষমতাগুলির মধ্যে NET_CAPABILITY_VALIDATED অন্তর্ভুক্ত থাকে। বেশিরভাগ ক্ষেত্রে, যাচাইকরণ খুব দ্রুত হয়।

    যখন Wi-Fi নেটওয়ার্ক যাচাই করা হয়, তখন সিস্টেমটি মোবাইল নেটওয়ার্কের চেয়ে এটিকে পছন্দ করে, মূলত কারণ এটি মিটারবিহীন। Wi-Fi নেটওয়ার্ক ডিফল্ট নেটওয়ার্ক হয়ে যায়, তাই ডিফল্ট নেটওয়ার্ক কলব্যাক Wi-Fi নেটওয়ার্কের জন্য onAvailable() , onNetworkCapabilitiesChanged() এবং onLinkPropertiesChanged() এ একটি কল গ্রহণ করে। মোবাইল নেটওয়ার্ক ব্যাকগ্রাউন্ডে চলে যায় এবং নিয়মিত নেটওয়ার্ক কলব্যাক মোবাইল নেটওয়ার্কের জন্য onLosing() এ একটি কল গ্রহণ করে।

    যেহেতু এই উদাহরণে ধরে নেওয়া হয়েছে যে এই ডিভাইসের জন্য মোবাইল ডেটা সর্বদা চালু থাকে, তাই মোবাইল নেটওয়ার্ক কখনই সংযোগ বিচ্ছিন্ন হয় না। যদি সেটিংটি বন্ধ থাকে, তাহলে কিছুক্ষণ পরে মোবাইল নেটওয়ার্ক সংযোগ বিচ্ছিন্ন হয়ে যায় এবং নিয়মিত নেটওয়ার্ক কলব্যাক onLost() এ একটি কল গ্রহণ করে।

    একটি Wi-Fi নেটওয়ার্ক সংযোগ যাচাই করার সময় কলব্যাকগুলি ট্রিগার করা দেখানো স্টেট ডায়াগ্রাম
    চিত্র ৪. ওয়াই-ফাই নেটওয়ার্ক যাচাই করার পর অ্যাপের অবস্থা।

  5. পরেও, ডিভাইসটি হঠাৎ করে Wi-Fi থেকে সংযোগ বিচ্ছিন্ন হয়ে যায়, কারণ এটি রেঞ্জের বাইরে চলে যায়। Wi-Fi সংযোগ বিচ্ছিন্ন হওয়ার কারণে, নিয়মিত নেটওয়ার্ক কলব্যাক Wi-Fi এর জন্য onLost() এ একটি কল গ্রহণ করে। যেহেতু মোবাইল হল নতুন ডিফল্ট নেটওয়ার্ক, ডিফল্ট নেটওয়ার্ক কলব্যাক মোবাইল নেটওয়ার্কের জন্য onAvailable() , onNetworkCapabilitiesChanged() এবং onLinkPropertiesChanged() এ কল গ্রহণ করে।

    ওয়াই-ফাই নেটওয়ার্ক সংযোগ বিচ্ছিন্ন হলে কলব্যাকগুলি কীভাবে শুরু হয় তা দেখানো স্টেট ডায়াগ্রাম
    চিত্র ৫। ওয়াই-ফাই নেটওয়ার্ক থেকে সংযোগ বিচ্ছিন্ন হওয়ার পর অ্যাপের অবস্থা।

যদি মোবাইল ডেটা সর্বদা চালু থাকা সেটিংটি বন্ধ থাকে, তাহলে Wi-Fi সংযোগ বিচ্ছিন্ন হয়ে গেলে ডিভাইসটি একটি মোবাইল নেটওয়ার্কের সাথে পুনরায় সংযোগ স্থাপনের চেষ্টা করে। চিত্রটি একই রকম, তবে onAvailable() কলগুলির জন্য একটি সংক্ষিপ্ত অতিরিক্ত বিলম্বের সাথে, এবং নিয়মিত নেটওয়ার্ক কলব্যাকটি onAvailable() , onNetworkCapabilitiesChanged() এবং onLinkPropertiesChanged() এ কলগুলি গ্রহণ করে কারণ মোবাইল উপলব্ধ হয়ে যায়।

ডেটা স্থানান্তরের জন্য নেটওয়ার্ক ব্যবহারের উপর বিধিনিষেধ

নেটওয়ার্ক কলব্যাকের মাধ্যমে নেটওয়ার্ক দেখতে পাওয়ার অর্থ এই নয় যে আপনার অ্যাপ ডেটা ট্রান্সফারের জন্য নেটওয়ার্ক ব্যবহার করতে পারবে। কিছু নেটওয়ার্ক ইন্টারনেট সংযোগ প্রদান করে না এবং কিছু নেটওয়ার্ক শুধুমাত্র বিশেষায়িত অ্যাপের মধ্যে সীমাবদ্ধ থাকতে পারে। ইন্টারনেট সংযোগ পরীক্ষা করতে, NET_CAPABILITY_INTERNET এবং NET_CAPABILITY_VALIDATED দেখুন।

ব্যাকগ্রাউন্ড নেটওয়ার্ক ব্যবহারের জন্যও অনুমতি যাচাই করতে হবে। যদি আপনার অ্যাপটি ব্যাকগ্রাউন্ড নেটওয়ার্ক ব্যবহার করতে চায়, তাহলে তার CHANGE_NETWORK_STATE অনুমতি প্রয়োজন।

এই অনুমতি সহ অ্যাপগুলি সিস্টেমকে এমন একটি নেটওয়ার্ক চালু করার চেষ্টা করতে দেয় যা চালু নেই, যেমন ডিভাইসটি যখন Wi-Fi নেটওয়ার্কের সাথে সংযুক্ত থাকে তখন মোবাইল নেটওয়ার্ক। এই ধরনের অ্যাপটি ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback) কে একটি NetworkCallback কল করে যা নেটওয়ার্ক চালু করার সময় কল করা হয়।