Мне нужно постоянно отправлять данные на сервер (скажем, через каждые x секунд или минут), даже если приложение находится в фоновом режиме. Я знаю, что сервис - лучший вариант для этого. Поскольку я никогда не пробовал такой сценарий, есть ли какой-нибудь удобный пример того, как сделать вызов веб-службы из службы, а затем после доставки ответа на действие (независимо от того, успешно ли данные получены или нет). любой подход или другой способ достижения этого. любая помощь приветствуется.
отправлять данные на сервер в фоновом режиме каждые x секунд или минут
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
Большое спасибо за вашу помощь, я попробую этот код и дам вам знать.
- person Hardik Mehta; 09.12.2016
хотя он звонит в службу поддержки каждые 10 секунд, есть ли какое-либо эффективное решение для уменьшения разряда батареи. Потому что я должен постоянно отправлять данные, которые являются окончательными.
- person Hardik Mehta; 09.12.2016
возможно, JobSchedular полезен. В документации Google говорится, что не рекомендуется вызывать диспетчер аварийных сигналов слишком быстро. У меня есть идея, просто использовать фон запуска службы все время и внутри него отправлять данные каждые 10 секунд
- person Divyesh Patel; 09.12.2016
мы не можем использовать службу привязки для этого
- person Hardik Mehta; 12.12.2016
не знаю об этом
- person Divyesh Patel; 12.12.2016
я еще не использовал jobschedular. но я пытаюсь понять это, когда я свободен
- person Divyesh Patel; 12.12.2016
проверьте это: bignerdranch.com/blog/ а>
- person Divyesh Patel; 12.12.2016