Android Upload Data When Wifi Is Available

Pelajaran ini menjelaskan cara menulis aplikasi yang memiliki kontrol penuh atas penggunaan resource jaringan. Jika aplikasi menjalankan banyak operasi jaringan, Anda harus menyediakan setelan pengguna yang memungkinkan pengguna mengontrol kebiasaan data aplikasi Anda, seperti seberapa sering aplikasi tersebut menyinkronkan data, apakah akan melakukan proses upload/download hanya melalui Wi-Fi, apakah akan menggunakan information saat roaming, dan sebagainya. Dengan menyediakan kontrol ini, pengguna kemungkinan kecil menonaktifkan akses aplikasi Anda ke data latar belakang saat mendekati batasnya, karena pengguna justru dapat mengontrol dengan akurat berapa banyak data yang digunakan aplikasi Anda.

Untuk mempelajari penggunaan jaringan aplikasi Anda lebih lanjut, termasuk jumlah dan jenis koneksi jaringan selama jangka waktu tertentu, baca Aplikasi web dan Memeriksa traffic jaringan dengan network profiler. Untuk mengetahui panduan umum cara menulis aplikasi yang meminimalkan dampak masa pakai baterai dari proses download dan koneksi jaringan, lihat Mengoptimalkan masa pakai baterai dan Mentransfer information tanpa menguras baterai.

Anda juga dapat melihat contoh NetworkConnect.

Memeriksa koneksi jaringan perangkat

Perangkat dapat memiliki berbagai jenis koneksi jaringan. Pelajaran ini berfokus pada penggunaan Wi-Fi atau koneksi jaringan seluler. Untuk daftar lengkap jenis jaringan yang dimungkinkan, lihat ConnectivityManager.

Wi-Fi biasanya lebih cepat. Sedangkan information seluler kerap berbayar, yang bisa menjadi mahal. Strategi yang biasa dipakai untuk aplikasi adalah hanya mengambil data besar jika jaringan Wi-Fi tersedia.

Sebelum menjalankan operasi jaringan, sebaiknya Anda memeriksa status konektivitas jaringan. Di antara yang lain, langkah ini dapat mencegah aplikasi Anda tidak sengaja menggunakan radio yang salah. Jika koneksi jaringan tidak tersedia, aplikasi Anda akan merespons dengan cekatan. Untuk memeriksa koneksi jaringan, Anda dapat menggunakan class umum berikut:

  • ConnectivityManager: Menjawab kueri terkait status konektivitas jaringan. Class ini juga memberi tahu aplikasi saat konektivitas jaringan berubah.
  • NetworkInfo: Menjelaskan status antarmuka jaringan dari jenis yang diberikan (saat ini, baik Seluler maupun Wi-Fi).

Cuplikan kode ini menguji konektivitas jaringan untuk Wi-Fi dan seluler. Kode ini menentukan apakah antarmuka jaringan ini tersedia (yaitu, apakah konektivitas jaringan dimungkinkan) dan/atau terhubung (yaitu, apakah konektivitas jaringan tersedia dan apakah mungkin untuk membuat soket dan meneruskan data):

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).use {         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 = imitation; 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);            

Perhatikan bahwa Anda tidak boleh mendasarkan keputusan pada apakah suatu jaringan "tersedia". Anda harus selalu memeriksa isConnected() sebelum menjalankan operasi jaringan, karena isConnected() menangani kasus seperti jaringan seluler yang tidak stabil, mode pesawat, dan data latar belakang yang terbatas.

Cara yang lebih sederhana untuk memeriksa apakah antarmuka jaringan tersedia adalah sebagai berikut. Metode getActiveNetworkInfo() menampilkan caseNetworkInfo yang mewakili antarmuka jaringan pertama yang terhubung yang dapat ditemukan, atau cipher jika tidak ada antarmuka yang terhubung (berarti bahwa koneksi internet tidak tersedia):

Kotlin

fun isOnline(): Boolean {     val connMgr = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager     val networkInfo: NetworkInfo? = connMgr.activeNetworkInfo     return networkInfo?.isConnected == truthful }            

