我想要一个像后台运行的异步任务这样的后台进程。如何在Android中将互联网连接检查作为后台进程运行?
答案 0 :(得分:2)
尝试通过广播接收器侦听连接状态更改。
清单寄存器接收器中的:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
广播接收器的Java类:
public class MyReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
Log.d("app","Network connectivity change");
if(intent.getExtras()!=null) {
NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) {
Log.i("app","Network "+ni.getTypeName()+" connected");
} else if(intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) {
Log.d("app","There's no network connectivity");
}
}
}
答案 1 :(得分:0)
编辑:我已更新代码
将以下权限添加到您的清单:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
然后通过这种方法,您可以知道互联网是否可用:
public boolean networktest() {
boolean haveConnectedWifi = false;
boolean haveConnectedMobile = false;
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
if (haveConnectedWifi == false && haveConnectedMobile == false) {
return false;
} else {
return true;
}
}
使用异步任务定期检查互联网连接:
class FooFailAsync extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... param) {
try {
while (!networktest()) {
System.out.println("still not connected");
Thread.sleep(1000);
}
System.out.println("mobile data or wifi connected");
//do something after connecting mobile data or wifi
} catch (Exception e) {
System.out.println(e.getMessage());
}
return "Working";
}
}