Мне недавно пришлось разрабатывать приложение по тому же шаблону.
Вот как я его спроектировал:
Я создал службу, запущенную либо явно внешним интерфейсом, при включении его через конфигурациюдиалоговое окно, запущенное BroadcastReceiver в ожидании активации подключения к сети:
<receiver android:name=".notifications.MyReceiver">
<intent-filter>
<action android:name="android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
При запуске служба запускает новый HandlerThread и связывает его с Looper:
public class MyService extends Service {
private Looper serviceLooper;
private MyHandler serviceHandler;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
//Toast.makeText(this, "service started", Toast.LENGTH_SHORT).show();
HandlerThread thread = new HandlerThread("MyHandlerThread", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
serviceLooper = thread.getLooper();
serviceHandler = new MyHandler(this, serviceLooper);
// initial message
serviceHandler.sendMessage(Message.obtain());
}
@Override
public void onDestroy() {
serviceLooper.quit();
//Toast.makeText(this, "service stopped", Toast.LENGTH_SHORT).show();
}
}
Когда сеть выходит из строя или веб-интерфейс отключает ее, служба останавливается, а также петлитель.
Теперь в MyHandler я фактически получаю обновления с сервера при получении сообщений.
public class MyHandler extends Handler {
private final Context context;
public MyHandler(Context context, Looper looper) {
super(looper);
this.context = context;
}
@Override
public void handleMessage(Message msg) {
// handle message and perform update
// ...
// try again 30 minutes
this.sendMessageDelayed(Message.obtain(), 1000 * 60 * 30);
}
}
Хитрость, как вы можете видеть, состоит в том, чтобы отправить себе отложенное сообщение, которое будет обработано через 30 минут.
Преимущество этого решения по сравнению с использованием AlarmManager заключается в том, что телефон НЕ насильно просыпаться в назначенное время, что означает, что он лучше работает с телефонными ресурсами, если не нужен.
Более того, я не запускаю службу во время загрузки, только когда есть активное подключение к Интернету, и я прекращаю его, как только подключение исчезает.
Пока это было довольно эффективно.