Coffee

public boolean isOnline() {     ConnectivityManager connMgr = (ConnectivityManager)             getSystemService(Context.CONNECTIVITY_SERVICE);     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();     render (networkInfo != nix && networkInfo.isConnected()); }            

Untuk mengkueri status secara lebih terperinci, Anda dapat menggunakan NetworkInfo.DetailedState, tetapi ini jarang diperlukan.

Mengelola penggunaan jaringan

Anda dapat mengimplementasikan aktivitas preferensi yang memberi kontrol eksplisit atas penggunaan resource jaringan aplikasi Anda kepada pengguna. Contoh:

  • Anda dapat mengizinkan pengguna mengupload video hanya saat perangkat terhubung ke jaringan Wi-Fi.
  • Anda dapat menyinkronkan (atau tidak) bergantung pada kriteria tertentu seperti ketersediaan jaringan, interval waktu, dan sebagainya.

Untuk menulis aplikasi yang mendukung akses jaringan dan pengelolaan penggunaan jaringan, manifes Anda harus memiliki filter intent dan izin yang tepat.

  • Manifes yang dikutip nanti di bagian ini mencakup izin berikut:
    • android.permission.INTERNET — Mengizinkan aplikasi membuka soket jaringan.
    • android.permission.ACCESS_NETWORK_STATE — Mengizinkan aplikasi mengakses informasi tentang jaringan.
  • Anda dapat mendeklarasikan filter intent untuk tindakan ACTION_MANAGE_NETWORK_USAGE guna menunjukkan bahwa aplikasi Anda menentukan aktivitas yang menawarkan opsi untuk mengontrol penggunaan data. ACTION_MANAGE_NETWORK_USAGE menunjukkan setelan untuk mengelola penggunaan information jaringan dari aplikasi tertentu. Jika aplikasi memiliki aktivitas setelan yang memungkinkan pengguna mengontrol penggunaan jaringan, Anda harus mendeklarasikan filter intent ini untuk aktivitas tersebut.

Dalam contoh aplikasi, tindakan ini ditangani oleh class SettingsActivity, yang menampilkan UI preferensi untuk memungkinkan pengguna memutuskan kapan mendownload feed.

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"     bundle="com.example.android.networkusage"     ...>      <uses-sdk android:minSdkVersion="4"            android:targetSdkVersion="14" />      <uses-permission android:name="android.permission.Internet" />     <uses-permission android:proper name="android.permission.ACCESS_NETWORK_STATE" />      <application         ...>         ...         <activity android:characterization="SettingsActivity" android:name=".SettingsActivity">              <intent-filter>                 <action android:name="android.intent.activity.MANAGE_NETWORK_USAGE" />                 <category android:proper name="android.intent.category.DEFAULT" />           </intent-filter>         </activity>     </application> </manifest>        

Aplikasi yang menangani data pengguna sensitif, serta yang menargetkan Android 11 dan yang lebih tinggi, dapat memberikan izin akses jaringan per proses. Dengan secara eksplisit menentukan proses yang diizinkan untuk mengakses jaringan, Anda mengisolasi semua kode yang tidak perlu mengupload data.

Meskipun tidak menjamin akan mencegah aplikasi Anda mengupload data secara tidak sengaja, cara ini memungkinkan Anda mengurangi kemungkinan bug dalam aplikasi yang menyebabkan kebocoran data.

Berikut adalah contoh file manifes yang menggunakan fungsionalitas per proses:

          <processes>     <process />     <deny-permission android:name="android.permission.INTERNET" />     <process android:process=":withoutnet1" />     <procedure android:procedure="com.android.cts.useprocess.withnet1">         <permit-permission android:name="android.permission.INTERNET" />     </procedure>     <allow-permission android:proper noun="android.permission.Cyberspace" />     <process android:procedure=":withoutnet2">         <deny-permission android:name="android.permission.INTERNET" />     </process>     <process android:process="com.android.cts.useprocess.withnet2" /> </processes>                  

