0

Я уже закончил код для передачи данных в URL-адрес, и это успешно. , но теперь мне нужно это в фоновом режиме, поэтому я делаю услугу, чтобы сделать это, даже приложение окончено. моя проблема, когда я начал службу, она передает данные один раз, но мне нужно передавать данные каждый промежуток времени, так что как это сделать?Как сделать службу андроида для передачи данных на URL-адрес

это мой код

public class MyService extends Service { 
private static final String TAG = "MyService"; 


@Override 
public IBinder onBind(Intent intent) { 
return null; 
} 
Random r; 

@Override 
public void onCreate() { 
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
Log.d(TAG, "onCreate"); 

} 

@Override 
public void onDestroy() { 
Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
Log.d(TAG, "onDestroy"); 
player.stop(); 
} 


@Override 
public void onStart(Intent intent, int startid) { 
Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
Log.d(TAG, "onStart"); 


r=new Random(); 
// 
int o=r.nextInt(1000); 
HttpPost postMethod = new HttpPost("http://androidsaveitem.appspot.com/save"); 
List<NameValuePair> formparams = new ArrayList<NameValuePair>(); 
formparams.add(new BasicNameValuePair("description+", "description FOR id  "+String.valueOf(o))); 
formparams.add(new BasicNameValuePair("id+", String.valueOf(o))); 
UrlEncodedFormEntity entity; 
try { 
entity = new UrlEncodedFormEntity(formparams); 
postMethod.setEntity(entity); 
DefaultHttpClient hc = new DefaultHttpClient(); 
try { 
HttpResponse response = hc.execute(postMethod); 
} catch (ClientProtocolException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
} catch (UnsupportedEncodingException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 

} 
} 

в деятельности я пишу это

 startService(new Intent(this, MyService.class)); 

я уже писать разрешение в файле манифеста

<service android:enabled="true" android:name=".MyService" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
+0

mmm где я могу это сделать ??? – Hanaa

+0

, пожалуйста, напишите код для таймера – Hanaa

+0

спасибо , но он не сработал, нет данных, переходите к URL :( – Hanaa

ответ

0

Вместо того, чтобы оставить свой Service постоянно работающий в фоновом режиме (если он не постоянно работает!), вам, вероятно, стоит подумать о регистрации тревоги с ОС, которая будет просыпать вашу услугу через определенные промежутки времени, а затем позволить ей вернуться в режим сна, когда она будет завершена.

Это упростит вашу реализацию Service и освободит вас от большинства проблем, связанных с синхронизацией. Вы также получите то преимущество, что если ваш Service выйдет из строя или по какой-то причине убит, таймер будильника вернет его в следующий цикл.

Способ, которым это работает, создав команду BroadcastReceiver, которая прослушивает определенную Intent, что вы зарегистрированы в Android's AlarmManager.

Какой вариант вы выберете, в значительной степени будет зависеть от того, насколько велики ваши интервалы, поскольку широковещательная сигнализация намного дороже, чем ожидание таймера. Если вы хотите выполнять свою работу каждые несколько секунд, таймер, вероятно, лучше. Если время ожидания измеряется в минутах или часах, сделайте тревогу.

Во-первых, вам нужно создать будильник.

PendingIntent pi = PendingIntent.getService(context, 0, yourIntent, yourFlags); 
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
am.setInexactRepeating(AlarmManger.ELAPSED_REALTIME, // Alarm type 
         5000,       // Time before first alarm 
         AlarmManager.INTERVAL_HOUR, // Alarm interval 
         pi);       // Sent when alarm happens 

Чтобы на самом деле использовать будильник, вы должны прислушаться к его отключению. Для этого вам необходимо создать BroadcastReceiver.

public class SnoozeButton extends BroadcastReceiver { 
    public void onReceive (Context context, Intent intent) { 
     if (thisIntentIsTheOneIWant(intent){ 
      context.startService(intent); 
     } 
    } 

    private boolean thisIntentIsTheOneIWant(Intent intent) { 
     // Test here to make sure this intent is for your app 
     // and service. You may get Intents other than what 
     // you are interested in. 
    } 
} 

Обратите внимание, что вы должны объявить BroadcastReciever в вашем AndroidManifest.xml.

+0

да мне нужна тревога, потому что мне нужен интервал почти длинный , но можете ли вы дать мне пример для этого? – Hanaa

+0

@ Ханаа У меня нет времени на разработку прямо сейчас. Сегодня я попытаюсь поднять пример для вас. – Argyle

+0

ОК, пожалуйста, попробуйте сегодня :) – Hanaa

Смежные вопросы