Saya sedang mengembangkan penerima siaran android untuk memeriksa koneksi internet.
Masalahnya adalah penerima siaran saya dipanggil dua kali. Saya ingin dipanggil hanya ketika jaringan tersedia. Jika tidak tersedia, saya tidak ingin diberitahu.
Ini adalah penerima siaran
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
final ConnectivityManager connMgr = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
final android.net.NetworkInfo wifi = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
final android.net.NetworkInfo mobile = connMgr
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifi.isAvailable() || mobile.isAvailable()) {
// Do something
Log.d("Network Available ", "Flag No 1");
}
}
}
Ini adalah manifes.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiverforinternetconnection"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name=".NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>
java
android
broadcastreceiver
android-wifi
android-networking
Nikhil Agrawal
sumber
sumber
Jawaban:
Jawab pertanyaan pertama Anda: Receiver siaran Anda dipanggil dua kali karena
Anda telah menambahkan dua
<intent-filter>
Perubahan koneksi jaringan:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
Ubah status WiFi:
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
Hanya menggunakan satu:
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
.Ini akan merespons hanya satu tindakan, bukan dua. Lihat di sini untuk informasi lebih lanjut.
Jawab pertanyaan kedua Anda (Anda hanya ingin penerima menelepon satu kali jika koneksi internet tersedia):
Kode Anda sempurna; Anda memberi tahu hanya ketika internet tersedia.
MEMPERBARUI
Anda dapat menggunakan metode ini untuk memeriksa konektivitas Anda jika Anda hanya ingin memeriksa apakah ponsel terhubung dengan internet atau tidak.
sumber
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
mendaftar tetapi penerima saya masih dipanggil dua kali. Ini bukan masalah besar tapi saya ingin tahu mengapa.ServiceManager.java
izin:
sumber
ServiceManager extends ContextWrapper
? Mengapa Anda perlu memperpanjang ContextWrapper? MENGAPA!?Memeriksa status internet setiap kali menggunakan Penerima Siaran:
Kode sumber lengkap tersedia di Google Drive .
AndroidManifest.xml
BroadcastReciever
MainActivity.java
activity_main.xml
sumber
Gunakan metode ini untuk memeriksa status jaringan:
ingat untuk membatalkan registrasi layanan di onDestroy.
Bersulang!!
sumber
Penerima siaran di atas ini akan dipanggil hanya ketika keadaan Jaringan berubah menjadi terhubung dan tidak terputus.
sumber
Saya tahu utas ini sudah lama dan dijawab sepenuhnya tetapi saya merasa bahwa yang berikut mungkin membantu beberapa orang.
Kode di badan pertanyaan berisi bug yang tidak ditangani oleh siapa pun di sini. @Nikhil sedang memeriksa apakah wifi / ponsel tersedia dan tidak jika terhubung.
Cara mengatasinya ada di sini:
sumber
nyata:
kelas untuk penerima:
dan kelas utilitas seperti contoh:
sumber
hanya untuk orang lain yang ingin mendaftarkan siaran secara dinamis:
sumber
Coba dengan ini
Segera setelah koneksi internet terpicu, ini (BroadcastReciever) akan dimuat
sumber
CONNECTIVITY_ACTION dokumen :
sumber
Berikut cara yang nyaman untuk melakukannya untuk aktivitas, fragmen atau konteks. Ini juga akan membatalkan registrasi otomatis jika Anda melakukannya untuk aktivitas / fragmen (di onDestroy), jika Anda ingin:
Penggunaan dalam fragmen:
sumber
Peringatan:
Declaring a broadcastreceiver for android.net.conn.CONNECTIVITY_CHANGE is deprecated for apps targeting N and higher. In general, apps should not rely on this broadcast and instead use JobScheduler or GCMNetworkManager.
Seperti
CONNECTIVITY_CHANGE
sudah usang maka kita harus menggunakan cara lain untuk melakukan hal yang samaMengikuti
NetworkConnectionLiveData
akan menangani semua Versi OS sampai sekarang dan juga jika target SDK kurang dariBuild.VERSION_CODES.LOLLIPOP
hanya kita yang bisa menggunakannyabroadcastReceiver
Bagian terbaiknya adalah kelas ini digunakan
LiveData
sehingga tidak perlu mendaftarkan penggunaan penerimaLiveData
dan itu akan menangani semua halPenggunaan LiveData ke dalam kelas apa pun:
sumber
}
Tambahkan penerima siaran yang dapat mendengarkan perubahan konektivitas jaringan. Kemudian periksa apakah perangkat terhubung ke internet atau tidak menggunakan ConnectivityManager. Lihat posting atau video ini untuk pemahaman terperinci. Di bawah ini adalah kode:
Saya menulis receiver ini untuk menampilkan pemberitahuan di Layar, itu sebabnya Anda melihat siaran lokal dengan status jaringan. Ini kode untuk menampilkan notifikasi.
Aktivitas mendengarkan maksud yang disiarkan oleh penerima jaringan dan menunjukkan pemberitahuan di layar.
sumber
Jawaban lengkapnya di sini
File Menifest
Kelas BroadecardReceiver
Mendaftarkan penerima di
MainActivity
Nikmati!
sumber
Kode penerima siaran untuk memeriksa perubahan konektivitas internet:
tambahkan ini dalam file manifes:
sumber
Ini hanya memeriksa apakah antarmuka jaringan tersedia, tidak menjamin layanan jaringan tertentu tersedia, misalnya, mungkin ada sinyal rendah atau downtime server
jika Anda ingin membuat koneksi nyata untuk memastikan koneksi Anda dapat mengumpulkan data dari server atau url apa pun:
Fungsi ini perlu dibungkus dengan utas latar:
Tambahkan izin yang diperlukan:
Tambahkan baris ini di bawah aplikasi dalam file manifes:
Tambahkan penerima ke file manifes:
Daftarkan / Batalkan Pendaftaran BR di Aktivitas Anda:
ini adalah seluruh kelas Siaran:
sumber
Lebih mudah menggunakan https://github.com/JobGetabu/DroidNet
sumber
Tambahkan izin:
Buat Receiver untuk memeriksa koneksi
ServiceManager.java
sumber
1) Dalam manifes: - panggil penerima seperti kode di bawah ini
2) Buat satu Kelas Penerima Pemain Luas: - Di kelas ini tambahkan kode Pemeriksaan Jaringan
3) Dalam panggilan Aktivitas Anda ke Penerima Broad Cast: -
sumber
Pertama-tama kita akan membuat kelas yang akan memeriksa konektivitas kondisi jaringan. Jadi mari kita buat kelas:
Sekarang, buat kelas penerima Siaran baru:
dan Sekarang daftarkan penerima siaran Anda di manifes:
sumber