Mengimplementasikan aktivitas preferensi

Seperti yang dapat Anda lihat di kutipan manifes sebelumnya dalam topik ini, aktivitas contoh aplikasi SettingsActivity memiliki filter intent untuk tindakan ACTION_MANAGE_NETWORK_USAGE. SettingsActivity adalah subclass dari PreferenceActivity. Kode ini menampilkan layar preferensi (ditunjukkan pada gambar 1) yang memungkinkan pengguna menentukan hal berikut:

  • Apakah ingin menampilkan ringkasan untuk setiap entri feed XML, atau hanya link untuk setiap entri.
  • Apakah ingin mendownload feed XML jika koneksi jaringan tersedia, atau hanya jika Wi-Fi tersedia.

Panel preferensi Menyetel preferensi jaringan

Gambar 1. Aktivitas preferensi.

Berikut adalah SettingsActivity. Perhatikan bahwa ini mengimplementasikan OnSharedPreferenceChangeListener. Jika pengguna mengubah preferensi, kode tersebut mengaktifkan onSharedPreferenceChanged(), yang menetapkan refreshDisplay ke benar. Ini menyebabkan tampilan di-refresh saat pengguna kembali ke aktivitas utama:

Kotlin

form 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 prepare in onResume().         // It's best do to unregister listeners when your app isn't using them to cut downward on         // unnecessary organization overhead. Yous do this in onPause().         preferenceScreen?.sharedPreferences?.unregisterOnSharedPreferenceChangeListener(this)     }      // When the user changes the preferences selection,     // onSharedPreferenceChanged() restarts the chief activity as a new     // task. Sets the refreshDisplay flag to "true" to signal that     // the main activity should update its brandish.     // 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         // activeness, the brandish refreshes to reflect the new settings.         NetworkActivity.refreshDisplay = true     } }            

Java

public course 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'southward best do 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 choice,     // 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 chief activity queries the PreferenceManager to get the latest settings.      @Override     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Cord cardinal) {         // Sets refreshDisplay to truthful then that when the user returns to the main         // activity, the display refreshes to reflect the new settings.         NetworkActivity.refreshDisplay = true;     } }            

Merespons perubahan preferensi

Saat pengguna mengubah preferensi di layar setelan, hal tersebut biasanya memiliki konsekuensi untuk perilaku aplikasi. Dalam cuplikan ini, aplikasi akan memeriksa setelan preferensi di onStart(). Jika terdapat kecocokan antara setelan dan koneksi jaringan perangkat (misalnya, jika setelan "Wi-Fi" dan perangkat memiliki koneksi Wi-Fi), aplikasi akan mendownload feed dan memuat ulang tampilan.

Kotlin

