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

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

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

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

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

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

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

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

একটি Android-চালিত ডিভাইস একই সময়ে অনেক সংযোগ বজায় রাখতে পারে। বর্তমান নেটওয়ার্ক অবস্থা সম্পর্কে তথ্য পেতে, প্রথমে 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 অবজেক্ট নেটওয়ার্ক ট্রান্সপোর্ট এবং তাদের ক্ষমতা সম্পর্কে তথ্য এনক্যাপসুলেট করে।

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

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

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

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

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

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

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

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

  • 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 এর সাথে, সিস্টেম ডিফল্ট নেটওয়ার্ক ব্যবহার করে এই অনুরোধটি পূরণ করে। অ্যাপগুলি অন্যান্য নেটওয়ার্কেও ট্রাফিক পাঠাতে পারে। আরও তথ্যের জন্য, অতিরিক্ত নেটওয়ার্ক সম্পর্কে বিভাগটি দেখুন।

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

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

কোটলিন

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) এ কল করার অর্থ হল নেটওয়ার্কটি ভালোর জন্য সংযোগ বিচ্ছিন্ন হয়ে গেছে, তা নয় এটা আর ডিফল্ট না.

অ্যাপটি কোন ধরনের নেটওয়ার্ক শুনতে চায় তা ConnectivityManager জানাতে একটি NetworkRequest তৈরি করে। নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে একটি অ্যাপের জন্য একটি 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 বার্তা পাঠানোর প্রয়োজন হয়, NetworkRequest NET_CAPABILITY_MMS যোগ করুন যাতে MMS বার্তা পাঠানো যায় না এমন সমস্ত নেটওয়ার্ক সম্পর্কে বলা না হয়। আপনার অ্যাপ শুধুমাত্র P2P Wi-Fi সংযোগে আগ্রহী হলে TRANSPORT_WIFI_AWARE যোগ করুন। NET_CAPABILITY_INTERNET এবং NET_CAPABILITY_VALIDATED সহায়ক যদি আপনি ইন্টারনেটে একটি সার্ভারের সাথে ডেটা স্থানান্তর করার ক্ষমতাতে আগ্রহী হন৷

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

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

টাইমলাইন নিম্নরূপ:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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