Ich habe eine Android-App, die mit dem Internet synchronisiert werden muss, aber sobald das Telefon zu schlafen geht kann ich nicht auf das Internet zugreifen. Es passiert nur, wenn der Benutzer den "Batteriemodus" verwendet, wenn er die Daten nach 15 Minuten ausschaltet. Ich habe eine Test-App geschrieben und die Daten eingeschaltet, aber es verbindet sich immer noch mit dem Server.Schalten Sie das Internet auf Android, wenn im Schlaf
Was ich versucht:
- Wenn ich die Daten manuell ausschalten, dann die App auf dreht und es funktioniert
- Ich habe auch versucht WakeLock, aber es hat nicht geholfen.
- Der Alarm funktioniert wie erwartet, auch wenn das Telefon stundenlang 2.3.3
Getestet auf Motorola Atrix Android schlafen geht. Ich kann mich nicht auf Wifi verlassen. Im wirklichen Leben wird es jede Woche synchronisiert. Wie können wir es möglich machen?
Alarmmanager:
alarm_manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pending = PendingIntent.getBroadcast(this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
alarm_manager.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(), 15000, pending);
AlarmReceiver:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("MYTAG", "RECEIVED getMobileDataEnabled: " + getMobileDataEnabled(context));
if (!isOnline(context)) {
Log.d("MYTAG", "NO INET");
if (turnOnInet(context)) {
Log.d("MYTAG", "INET IS ON");
}
}
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://xxx.xxx.xxx.xxx/ping/pong/moto/");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("short_code", "ROFL"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
httpclient.execute(httppost);
Log.d("MYTAG", "POST FINISHED");
}
catch (Exception e) {
Log.e("MYTAG", "MYTAG", e);
}
}
public boolean isOnline(Context context) {
ConnectivityManager cm = (ConnectivityManager)context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null){
Log.d("MYTAG", "isAvailable: "+netInfo.isAvailable());
}
if (netInfo != null && netInfo.isConnectedOrConnecting()) {
return true;
}
return false;
}
public boolean turnOnInet(Context context) {
ConnectivityManager mgr = (ConnectivityManager)context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (mgr == null) {
Log.d("MYTAG", "ConnectivityManager == NULL");
return false;
}
try {
Method setMobileDataEnabledMethod = mgr.getClass().getDeclaredMethod("setMobileDataEnabled", boolean.class);
if (null == setMobileDataEnabledMethod) {
Log.d("MYTAG", "setMobileDataEnabledMethod == null");
return false;
}
setMobileDataEnabledMethod.invoke(mgr, true);
}
catch(Exception e) {
Log.e("MYTAG", "MYTAG", e);
return false;
}
return true;
}
private boolean getMobileDataEnabled(Context context) {
ConnectivityManager mgr = (ConnectivityManager)context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (mgr == null) {
Log.d("MYTAG", "getMobileDataEnabled ConnectivityManager == null");
return false;
}
try {
Method method = mgr.getClass().getMethod("getMobileDataEnabled");
return (Boolean) method.invoke(mgr);
} catch (Exception e) {
Log.e("MYTAG", "MYTAG", e);
return false;
}
}
}
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
Bitte töten Sie nicht die Batterie Ihrer Benutzer. – SLaks
In "real life" wird es jede Woche synchronisiert – programmersbook
haben Sie versucht, RTC-Flag anstelle von RTC_WAKEUP zu verwenden? Da das Wakeup nicht erzwungen wird, schaltet Framework möglicherweise das Netzwerk ein. Da Sie die Synchronisierung einmal in der Woche verwenden, benötigen Sie kein WAKEUP-Flag – nandeesh