class NetworkActivity : Activity() {      // The BroadcastReceiver that tracks network connectivity changes.     individual lateinit var receiver: NetworkReceiver      public override fun onCreate(savedInstanceState: Package?) {         super.onCreate(savedInstanceState)          // Registers BroadcastReceiver to rail network connexion 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 information technology.      public override fun onStart() {         super.onStart()          // Gets the user'southward network preference settings         val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this)          // Retrieves a cord value for the preferences. The second parameter         // is the default value to use if a preference value is non institute.         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) equally ConnectivityManager          val activeInfo: NetworkInfo? = connMgr.activeNetworkInfo         if (activeInfo?.isConnected == truthful) {             wifiConnected = activeInfo.type == ConnectivityManager.TYPE_WIFI             mobileConnected = activeInfo.type == ConnectivityManager.TYPE_MOBILE         } else {             wifiConnected = simulated             mobileConnected = simulated         }     }      // Uses AsyncTask bracket 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 at that place is a Wi-Fi connectedness.         private var wifiConnected = false         // Whether there is a mobile connection.         individual var mobileConnected = fake         // Whether the display should be refreshed.         var refreshDisplay = true          // The user'southward current network preference setting.         var sPref: String? = null     } ...  }            

Java

public grade 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 = simulated;     // Whether there is a mobile connection.     individual static boolean mobileConnected = false;     // Whether the brandish should be refreshed.     public static boolean refreshDisplay = truthful;      // The user's current network preference setting.     public static Cord sPref = nil;      // The BroadcastReceiver that tracks network connectivity changes.     individual 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 2nd 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 = faux;         }     }      // Uses AsyncTask bracket to download the XML feed from stackoverflow.com.     public void loadPage() {         if (((sPref.equals(Whatever)) && (wifiConnected || mobileConnected))                 || ((sPref.equals(WIFI)) && (wifiConnected))) {             // AsyncTask bracket             new DownloadXmlTask().execute(URL);         } else {             showErrorPage();         }     } ...  }            

Mendeteksi perubahan koneksi

Bagian terakhir pelajaran ini adalah subclass BroadcastReceiver, NetworkReceiver. Saat koneksi jaringan perangkat berubah, NetworkReceiver mengintersep tindakan CONNECTIVITY_ACTION, menentukan apa status koneksi jaringannya, dan menetapkan flag wifiConnected dan mobileConnected ke benar/salah dengan sesuai. Hasilnya adalah saat pengguna kembali ke aplikasi untuk kesekian kalinya, aplikasi hanya akan mendownload feed terbaru dan memperbarui tampilan jika NetworkActivity.refreshDisplay ditetapkan ke true.

Menyiapkan BroadcastReceiver yang dipanggil yang tidak diperlukan dapat menghabiskan resource sistem. Aplikasi contoh mendaftarkan BroadcastReceiver NetworkReceiver dalam onCreate(), dan membatalkan pendaftaran dalam onDestroy(). Proses ini lebih ringan daripada mendeklarasikan <receiver> dalam manifes. Saat <receiver> dideklarasikan dalam manifes, maka dapat mengaktifkan aplikasi Anda kapan saja, meskipun Anda belum menjalankannya selama berminggu-minggu. Dengan mendaftarkan dan membatalkan pendaftaran NetworkReceiver dalam aktivitas utama, aplikasi dipastikan tidak akan diaktifkan setelah pengguna menutup aplikasi. Jika Anda mendeklarasikan <receiver> dalam manifes dan tahu persis di mana Anda membutuhkannya, Anda dapat menggunakan setComponentEnabledSetting() untuk mengaktifkan dan menonaktifkannya sesuai kebutuhan.

Berikut adalah NetworkReceiver:

Kotlin

form 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 connexion. Based on the issue, 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 connexion, 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).testify()              // If the setting is Whatever network and there is a network connectedness             // (which by process of elimination would be mobile), sets refreshDisplay to true.         } else if (ANY == sPref && networkInfo != nix) {             refreshDisplay = truthful              // Otherwise, the app can't download content--either considering 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 proceed the current brandish.         // If the userpref is Wi-Fi only, checks to come across if the device has a Wi-Fi connection.         if (WIFI.equals(sPref) && networkInfo != zippo             && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {             // If device has its Wi-Fi connection, sets refreshDisplay             // to true. This causes the brandish to be refreshed when the user             // returns to the app.             refreshDisplay = true;             Toast.makeText(context, R.string.wifi_connected, Toast.LENGTH_SHORT).prove();          // If the setting is ANY network and there is a network connection         // (which by process of elimination would be mobile), sets refreshDisplay to truthful.         } else if (Whatever.equals(sPref) && networkInfo != zip) {             refreshDisplay = truthful;          // Otherwise, the app can't download content--either because in that location is no network         // connection (mobile or Wi-Fi), or because the pref setting is WIFI, and in that location         // is no Wi-Fi connection.         // Sets refreshDisplay to false.         } else {             refreshDisplay = false;             Toast.makeText(context, R.string.lost_connection, Toast.LENGTH_SHORT).show();         }     } }            

waddellhernight37.blogspot.com

Source: https://developer.android.com/training/basics/network-ops/managing?hl=id

0 Response to "Android Upload Data When Wifi Is Available"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel