WIFI或3G网络变化时的BroadcastReceiver
Posted
技术标签:
【中文标题】WIFI或3G网络变化时的BroadcastReceiver【英文标题】:BroadcastReceiver when WIFI or 3G network change 【发布时间】:2015-02-09 12:41:11 【问题描述】:我开发了一个 android 应用程序,它会在 WiFi 或 3G 网络发生变化时更新服务器数据库。我已经实现了一个BroadcastReceiver
,它监听WiFi change or a 3G connectivity change
。
问题是此代码在 Android 版本 4.x.x 中不起作用。即使启用网络或启用 wifi 后,“已连接 Internet”toast 也不会出现。
在 android 2.3.x 和 3.x.x 中完美运行,出现“Internet is connected” toast,并且数据库也更新了。
这是MainActivity.java
文件:
public class MainActivity extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
// TODO Auto-generated method stub
Integer flag;
flag = 0;
ConnectivityManager check = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] info = check.getAllNetworkInfo();
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
Toast.makeText(context, "Internet is connected",
Toast.LENGTH_SHORT).show();
flag = 1;
if (flag != 0)
StringBuffer sb = new StringBuffer();
TelephonyManager TelephonyMgr = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
m_deviceId = TelephonyMgr.getDeviceId();
m_androidId = Secure.getString(context.getContentResolver(),
Secure.ANDROID_ID);
String bm = android.os.Build.MANUFACTURER + ","
+ android.os.Build.MODEL;
System.out.println("Device Name: " + bm + "\n");
try
URL url = new URL(
"http://saslabtech.com/atsdemo/import_vr.php?d="
+ URLEncoder.encode(m_deviceId, "UTF-8") + "&a="
+ URLEncoder.encode(m_androidId, "UTF-8")
+ "&model=" + URLEncoder.encode(bm, "UTF-8")
+ "&ip="
+ URLEncoder.encode(getLocalIpv4Address(), "UTF-8"));
System.out.println(url);
HttpURLConnection con = (HttpURLConnection) url
.openConnection();
readStream(con.getInputStream());
catch (Exception e)
e.printStackTrace();
Toast.makeText(context, "Updated", Toast.LENGTH_SHORT).show();
这是AndroidManifest.xml
文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.read"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<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=".MainActivity" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>
我不知道哪里出错了。
谢谢!
【问题讨论】:
请说明不工作是什么意思 “Internet is connected”即使启用网络或启用 wifi 也不会出现。 请不要创建一个名为MainActivity
的类,除非它实际上扩展了Activity
类。此外,除非您有一个实际的 MAIN/LAUNCHER Activity
,否则您的用户将无法启动您的应用,并且在您的 AndroidManifest.xml
中注册的任何 BroadcastReceiver
将永远不会被激活。
Toast 需要 activity 的上下文 我猜。您正在传递一个不同的上下文实例。我完全同意@Squonk - 请不要让MainActivity
扩展BroadcastReceiver
。
@MimiPaul:您的应用程序只能在 android v 3.1 下按预期工作,因为自 honeycomb
版本以来,android 必须至少定义 an activity
以从 stopped state to active state
推送应用程序。
【参考方案1】:
您可以简单地检查如下所述的连接:
@Override
public void onReceive(Context context, Intent intent)
Log.d("Network Monitoring", "onReceive ");
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION))
boolean noConnectivity = intent.getBooleanExtra(
ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
if (noConnectivity)
return;//you don't have internet connectivity
//you have internet connectivity, so you may put your code here for further process
【讨论】:
以上是关于WIFI或3G网络变化时的BroadcastReceiver的主要内容,如果未能解决你的问题,请参考以下文章
如何在手机中检查 WIFI 和 3G(数据计划)中的网络连接启用或禁用?
FusedLocationProviderClient 无法通过 3G 或 4G 网络获取 GPS 位置,除非先连接到 WIFI 网络
如何在 iOS7 中以编程方式找到连接 3G 网络或 Wifi 的 iPhone 设备