บทเรียนนี้จะอธิบายวิธีเขียนแอปพลิเคชันที่มีการควบคุมแบบละเอียด เกี่ยวกับการใช้ทรัพยากรเครือข่าย หากแอปพลิเคชันของคุณใช้ การดำเนินการของเครือข่าย คุณควรกำหนดการตั้งค่าผู้ใช้ที่ให้ผู้ใช้ควบคุม พฤติกรรมการใช้อินเทอร์เน็ตของแอป เช่น ความถี่ที่แอปซิงค์ข้อมูล ไม่ว่าจะ ดำเนินการอัปโหลด/ดาวน์โหลดเฉพาะเมื่อใช้ Wi-Fi ไม่ว่าจะใช้ข้อมูลขณะโรมมิ่ง เป็นต้น เมื่อมีการควบคุมเหล่านี้ ผู้ใช้ก็มีแนวโน้มที่จะ ปิดการเข้าถึงอินเทอร์เน็ตที่ใช้งานอยู่เบื้องหลังของแอปเมื่อใกล้ถึงขีดจำกัด เพราะสามารถควบคุมปริมาณอินเทอร์เน็ตที่แอปใช้ได้อย่างแม่นยำแทน
ถ้าต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการใช้งานเครือข่ายของแอป รวมไปถึงหมายเลข ประเภทการเชื่อมต่อเครือข่ายในช่วงเวลาหนึ่ง โปรดอ่านเว็บ แอปและตรวจสอบการจราจรของข้อมูลในเครือข่ายด้วยเครือข่าย เครื่องมือสร้างโปรไฟล์ หากต้องการดูหลักเกณฑ์ทั่วไปเกี่ยวกับวิธี เขียนแอปที่ช่วยลดผลกระทบจากอายุการใช้งานแบตเตอรี่ของการดาวน์โหลดและเครือข่าย โปรดดูการเชื่อมต่อที่หัวข้อเพิ่มประสิทธิภาพอายุการใช้งานแบตเตอรี่ โอนข้อมูลโดยไม่ทำให้แบตเตอรี่หมดเร็ว
คุณยังสามารถดู NetworkConnect ตัวอย่าง
ตรวจสอบการเชื่อมต่อเครือข่ายของอุปกรณ์
อุปกรณ์สามารถมีการเชื่อมต่อเครือข่ายได้หลายประเภท บทเรียนนี้มุ่งเน้นที่
โดยใช้การเชื่อมต่อ Wi-Fi หรือเครือข่ายมือถือ สำหรับรายการทั้งหมดของ
ประเภทเครือข่ายที่เป็นไปได้ โปรดดู
ConnectivityManager
โดยปกติแล้ว Wi-Fi จะเร็วกว่า นอกจากนี้ อินเทอร์เน็ตมือถือมักมีการวัดปริมาณอินเทอร์เน็ต มีราคาแพง กลยุทธ์ทั่วไปสำหรับแอปคือการดึงข้อมูลขนาดใหญ่เมื่อใช้ Wi-Fi เท่านั้น เครือข่ายพร้อมใช้งาน
ก่อนคุณดำเนินการต่างๆ กับเครือข่าย คุณควรตรวจสอบสถานะ การเชื่อมต่อเครือข่าย นอกจากสาเหตุอื่นๆ แล้ว การดำเนินการนี้อาจทำให้แอป ใช้วิทยุผิดโดยไม่ได้ตั้งใจ หากการเชื่อมต่อเครือข่ายไม่พร้อมใช้งาน แอปพลิเคชันของคุณควรตอบสนองอย่างราบรื่น ในการตรวจสอบการเชื่อมต่อเครือข่าย คุณ มักจะใช้ชั้นเรียนต่อไปนี้
ConnectivityManager
: ตอบคำถามเกี่ยวกับสถานะของเครือข่าย ได้ และยังแจ้งให้แอปพลิเคชันทราบเมื่อเชื่อมต่อเครือข่าย การเปลี่ยนแปลงNetworkInfo
: อธิบายสถานะของ อินเทอร์เฟซเครือข่ายตามประเภทที่กำหนด (ปัจจุบันอาจเป็นเครือข่ายมือถือหรือ Wi-Fi)
ข้อมูลโค้ดนี้จะทดสอบการเชื่อมต่อเครือข่ายสำหรับ Wi-Fi และอุปกรณ์เคลื่อนที่ ช่วยกำหนด อินเทอร์เฟซเครือข่ายเหล่านี้พร้อมใช้งานหรือไม่ (ไม่ว่าจะเป็นเครือข่าย สามารถเชื่อมต่อได้) และ/หรือเชื่อมต่อ (กล่าวคือ ไม่ว่าเครือข่าย มีการเชื่อมต่ออยู่ และหากสามารถสร้างซ็อกเก็ตและส่งข้อมูลได้)
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")
Java
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 }
Java
public boolean isOnline() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); return (networkInfo != null && networkInfo.isConnected()); }
หากต้องการค้นหาสถานะที่มีความละเอียดมากขึ้น คุณสามารถใช้
NetworkInfo.DetailedState
แต่นี่อาจจะไม่ใช่เรื่องจำเป็นเสมอไป
จัดการการใช้งานเครือข่าย
คุณสามารถใช้กิจกรรมค่ากำหนดที่ให้ผู้ใช้ควบคุมได้อย่างชัดเจน การใช้ทรัพยากรเครือข่ายของแอปคุณ เช่น
- คุณอาจอนุญาตให้ผู้ใช้อัปโหลดวิดีโอเฉพาะเมื่ออุปกรณ์เชื่อมต่อกับ เครือข่าย Wi-Fi
- คุณอาจซิงค์ (หรือไม่ซิงค์) ตามเกณฑ์เฉพาะ เช่น เครือข่าย ความพร้อม ช่วงเวลา และอื่นๆ
หากต้องการเขียนแอปที่รองรับการเข้าถึงเครือข่ายและการจัดการการใช้งานเครือข่าย ให้ทำดังนี้ ไฟล์ Manifest ต้องมีตัวกรองสิทธิ์และ Intent ที่ถูกต้อง
- ไฟล์ Manifest ที่ตัดตอนมาภายหลังในส่วนนี้ประกอบด้วย
สิทธิ์:
android.permission.INTERNET
— อนุญาตให้แอปพลิเคชันเปิดซ็อกเก็ตเครือข่ายandroid.permission.ACCESS_NETWORK_STATE
— อนุญาตให้แอปพลิเคชันเข้าถึงข้อมูลเกี่ยวกับเครือข่าย
- คุณสามารถประกาศตัวกรอง Intent สำหรับ
ACTION_MANAGE_NETWORK_USAGE
การดำเนินการเพื่อระบุว่าแอปพลิเคชันของคุณกำหนดกิจกรรมที่เสนอ เพื่อควบคุมปริมาณการใช้อินเทอร์เน็ตACTION_MANAGE_NETWORK_USAGE
แสดงการตั้งค่า สำหรับการจัดการการใช้ข้อมูลเครือข่ายของแอปพลิเคชันที่เฉพาะเจาะจง เมื่อแอปของคุณ มีกิจกรรมการตั้งค่าที่อนุญาตให้ผู้ใช้ควบคุมการใช้งานเครือข่าย ประกาศตัวกรอง Intent นี้สำหรับกิจกรรมนั้น
ในแอปพลิเคชันตัวอย่าง ชั้นเรียนจะเป็นผู้จัดการการดำเนินการนี้
SettingsActivity
ซึ่งแสดง UI ค่ากำหนดเพื่อให้ผู้ใช้ตัดสินใจได้ว่า
ดาวน์โหลดฟีด
version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.networkusage" ...> android:minSdkVersion="4" android:targetSdkVersion="14" /> android:name="android.permission.INTERNET" /> android:name="android.permission.ACCESS_NETWORK_STATE" /> ...> ... android:label="SettingsActivity" android:name=".SettingsActivity"> android:name="android.intent.action.MANAGE_NETWORK_USAGE" /> android:name="android.intent.category.DEFAULT" />
แอปที่จัดการข้อมูลที่ละเอียดอ่อนของผู้ใช้ และกำหนดเป้าหมายเป็น Android 11 และ สูงกว่า สามารถให้สิทธิ์เข้าถึงเครือข่ายตามกระบวนการ มีการระบุอย่างชัดแจ้งว่า กระบวนการได้รับอนุญาตการเข้าถึงเครือข่าย คุณจะต้องแยกโค้ดทั้งหมดที่ไม่จำเป็นต้อง อัปโหลดข้อมูล
แม้ว่าเราไม่รับประกันว่าจะป้องกันแอปของคุณจากการอัปโหลดข้อมูลโดยไม่ตั้งใจ แต่แอป ให้คุณลดโอกาสการเกิดข้อบกพร่องในแอปที่ก่อให้เกิด การรั่วไหลของข้อมูล
รายการต่อไปนี้แสดงตัวอย่างไฟล์ Manifest ที่ใช้การประมวลผลแบบต่อกระบวนการ ฟังก์ชัน:
/>
android:name="android.permission.INTERNET" />
android:process=":withoutnet1" />
android:process="com.android.cts.useprocess.withnet1">
android:name="android.permission.INTERNET" />
android:name="android.permission.INTERNET" />
android:process=":withoutnet2">
android:name="android.permission.INTERNET" />
android:process="com.android.cts.useprocess.withnet2" />
ดำเนินกิจกรรมค่ากำหนด
ดังที่คุณเห็นในส่วนไฟล์ Manifest ที่ตัดตอนมาก่อนหน้านี้ของหัวข้อนี้ ตัวอย่าง
กิจกรรม SettingsActivity
มีตัวกรอง Intent สำหรับ
การดำเนินการ ACTION_MANAGE_NETWORK_USAGE
SettingsActivity
เป็นคลาสย่อยของ
PreferenceActivity
ทั้งนี้
แสดงหน้าจอค่ากำหนด (แสดงในรูปที่ 1) ซึ่งให้ผู้ใช้สามารถระบุ
ดังต่อไปนี้:
- จะแสดงข้อมูลสรุปสำหรับรายการฟีด XML แต่ละรายการ หรือแสดงเพียงลิงก์สำหรับแต่ละรายการ
- จะดาวน์โหลดฟีด XML หากมีการเชื่อมต่อเครือข่ายที่พร้อมใช้งาน หรือดาวน์โหลดเมื่อมี Wi-Fi เท่านั้น พร้อมใช้งาน
รูปที่ 1 กิจกรรมในค่ากำหนด
นี่คือ SettingsActivity
โปรดทราบว่าวิธีนี้ใช้
OnSharedPreferenceChangeListener
เมื่อผู้ใช้เปลี่ยนค่ากำหนด ก็จะเริ่มทำงาน
onSharedPreferenceChanged()
ซึ่งตั้งค่า refreshDisplay
เป็น true ซึ่งจะทำให้จอแสดงผลรีเฟรชเมื่อ
ผู้ใช้กลับไปที่กิจกรรมหลัก:
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 } }
Java
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"
และ
อุปกรณ์มีการเชื่อมต่อ 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 } ... }
Java
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()
เพิ่มเติม
น้อยกว่าการประกาศ
ในไฟล์ Manifest เมื่อคุณ
ประกาศ
ในไฟล์ Manifest ซึ่งจะทำให้แอปทำงานได้ทุกเมื่อ
แม้ว่าจะไม่ได้ทำงานเป็นเวลาหลายสัปดาห์ก็ตาม โดยการลงทะเบียนและยกเลิกการลงทะเบียน
NetworkReceiver
ภายในกิจกรรมหลัก คุณต้องแน่ใจว่าแอปจะไม่
ถูกปลุกระบบหลังจากที่ผู้ใช้ออกจากแอป หากคุณประกาศ
ในไฟล์ Manifest และคุณรู้แน่ชัดว่าต้องใช้ไฟล์ใด
สามารถใช้
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() } } }
Java
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(); } } }