নেটওয়ার্ক ব্যবহার পরিচালনা করুন

এই পাঠটি বর্ণনা করে যে কীভাবে অ্যাপ্লিকেশনগুলি লিখতে হয় যেগুলির নেটওয়ার্ক সংস্থানগুলির ব্যবহারের উপর সূক্ষ্ম নিয়ন্ত্রণ রয়েছে৷ যদি আপনার অ্যাপ্লিকেশানটি অনেকগুলি নেটওয়ার্ক ক্রিয়াকলাপ সম্পাদন করে, তাহলে আপনাকে ব্যবহারকারীর সেটিংস প্রদান করা উচিত যা ব্যবহারকারীদের আপনার অ্যাপের ডেটা অভ্যাস নিয়ন্ত্রণ করতে দেয়, যেমন আপনার অ্যাপ কত ঘন ঘন ডেটা সিঙ্ক করে, শুধুমাত্র Wi-Fi থাকা অবস্থায় আপলোড/ডাউনলোডগুলি সম্পাদন করতে হবে কিনা, ব্যবহার করতে হবে কিনা রোমিং এর সময় ডেটা, ইত্যাদি। এই নিয়ন্ত্রণগুলি তাদের কাছে উপলব্ধ থাকায়, ব্যবহারকারীরা যখন তাদের সীমার কাছে পৌঁছায় তখন আপনার অ্যাপের ব্যাকগ্রাউন্ড ডেটাতে অ্যাক্সেস অক্ষম করার সম্ভাবনা অনেক কম, কারণ তারা পরিবর্তে আপনার অ্যাপ কতটা ডেটা ব্যবহার করে তা সঠিকভাবে নিয়ন্ত্রণ করতে পারে।

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

আপনি NetworkConnect নমুনাও দেখতে পারেন।

একটি ডিভাইসের নেটওয়ার্ক সংযোগ পরীক্ষা করুন

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

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

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

  • ConnectivityManager : নেটওয়ার্ক সংযোগের অবস্থা সম্পর্কে প্রশ্নের উত্তর দেয়। নেটওয়ার্ক সংযোগ পরিবর্তিত হলে এটি অ্যাপ্লিকেশনগুলিকেও বিজ্ঞপ্তি দেয়৷
  • NetworkInfo : একটি প্রদত্ত ধরণের নেটওয়ার্ক ইন্টারফেসের অবস্থা বর্ণনা করে (বর্তমানে হয় মোবাইল বা Wi-Fi)।

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

কোটলিন

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 থাকে (অর্থাৎ একটি ইন্টারনেট সংযোগ উপলব্ধ নেই):

কোটলিন

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 ব্যবহার করতে পারেন, তবে এটি খুব কমই প্রয়োজনীয় হওয়া উচিত।

নেটওয়ার্ক ব্যবহার পরিচালনা করুন

আপনি একটি পছন্দের কার্যকলাপ বাস্তবায়ন করতে পারেন যা ব্যবহারকারীদের নেটওয়ার্ক সংস্থানগুলির আপনার অ্যাপের ব্যবহারের উপর স্পষ্ট নিয়ন্ত্রণ দেয়৷ যেমন:

  • আপনি ব্যবহারকারীদের ভিডিও আপলোড করার অনুমতি দিতে পারেন যখন ডিভাইসটি একটি Wi-Fi নেটওয়ার্কের সাথে সংযুক্ত থাকে৷
  • নেটওয়ার্ক প্রাপ্যতা, সময়ের ব্যবধান ইত্যাদির মতো নির্দিষ্ট মানদণ্ডের উপর নির্ভর করে আপনি সিঙ্ক (বা না) করতে পারেন।

নেটওয়ার্ক অ্যাক্সেস এবং নেটওয়ার্ক ব্যবহার পরিচালনার সমর্থন করে এমন একটি অ্যাপ লিখতে, আপনার ম্যানিফেস্টে অবশ্যই সঠিক অনুমতি এবং অভিপ্রায় ফিল্টার থাকতে হবে।

  • এই বিভাগে পরে উদ্ধৃত ম্যানিফেস্টে নিম্নলিখিত অনুমতিগুলি অন্তর্ভুক্ত রয়েছে:
    • 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 এর একটি সাবক্লাস। এটি একটি পছন্দের পর্দা প্রদর্শন করে (চিত্র 1 এ দেখানো হয়েছে) যা ব্যবহারকারীদের নিম্নলিখিতগুলি নির্দিষ্ট করতে দেয়:

  • প্রতিটি XML ফিড এন্ট্রির জন্য সারসংক্ষেপ প্রদর্শন করতে হবে, নাকি প্রতিটি এন্ট্রির জন্য একটি লিঙ্ক।
  • কোন নেটওয়ার্ক সংযোগ উপলব্ধ থাকলে XML ফিড ডাউনলোড করতে হবে কিনা, বা শুধুমাত্র Wi-Fi উপলব্ধ থাকলে।

পছন্দ প্যানেলএকটি নেটওয়ার্ক পছন্দ সেট করা হচ্ছে

চিত্র 1. পছন্দের কার্যকলাপ।

এখানে SettingsActivity । মনে রাখবেন এটি OnSharedPreferenceChangeListener প্রয়োগ করে। যখন একজন ব্যবহারকারী একটি পছন্দ পরিবর্তন করে, তখন এটি onSharedPreferenceChanged() এ ফায়ার করে, যা refreshDisplay সত্যে সেট করে। যখন ব্যবহারকারী প্রধান কার্যকলাপে ফিরে আসে তখন এটি প্রদর্শনকে রিফ্রেশ করে:

কোটলিন

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" হয় এবং ডিভাইসটিতে একটি ওয়াই-ফাই সংযোগ থাকে), অ্যাপটি ফিড ডাউনলোড করে এবং ডিসপ্লে রিফ্রেশ করে।

কোটলিন

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 এ true/false সেট করে। ফলাফল হল যে পরের বার ব্যবহারকারী যখন অ্যাপে ফিরে আসবেন, অ্যাপটি শুধুমাত্র সর্বশেষ ফিড ডাউনলোড করবে এবং NetworkActivity.refreshDisplay true সেট করা থাকলে ডিসপ্লে আপডেট করবে।

একটি BroadcastReceiver সেট আপ করা যা অপ্রয়োজনীয়ভাবে কল করা হয় তা সিস্টেম সংস্থানগুলির উপর একটি ড্রেন হতে পারে। নমুনা অ্যাপ্লিকেশনটি BroadcastReceiver NetworkReceiver onCreate() এ নিবন্ধন করে এবং এটি onDestroy() এ নিবন্ধনমুক্ত করে। ম্যানিফেস্টে <receiver> ঘোষণা করার চেয়ে এটি আরও হালকা। আপনি যখন ম্যানিফেস্টে একটি <receiver> ঘোষণা করেন, এটি যেকোনও সময় আপনার অ্যাপটিকে জাগিয়ে তুলতে পারে, এমনকি আপনি এটি কয়েক সপ্তাহ ধরে না চালালেও৷ মূল ক্রিয়াকলাপের মধ্যে NetworkReceiver নিবন্ধন এবং নিবন্ধনমুক্ত করে, আপনি নিশ্চিত করেন যে ব্যবহারকারী অ্যাপটি ছেড়ে যাওয়ার পরে অ্যাপটি জেগে উঠবে না। আপনি যদি ম্যানিফেস্টে একটি <receiver> ঘোষণা করেন এবং আপনি ঠিক জানেন যে আপনার এটি কোথায় প্রয়োজন, আপনি এটিকে যথাযথভাবে সক্ষম এবং নিষ্ক্রিয় করতে setComponentEnabledSetting() ব্যবহার করতে পারেন।

এখানে NetworkReceiver :

কোটলিন

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();
        }
    }
}