отправлять данные на сервер в фоновом режиме каждые x секунд или минут

Мне нужно постоянно отправлять данные на сервер (скажем, через каждые x секунд или минут), даже если приложение находится в фоновом режиме. Я знаю, что сервис - лучший вариант для этого. Поскольку я никогда не пробовал такой сценарий, есть ли какой-нибудь удобный пример того, как сделать вызов веб-службы из службы, а затем после доставки ответа на действие (независимо от того, успешно ли данные получены или нет). любой подход или другой способ достижения этого. любая помощь приветствуется.


person Hardik Mehta    schedule 09.12.2016    source источник
comment
используйте для этого службу намерений и диспетчер Alaram.   -  person Divyesh Patel    schedule 09.12.2016
comment
@Divyesh, но если мне нужно отправлять данные каждые 10 секунд, сработает ли для этого диспетчер тревог?   -  person Hardik Mehta    schedule 09.12.2016
comment
конечно, но это приведет к большему разряду батареи   -  person Divyesh Patel    schedule 09.12.2016
comment
@Divyesh, не могли бы вы предоставить ссылку на пример, если у вас есть   -  person Hardik Mehta    schedule 09.12.2016
comment
да подождите 5-10 мин. я публикую код   -  person Divyesh Patel    schedule 09.12.2016
comment
@Дивеш спасибо большое   -  person Hardik Mehta    schedule 09.12.2016


Ответы (1)


Сначала добавьте это в mainactivity:

AlarmManager alarmManager;
PendingIntent pendingIntent;
Calendar calendar;
Intent alarm;
final int SDK_INT = Build.VERSION.SDK_INT;

    calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());

alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm = new Intent(this, TestForecastService.class);
pendingIntent = PendingIntent.getService(this, 0, alarm, 0);

if (SDK_INT < Build.VERSION_CODES.KITKAT) {
    alarmManager.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000, pendingIntent);
    Log.d("lowerMF","hahah");
}
else if (Build.VERSION_CODES.KITKAT <= SDK_INT  && SDK_INT < Build.VERSION_CODES.M) {
    alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);
    Log.d("kitkatMF","hahah");
}
else if (SDK_INT >= Build.VERSION_CODES.M) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);
    Log.d("marshmallowMF","hahah");
}

Теперь TestForecastService: в котором вы можете определить свою работу:

public class TestForecastService extends IntentService {

    Context context;
    PowerManager powerManager;
    PowerManager.WakeLock wakeLock;
    final int SDK_INT = Build.VERSION.SDK_INT;
    AlarmManager alarmManager;
    PendingIntent pendingIntent;
    Intent alarm;

    public TestForecastService() {
        super("");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        powerManager = (PowerManager) getSystemService(POWER_SERVICE);
        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "FCFCFCFC");

        wakeLock.acquire();
        sendDATA(city);

    }

    private void sendDATA(String city) {
        try {

           ......DO YOUR DATA SENDING WORK.........

        } catch (Exception e) {
            Log.v("fserviceerror","erre");
        }

        reSETALARAM();
        wakeLock.release();
    }

    private void reSETALARAM() {
        alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarm = new Intent(this,TestForecastService.class);
        pendingIntent = PendingIntent.getService(this, 0, alarm, 0);

        if (SDK_INT < Build.VERSION_CODES.KITKAT) {
            alarmManager.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000, pendingIntent);
            Log.d("lowerFS","hahah");
        }
        else if (Build.VERSION_CODES.KITKAT <= SDK_INT  && SDK_INT < Build.VERSION_CODES.M) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);
            Log.d("kitkatFS","hahah");
        }
        else if (SDK_INT >= Build.VERSION_CODES.M) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,pendingIntent);
            Log.d("marshmallowFS","hahah");
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

Теперь создайте класс BrodcastReceiver, который запускает вашу службу при перезапуске устройства:

public class Auto extends BroadcastReceiver {

        final int SDK_INT = Build.VERSION.SDK_INT;

        @Override
        public void onReceive(Context ctx, Intent intent) {

                if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){
                        AlarmManager alarmMgr = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
                        Intent intent1 = new Intent(ctx, TestForecastService.class);
                        PendingIntent alarmIntent = PendingIntent.getService(ctx, 0, intent1, 0);

                        if (SDK_INT < Build.VERSION_CODES.KITKAT) {
                                alarmMgr.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000, alarmIntent);
                                Log.d("lowerFB","hahah");
                        }
                        else if (Build.VERSION_CODES.KITKAT <= SDK_INT  && SDK_INT < Build.VERSION_CODES.M) {
                                alarmMgr.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,alarmIntent);
                                Log.d("kitkatFB","hahah");
                        }
                        else if (SDK_INT >= Build.VERSION_CODES.M) {
                                alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,System.currentTimeMillis()+10000,alarmIntent);
                                Log.d("marshmallowFB","hahah");
                        }
                }
        }
    }

Наконец, добавьте это в файл манифеста:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

<service android:name=".TestForecastService" android:exported="true" android:enabled="true"/>
<receiver android:name=".Auto" android:exported="true" android:enabled="true" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
person Divyesh Patel    schedule 09.12.2016
comment
Большое спасибо за вашу помощь, я попробую этот код и дам вам знать. - person Hardik Mehta; 09.12.2016
comment
хотя он звонит в службу поддержки каждые 10 секунд, есть ли какое-либо эффективное решение для уменьшения разряда батареи. Потому что я должен постоянно отправлять данные, которые являются окончательными. - person Hardik Mehta; 09.12.2016
comment
возможно, JobSchedular полезен. В документации Google говорится, что не рекомендуется вызывать диспетчер аварийных сигналов слишком быстро. У меня есть идея, просто использовать фон запуска службы все время и внутри него отправлять данные каждые 10 секунд - person Divyesh Patel; 09.12.2016
comment
мы не можем использовать службу привязки для этого - person Hardik Mehta; 12.12.2016
comment
не знаю об этом - person Divyesh Patel; 12.12.2016
comment
я еще не использовал jobschedular. но я пытаюсь понять это, когда я свободен - person Divyesh Patel; 12.12.2016