এই পাঠে বর্ণনা করা হয়েছে যে কীভাবে এমন অ্যাপ্লিকেশন লিখতে হয় যা নেটওয়ার্ক রিসোর্স ব্যবহারের উপর সূক্ষ্ম নিয়ন্ত্রণ রাখে। আপনার অ্যাপ্লিকেশন যদি অনেক নেটওয়ার্ক অপারেশন করে, তাহলে আপনাকে ব্যবহারকারীর সেটিংস প্রদান করতে হবে যা ব্যবহারকারীদের আপনার অ্যাপের ডেটা ব্যবহারের অভ্যাস নিয়ন্ত্রণ করতে দেয়, যেমন আপনার অ্যাপ কত ঘন ঘন ডেটা সিঙ্ক করে, শুধুমাত্র ওয়াই-ফাইতে থাকাকালীন আপলোড/ডাউনলোড করতে হবে কিনা, রোমিং করার সময় ডেটা ব্যবহার করতে হবে কিনা ইত্যাদি। এইসব কন্ট্রোল উপলভ্য থাকলে, ব্যবহারকারীরা ডেটা ব্যবহারের সীমায় পৌঁছে গেলেও আপনার অ্যাপের ব্যাকগ্রাউন্ড ডেটা অ্যাক্সেস বন্ধ করে দেওয়ার সম্ভাবনা অনেক কম থাকে, কারণ তারা আপনার অ্যাপ কতটা ডেটা ব্যবহার করবে তা সঠিকভাবে নিয়ন্ত্রণ করতে পারে।
আপনার অ্যাপের নেটওয়ার্ক ব্যবহার সম্পর্কে আরও জানতে, যার মধ্যে একটি নির্দিষ্ট সময়সীমার মধ্যে নেটওয়ার্ক কানেকশনের সংখ্যা এবং প্রকার অন্তর্ভুক্ত, ওয়েব অ্যাপ এবং নেটওয়ার্ক প্রোফাইলারের সাহায্যে নেটওয়ার্ক ট্রাফিক পরীক্ষা করুন নিবন্ধটি পড়ুন। ডাউনলোড ও নেটওয়ার্ক কানেকশনের কারণে ব্যাটারির আয়ুর উপর প্রভাব কমানোর জন্য কীভাবে অ্যাপ লিখতে হয় সেই বিষয়ে সাধারণ নির্দেশিকা পেতে, ব্যাটারির আয়ু অপ্টিমাইজ করুন এবং ব্যাটারি শেষ না করে ডেটা ট্রান্সফার করুন দেখুন।
এছাড়াও, আপনি NetworkConnect স্যাম্পেল চেক করে দেখতে পারেন।
ডিভাইসের নেটওয়ার্ক কানেকশন চেক করা
একটি ডিভাইসে বিভিন্ন ধরনের নেটওয়ার্ক কানেকশন থাকতে পারে। এই পাঠে ওয়াই-ফাই বা মোবাইল নেটওয়ার্ক কানেকশন ব্যবহার করার উপর
ফোকাস করা হয়েছে। সম্ভাব্য নেটওয়ার্কের ধরনের সম্পূর্ণ তালিকা দেখতে, ConnectivityManager দেখুন।
ওয়াই-ফাই সাধারণত দ্রুত কাজ করে। এছাড়াও, মোবাইল ডেটা প্রায়ই মিটার করা হয়, যা ব্যয়বহুল হতে পারে। অ্যাপের ক্ষেত্রে একটি সাধারণ স্ট্র্যাটেজি হল, ওয়াই-ফাই নেটওয়ার্ক উপলভ্য থাকলে তবেই বড় ডেটা ফেচ করা।
নেটওয়ার্ক অপারেশন করার আগে, নেটওয়ার্ক কানেক্টিভিটির স্ট্যাটাস চেক করে নেওয়া ভালো। অন্যান্য বিষয়ের মধ্যে, এটি আপনার অ্যাপকে অনিচ্ছাকৃতভাবে ভুল রেডিও ব্যবহার করা থেকে আটকাতে পারে। নেটওয়ার্ক কানেকশন উপলভ্য না থাকলে, আপনার অ্যাপ্লিকেশনকে সুন্দরভাবে উত্তর দিতে হবে। নেটওয়ার্ক কানেকশন চেক করতে, আপনি সাধারণত নিম্নলিখিত ক্লাস ব্যবহার করেন:
ConnectivityManager: নেটওয়ার্ক কানেক্টিভিটির স্ট্যাটাস সম্পর্কে প্রশ্নের উত্তর দেয়। এছাড়াও, নেটওয়ার্ক কানেক্টিভিটি পরিবর্তন হলে এটি অ্যাপ্লিকেশনকে বিজ্ঞপ্তি পাঠায়।NetworkInfo: প্রদত্ত ধরনের নেটওয়ার্ক ইন্টারফেসের স্ট্যাটাস বর্ণনা করে (বর্তমানে মোবাইল বা ওয়াই-ফাই)।
এই কোড স্নিপেট ওয়াই-ফাই ও মোবাইলের জন্য নেটওয়ার্ক কানেক্টিভিটি টেস্ট করে। এটি নির্ধারণ করে এই নেটওয়ার্ক ইন্টারফেস উপলভ্য আছে কিনা (অর্থাৎ, নেটওয়ার্ক কানেক্টিভিটি সম্ভব কিনা) এবং/অথবা কানেক্টেড কিনা (অর্থাৎ, নেটওয়ার্ক কানেক্টিভিটি আছে কিনা এবং সকেট তৈরি করে ডেটা পাস করা সম্ভব কিনা):
Kotlin
private const val DEBUG_TAG = "NetworkStatusExample" ... val connMgr = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager var isWifiConn: Boolean = false var isMobileConn: Boolean = false connMgr.allNetworks.forEach { network -> connMgr.getNetworkInfo(network).apply { if (type == ConnectivityManager.TYPE_WIFI) { isWifiConn = isWifiConn or isConnected } if (type == ConnectivityManager.TYPE_MOBILE) { isMobileConn = isMobileConn or isConnected } } } Log.d(DEBUG_TAG, "Wifi connected: $isWifiConn") Log.d(DEBUG_TAG, "Mobile connected: $isMobileConn")
জাভা
private static final String DEBUG_TAG = "NetworkStatusExample"; ... ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); boolean isWifiConn = false; boolean isMobileConn = false; for (Network network : connMgr.getAllNetworks()) { NetworkInfo networkInfo = connMgr.getNetworkInfo(network); if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { isWifiConn |= networkInfo.isConnected(); } if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) { isMobileConn |= networkInfo.isConnected(); } } Log.d(DEBUG_TAG, "Wifi connected: " + isWifiConn); Log.d(DEBUG_TAG, "Mobile connected: " + isMobileConn);
মনে রাখবেন যে কোনও নেটওয়ার্ক "উপলভ্য" কিনা তার উপর ভিত্তি করে সিদ্ধান্ত নেওয়া উচিত নয়। নেটওয়ার্ক অপারেশন
করার আগে
isConnected() আপনাকে সবসময় চেক করতে হবে,
কারণ isConnected()-এর মাধ্যমে দুর্বল মোবাইল নেটওয়ার্ক, বিমান মোড এবং
সীমাবদ্ধ ব্যাকগ্রাউন্ড ডেটার মতো কেস ম্যানেজ করা হয়।
কোনও নেটওয়ার্ক ইন্টারফেস উপলভ্য আছে কিনা তা চেক করার আরও সংক্ষিপ্ত উপায় নিচে
দেওয়া হল। getActiveNetworkInfo()
পদ্ধতিটি NetworkInfo ইনস্ট্যান্স
রিটার্ন করে যা প্রথম কানেক্ট করা নেটওয়ার্ক ইন্টারফেসকে দেখায়, অথবা null যদি
কোনও ইন্টারফেস কানেক্ট করা না থাকে (অর্থাৎ ইন্টারনেট কানেকশন
উপলভ্য নেই):
Kotlin
fun isOnline(): Boolean { val connMgr = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo: NetworkInfo? = connMgr.activeNetworkInfo return networkInfo?.isConnected == true }
জাভা
public boolean isOnline() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); return (networkInfo != null && networkInfo.isConnected()); }
আরও সূক্ষ্ম-গ্রেনড স্টেট কোয়েরি করতে আপনি
NetworkInfo.DetailedState ব্যবহার করতে পারেন,
তবে এটি খুব কমই প্রয়োজন হয়।
নেটওয়ার্কের ব্যবহার ম্যানেজ করা
আপনি একটি পছন্দ অ্যাক্টিভিটি প্রয়োগ করতে পারেন যা ব্যবহারকারীদের আপনার অ্যাপের নেটওয়ার্ক রিসোর্স ব্যবহারের উপর স্পষ্ট নিয়ন্ত্রণ দেয়। যেমন:
- আপনি হয়ত ব্যবহারকারীদের শুধুমাত্র তখনই ভিডিও আপলোড করার অনুমতি দিতে পারেন যখন ডিভাইসটি ওয়াই-ফাই নেটওয়ার্কের সাথে কানেক্ট করা থাকে।
- নেটওয়ার্কের উপলভ্যতা, সময়ের ব্যবধান ইত্যাদির মতো নির্দিষ্ট মাপকাঠির উপর নির্ভর করে আপনি সিঙ্ক করতে (বা নাও করতে) পারেন।
নেটওয়ার্ক অ্যাক্সেস ও নেটওয়ার্ক ব্যবহার ম্যানেজ করে এমন অ্যাপ তৈরি করতে, আপনার ম্যানিফেস্টে সঠিক অনুমতি ও ইনটেন্ট ফিল্টার থাকতে হবে।
- এই বিভাগের পরে উদ্ধৃত ম্যানিফেস্টে নিম্নলিখিত অনুমতিগুলি
অন্তর্ভুক্ত আছে:
android.permission.INTERNET— অ্যাপ্লিকেশনকে নেটওয়ার্ক সকেট খোলার অনুমতি দেয়।android.permission.ACCESS_NETWORK_STATE— নেটওয়ার্ক সম্পর্কে তথ্য অ্যাক্সেস করার জন্য অ্যাপ্লিকেশনকে অনুমতি দেয়।
- আপনি
ACTION_MANAGE_NETWORK_USAGEঅ্যাকশনের জন্য ইনটেন্ট ফিল্টার ঘোষণা করতে পারেন যাতে বোঝা যায় যে আপনার অ্যাপ্লিকেশন এমন একটি অ্যাক্টিভিটি নির্ধারণ করে যা ডেটা ব্যবহার নিয়ন্ত্রণ করার বিকল্প অফার করে।ACTION_MANAGE_NETWORK_USAGEনির্দিষ্ট অ্যাপ্লিকেশনের নেটওয়ার্ক ডেটা ব্যবহার ম্যানেজ করার সেটিংস দেখায়। আপনার অ্যাপে এমন কোনও সেটিংস অ্যাক্টিভিটি থাকলে যা ব্যবহারকারীদের নেটওয়ার্ক ব্যবহার নিয়ন্ত্রণ করতে দেয়, তাহলে আপনাকে সেই অ্যাক্টিভিটির জন্য এই ইনটেন্ট ফিল্টার ঘোষণা করতে হবে।
স্যাম্পেল অ্যাপ্লিকেশনে, এই অ্যাকশনটি
SettingsActivity ক্লাস দ্বারা ম্যানেজ করা হয়, যা ব্যবহারকারীদের কখন ফিড ডাউনলোড করতে হবে তা সিদ্ধান্ত নিতে দেওয়ার জন্য একটি পছন্দ UI দেখায়।
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.networkusage" ...> <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="14" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application ...> ... <activity android:label="SettingsActivity" android:name=".SettingsActivity"> <intent-filter> <action android:name="android.intent.action.MANAGE_NETWORK_USAGE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest>
যেসব অ্যাপ ব্যবহারকারীর সংবেদনশীল ডেটা নিয়ে কাজ করে এবং Android 11 ও তার পরবর্তী ভার্সনকে টার্গেট করে, সেগুলি প্রসেস-প্রতি নেটওয়ার্ক অ্যাক্সেস দিতে পারে। কোন কোন প্রসেস নেটওয়ার্ক অ্যাক্সেস করতে পারবে তা স্পষ্টভাবে উল্লেখ করে, আপনি সেইসব কোড আলাদা করে দেন যেগুলির ডেটা আপলোড করার প্রয়োজন নেই।
আপনার অ্যাপ যাতে ভুলবশত ডেটা আপলোড না করে, তার কোনও গ্যারান্টি না থাকলেও, এটি আপনার অ্যাপে এমন কোনও বাগ থাকার সম্ভাবনা কম করে, যার ফলে ডেটা ফাঁস হতে পারে।
নিম্নলিখিতটি একটি ম্যানিফেস্ট ফাইলের নমুনা দেখায় যা প্রতি-প্রসেস ফাংশনালিটি ব্যবহার করে:
<processes>
<process />
<deny-permission android:name="android.permission.INTERNET" />
<process android:process=":withoutnet1" />
<process android:process="com.android.cts.useprocess.withnet1">
<allow-permission android:name="android.permission.INTERNET" />
</process>
<allow-permission android:name="android.permission.INTERNET" />
<process android:process=":withoutnet2">
<deny-permission android:name="android.permission.INTERNET" />
</process>
<process android:process="com.android.cts.useprocess.withnet2" />
</processes>
পছন্দ সংক্রান্ত অ্যাক্টিভিটি প্রয়োগ করা
এই বিষয়ের শুরুতে ম্যানিফেস্ট উদ্ধৃতিতে যেমন দেখানো হয়েছে, স্যাম্পেল অ্যাপের
অ্যাক্টিভিটি SettingsActivity-এ ACTION_MANAGE_NETWORK_USAGE অ্যাকশনের জন্য
ইনটেন্ট ফিল্টার আছে। SettingsActivity হল
PreferenceActivity-এর সাবক্লাস। এটি
পছন্দের স্ক্রিন (ছবি ১-এ দেখানো হয়েছে) দেখায় যা ব্যবহারকারীকে নিম্নলিখিত বিষয়গুলি নির্দিষ্ট করতে
দেয়:
- প্রতিটি XML ফিড এন্ট্রির জন্য সারসংক্ষেপ দেখানো হবে নাকি প্রতিটি এন্ট্রির জন্য শুধু একটি লিঙ্ক দেখানো হবে।
- কোনও নেটওয়ার্ক কানেকশন উপলভ্য থাকলে অথবা শুধুমাত্র ওয়াই-ফাই উপলভ্য থাকলে XML ফিড ডাউনলোড করা হবে কিনা।

