larsVogel решает эту проблему (и многих других, подобных ему) in this excellent post.
это, как я приспособил его код, чтобы создать приемник подключения, который отслеживает, когда пользователь подключается к сети WI-FI так, чтобы пакетные данные об использовании загрузки:
в файле манифеста, поместить приемник и объявить услугу непосредственно перед закрывающим тегом для ваших </приложений>:
<receiver android:name=".ConnMonitor" android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<service android:name=".BatchUploadGpsData" ></service>
</application>
создать класс широковещательного приемника в отдельном файл с именем ConnMonitor.java (пожалуйста, раскомментируйте Лог вызовов, чтобы иметь возможность должным образом контролировать поток)
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
public class ConnMonitor extends BroadcastReceiver {
private String TAG = "TGtracker";
@Override
public void onReceive(Context context, Intent intent) {
//String typeName = "";
String state = "";
int type = -1;
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo test = (NetworkInfo) connectivityManager.getActiveNetworkInfo();
//Log.v(TAG,"there has been a CONNECTION CHANGE -> "+intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO));
try {
//typeName = test.getTypeName().toString();
type = test.getType();
state = test.getState().toString();
//Log.i(TAG,"type -> '"+typeName +"' state -> '"+state+"'" );
} catch (Exception e) {
//typeName = "null";
type = -1;
state = "DISCONNECTED";
//Log.i(TAG,"type -> error1 "+e.getMessage()+ " cause = "+e.getCause() );
}
if ((type == 1) && (state == "CONNECTED")) {
//Log.i(TAG, "I am soooo friggin uploadin on this beautiful WIFI connection ");
Intent batchUploadDataService = new Intent(context, BatchUploadGpsData.class);
context.startService(batchUploadDataService);
} else {
//Log.e(TAG,"NO FOUND MATCH type -> '"+typeName +"' state -> '"+state+"'" );
}
}
}
и, наконец, создать сервис BatchUploadGpsData.java так:
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class BatchUploadGpsData extends Service {
final String TAG = "TGtracker";
@Override
public void onCreate() {
Log.e(TAG, "here i am, rockin like a hurricane. onCreate service");
// this service tries to upload and terminates itself whether it is successful or not
// but it only effectively DOES anything while it is created
// (therefore, you can call 1 million times if uploading isnt done, nothing happens)
// if you comment this next line, you will be able to see that it executes onCreate only the first it is called
// the reason i do this is that the broadcast receiver is called at least twice every time you have a new change of connectivity state with successful connection to wifi
this.stopSelf();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//Log.i(TAG, "Received start id " + startId + ": " + intent);
Log.e(TAG, "call me redundant BABY! onStartCommand service");
// this service is NOT supposed to execute anything when it is called
// because it may be called inumerous times in repetition
// all of its action is in the onCreate - so as to force it to happen ONLY once
return 1;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
это не псевдокод, это фактический код, протестирована и работает на Android версии 2.2 и выше.
способ протестировать эту услугу - выключить и перезапустить службы WIFI на вашем Android-устройстве (отключение Wi-Fi-маршрутизатора также приведет к трюку). НО этот код не проверяет, действительно ли вы подключены к сети.для этого я рекомендую вам выполнить запрос httpclient и проверить результат вызова. выходит за рамки этого обсуждения.
ПРИМЕЧАНИЕ: поскольку службы работают в том же потоке, что и пользовательский интерфейс, я настоятельно рекомендую вам реализовать загрузку в отдельном потоке или асинтете, в зависимости от ваших конкретных потребностей. вы также можете запустить всю службу в отдельном потоке, но это еще раз не та область обсуждения, несмотря на стандартную практику в этих случаях.
для отладки, я предпочел бы использовать LOG, в отличие от тоста. сначала получите код для работы в процессе принятия решений. Хороший совет от @JPM не означает, что вы используете сервис «Сервис». назовите это «myService», если вы хотите быть расплывчатым. –