как сделать андроид сервис для передачи данных на URL - PullRequest
0 голосов
/ 24 марта 2012

Я уже закончил код для передачи данных в 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" />

1 Ответ

0 голосов
/ 24 марта 2012

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

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

Способ работает, создав BroadcastReceiver, которыйпрослушивает определенный Intent, который вы зарегистрировали на Android 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...