Подтвердить что ты не робот

Android - Периодическая справочная служба - Советы

Я работаю над приложением, которое будет передавать информацию о его местоположении на удаленный сервер. Я намереваюсь сделать это, выполнив простую HTTP-почту на веб-сервере, и все просто и прекрасно.

Но, согласно спецификации, приложение должно время от времени выполнять свое действие, скажем, раз в каждые 30 минут. Будьте независимы от интерфейса, что означает, что он должен запускаться, даже если приложение закрыто.

Я огляделся и узнал, что Android Services - это то, что нужно использовать. Что я могу использовать для реализации такой системы. Перезагрузится ли сервис (или другой механизм) при перезапуске телефона?

Спасибо заранее.

4b9b3361

Ответ 1

Создайте Service, чтобы отправить свою информацию на ваш сервер. Предположительно, у вас это под контролем.

Ваш Service должен быть запущен аварийным сигналом, вызванным AlarmManager, где вы можете указать интервал. Если вам не нужно сообщать свои данные ровно через каждые 30 минут, вы, вероятно, хотите неточный сигнал, чтобы вы могли сэкономить время автономной работы.

Наконец, вы можете зарегистрировать свое приложение, чтобы получить трансляцию загрузки, настроив BroadcastReceiver следующим образом:

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {  
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            // Register your reporting alarms here.            
        }
    }
}

Вам нужно будет добавить следующие разрешения для AndroidManifest.xml для работы. Не забудьте зарегистрировать свои аварийные сигналы при обычном запуске приложения, или они будут зарегистрированы только при загрузке устройства.

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

Ответ 2

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

Фоновая служба:

package com.ex.ample;

import android.app.Service;
import android.content.*;
import android.os.*;
import android.widget.Toast;

public class BackgroundService extends Service {

    public Context context = this;
    public Handler handler = null;
    public static Runnable runnable = null;

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

    @Override
    public void onCreate() {
        Toast.makeText(this, "Service created!", Toast.LENGTH_LONG).show();

        handler = new Handler();
        runnable = new Runnable() {
            public void run() {
                Toast.makeText(context, "Service is still running", Toast.LENGTH_LONG).show();
                handler.postDelayed(runnable, 10000);
            }
        };

        handler.postDelayed(runnable, 15000);
    }

    @Override
    public void onDestroy() {
        /* IF YOU WANT THIS SERVICE KILLED WITH THE APP THEN UNCOMMENT THE FOLLOWING LINE */
        //handler.removeCallbacks(runnable);
        Toast.makeText(this, "Service stopped", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onStart(Intent intent, int startid) {
        Toast.makeText(this, "Service started by user.", Toast.LENGTH_LONG).show();
    }
}

Вот как вы начинаете его со своей основной деятельности или где хотите:

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

onDestroy() будет вызван, когда приложение будет закрыто или убито, но runnable просто запустит его обратно.

Надеюсь, это поможет кому-то.

Причина, по которой некоторые люди делают это, - это корпоративные приложения, в которых в некоторых случаях пользователи/сотрудники не могут останавливать определенные вещи:)

http://i.imgur.com/1vCnYJW.png

Ответ 3

Вы должны запланировать свою службу с помощью диспетчера аварийных сообщений, сначала создать ожидающее намерения службы:

Intent ii = new Intent(getApplicationContext(), MyService.class);
PendingIntent pii = PendingIntent.getService(getApplicationContext(), 2222, ii,
PendingIntent.FLAG_CANCEL_CURRENT);

Затем планируйте его с помощью диспетчера аварийных сигналов:

//getting current time and add 5 seconds to it
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 5);
//registering our pending intent with alarmmanager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), pi);

это запустит вашу службу через 5 секунд текущего времени. Вы можете повторить свой будильник.

Ответ 4

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