ছবি ১. পছন্দ সংক্রান্ত অ্যাক্টিভিটি।
SettingsActivity এখানে৷ মনে রাখবেন যে এটি
OnSharedPreferenceChangeListener প্রয়োগ করে।
ব্যবহারকারী কোনও পছন্দ পরিবর্তন করলে, এটি
onSharedPreferenceChanged() ফায়ার করে,
যা refreshDisplay-কে সত্য হিসেবে সেট করে। ব্যবহারকারী মূল অ্যাক্টিভিটিতে ফিরে এলে,
এটি ডিসপ্লে রিফ্রেশ করে:
Kotlin
class SettingsActivity : PreferenceActivity(), OnSharedPreferenceChangeListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Loads the XML preferences file addPreferencesFromResource(R.xml.preferences) } override fun onResume() { super.onResume() // Registers a listener whenever a key changes preferenceScreen?.sharedPreferences?.registerOnSharedPreferenceChangeListener(this) } override fun onPause() { super.onPause() // Unregisters the listener set in onResume(). // It's best practice to unregister listeners when your app isn't using them to cut down on // unnecessary system overhead. You do this in onPause(). preferenceScreen?.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this) } // When the user changes the preferences selection, // onSharedPreferenceChanged() restarts the main activity as a new // task. Sets the refreshDisplay flag to "true" to indicate that // the main activity should update its display. // The main activity queries the PreferenceManager to get the latest settings. override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { // Sets refreshDisplay to true so that when the user returns to the main // activity, the display refreshes to reflect the new settings. NetworkActivity.refreshDisplay = true } }
জাভা
public class SettingsActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Loads the XML preferences file addPreferencesFromResource(R.xml.preferences); } @Override protected void onResume() { super.onResume(); // Registers a listener whenever a key changes getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override protected void onPause() { super.onPause(); // Unregisters the listener set in onResume(). // It's best practice to unregister listeners when your app isn't using them to cut down on // unnecessary system overhead. You do this in onPause(). getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } // When the user changes the preferences selection, // onSharedPreferenceChanged() restarts the main activity as a new // task. Sets the refreshDisplay flag to "true" to indicate that // the main activity should update its display. // The main activity queries the PreferenceManager to get the latest settings. @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { // Sets refreshDisplay to true so that when the user returns to the main // activity, the display refreshes to reflect the new settings. NetworkActivity.refreshDisplay = true; } }
পছন্দ পরিবর্তন সংক্রান্ত অনুরোধের উত্তর দিন
ব্যবহারকারী সেটিংস স্ক্রিনে পছন্দ পরিবর্তন করলে, সাধারণত অ্যাপের আচরণে
তার প্রভাব পড়ে। এই স্নিপেটে, অ্যাপটি onStart()-এ
পছন্দের সেটিংস চেক করে। সেটিং ও ডিভাইসের নেটওয়ার্ক কানেকশনের মধ্যে মিল থাকলে (যেমন, সেটিং "Wi-Fi" হলে এবং ডিভাইসে ওয়াই-ফাই কানেকশন থাকলে), অ্যাপটি ফিড ডাউনলোড করে এবং ডিসপ্লে রিফ্রেশ করে।
Kotlin
class NetworkActivity : Activity() { // The BroadcastReceiver that tracks network connectivity changes. private lateinit var receiver: NetworkReceiver public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Registers BroadcastReceiver to track network connection changes. val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) receiver = NetworkReceiver() this.registerReceiver(receiver, filter) } public override fun onDestroy() { super.onDestroy() // Unregisters BroadcastReceiver when app is destroyed. this.unregisterReceiver(receiver) } // Refreshes the display if the network connection and the // pref settings allow it. public override fun onStart() { super.onStart() // Gets the user's network preference settings val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this) // Retrieves a string value for the preferences. The second parameter // is the default value to use if a preference value is not found. sPref = sharedPrefs.getString("listPref", "Wi-Fi") updateConnectedFlags() if (refreshDisplay) { loadPage() } } // Checks the network connection and sets the wifiConnected and mobileConnected // variables accordingly. fun updateConnectedFlags() { val connMgr = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeInfo: NetworkInfo? = connMgr.activeNetworkInfo if (activeInfo?.isConnected == true) { wifiConnected = activeInfo.type == ConnectivityManager.TYPE_WIFI mobileConnected = activeInfo.type == ConnectivityManager.TYPE_MOBILE } else { wifiConnected = false mobileConnected = false } } // Uses AsyncTask subclass to download the XML feed from stackoverflow.com. fun loadPage() { if (sPref == ANY && (wifiConnected || mobileConnected) || sPref == WIFI && wifiConnected) { // AsyncTask subclass DownloadXmlTask().execute(URL) } else { showErrorPage() } } companion object { const val WIFI = "Wi-Fi" const val ANY = "Any" const val SO_URL = "http://stackoverflow.com/feeds/tag?tagnames=android&sort;=newest" // Whether there is a Wi-Fi connection. private var wifiConnected = false // Whether there is a mobile connection. private var mobileConnected = false // Whether the display should be refreshed. var refreshDisplay = true // The user's current network preference setting. var sPref: String? = null } ... }
জাভা
public class NetworkActivity extends Activity { public static final String WIFI = "Wi-Fi"; public static final String ANY = "Any"; private static final String URL = "http://stackoverflow.com/feeds/tag?tagnames=android&sort;=newest"; // Whether there is a Wi-Fi connection. private static boolean wifiConnected = false; // Whether there is a mobile connection. private static boolean mobileConnected = false; // Whether the display should be refreshed. public static boolean refreshDisplay = true; // The user's current network preference setting. public static String sPref = null; // The BroadcastReceiver that tracks network connectivity changes. private NetworkReceiver receiver = new NetworkReceiver(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Registers BroadcastReceiver to track network connection changes. IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); receiver = new NetworkReceiver(); this.registerReceiver(receiver, filter); } @Override public void onDestroy() { super.onDestroy(); // Unregisters BroadcastReceiver when app is destroyed. if (receiver != null) { this.unregisterReceiver(receiver); } } // Refreshes the display if the network connection and the // pref settings allow it. @Override public void onStart () { super.onStart(); // Gets the user's network preference settings SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); // Retrieves a string value for the preferences. The second parameter // is the default value to use if a preference value is not found. sPref = sharedPrefs.getString("listPref", "Wi-Fi"); updateConnectedFlags(); if(refreshDisplay){ loadPage(); } } // Checks the network connection and sets the wifiConnected and mobileConnected // variables accordingly. public void updateConnectedFlags() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeInfo = connMgr.getActiveNetworkInfo(); if (activeInfo != null && activeInfo.isConnected()) { wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI; mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE; } else { wifiConnected = false; mobileConnected = false; } } // Uses AsyncTask subclass to download the XML feed from stackoverflow.com. public void loadPage() { if (((sPref.equals(ANY)) && (wifiConnected || mobileConnected)) || ((sPref.equals(WIFI)) && (wifiConnected))) { // AsyncTask subclass new DownloadXmlTask().execute(URL); } else { showErrorPage(); } } ... }
কানেকশনে পরিবর্তন শনাক্ত করুন
পাজলের শেষ অংশটি হল
BroadcastReceiver সাবক্লাস,
NetworkReceiver। ডিভাইসের নেটওয়ার্ক কানেকশন পরিবর্তন হলে,
NetworkReceiver অ্যাকশনটি ইন্টারসেপ্ট করে
CONNECTIVITY_ACTION,
নেটওয়ার্ক কানেকশন স্ট্যাটাস কী তা নির্ধারণ করে এবং সেই অনুযায়ী
wifiConnected ও mobileConnected ফ্ল্যাগ ট্রু/ফলস হিসেবে সেট করে। এর ফলে,
পরের বার ব্যবহারকারী অ্যাপে ফিরে এলে, অ্যাপটি শুধুমাত্র লেটেস্ট ফিড ডাউনলোড করবে এবং
NetworkActivity.refreshDisplay-এর মান true-এ সেট করা থাকলে ডিসপ্লে আপডেট করবে।
অপ্রয়োজনে কল করা হয় এমন BroadcastReceiver সেট-আপ করলে সিস্টেম রিসোর্স
শেষ হয়ে যেতে পারে। স্যাম্পেল অ্যাপ্লিকেশন BroadcastReceiver
NetworkReceiver-কে
onCreate()-এ রেজিস্টার করে,
এবং এটি
onDestroy()-এ এটিকে আনরেজিস্টার করে। ম্যানিফেস্টে <receiver> ঘোষণা করার চেয়ে এটি
আরও হালকা। আপনি ম্যানিফেস্টে <receiver> ঘোষণা করলে, এটি যেকোনও সময় আপনার অ্যাপ চালু করতে পারে, এমনকি আপনি কয়েক সপ্তাহ ধরে এটি না চালালেও। প্রধান অ্যাক্টিভিটির মধ্যে
NetworkReceiver রেজিস্টার ও আনরেজিস্টার করার মাধ্যমে, আপনি নিশ্চিত করেন যে ব্যবহারকারী অ্যাপ থেকে বেরিয়ে যাওয়ার পরে অ্যাপটি আর
চালু হবে না। আপনি যদি ম্যানিফেস্টে
<receiver> ঘোষণা করেন এবং আপনি ঠিক জানেন যে এটি আপনার কোথায় প্রয়োজন, তাহলে আপনি
setComponentEnabledSetting()
ব্যবহার করে উপযুক্তভাবে এটি চালু এবং বন্ধ করতে পারেন।
এখানে NetworkReceiver:
Kotlin
class NetworkReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val conn = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo: NetworkInfo? = conn.activeNetworkInfo // Checks the user prefs and the network connection. Based on the result, decides whether // to refresh the display or keep the current display. // If the userpref is Wi-Fi only, checks to see if the device has a Wi-Fi connection. if (WIFI == sPref && networkInfo?.type == ConnectivityManager.TYPE_WIFI) { // If device has its Wi-Fi connection, sets refreshDisplay // to true. This causes the display to be refreshed when the user // returns to the app. refreshDisplay = true Toast.makeText(context, R.string.wifi_connected, Toast.LENGTH_SHORT).show() // If the setting is ANY network and there is a network connection // (which by process of elimination would be mobile), sets refreshDisplay to true. } else if (ANY == sPref && networkInfo != null) { refreshDisplay = true // Otherwise, the app can't download content--either because there is no network // connection (mobile or Wi-Fi), or because the pref setting is WIFI, and there // is no Wi-Fi connection. // Sets refreshDisplay to false. } else { refreshDisplay = false Toast.makeText(context, R.string.lost_connection, Toast.LENGTH_SHORT).show() } } }
জাভা
public class NetworkReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = conn.getActiveNetworkInfo(); // Checks the user prefs and the network connection. Based on the result, decides whether // to refresh the display or keep the current display. // If the userpref is Wi-Fi only, checks to see if the device has a Wi-Fi connection. if (WIFI.equals(sPref) && networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) { // If device has its Wi-Fi connection, sets refreshDisplay // to true. This causes the display to be refreshed when the user // returns to the app. refreshDisplay = true; Toast.makeText(context, R.string.wifi_connected, Toast.LENGTH_SHORT).show(); // If the setting is ANY network and there is a network connection // (which by process of elimination would be mobile), sets refreshDisplay to true. } else if (ANY.equals(sPref) && networkInfo != null) { refreshDisplay = true; // Otherwise, the app can't download content--either because there is no network // connection (mobile or Wi-Fi), or because the pref setting is WIFI, and there // is no Wi-Fi connection. // Sets refreshDisplay to false. } else { refreshDisplay = false; Toast.makeText(context, R.string.lost_connection, Toast.LENGTH_SHORT).show(); } } }