Запуск Android-сервиса каждые 5 минут

Я искал через интернет последние 2 дня, но я не мог найти какой-либо учебник. Я создал службу, и я отправляю уведомление в строке состояния при запуске службы. Я хочу, чтобы служба остановилась после показа уведомления и начала его через 5 минут. Пожалуйста, дайте мне знать, если это возможно, и предоставьте мне несколько полезных руководств, если они есть. Я слышал о TimerTask и AlarmManager, и я тоже пытался использовать их, но я не смог получить желаемый результат.

EDIT: Мне нужно, чтобы служба запускалась каждые 5 минут, даже если мое приложение не работает.

Ответы

Ответ 1

Вы не хотите использовать TimerTask, так как это зависит от того, какое приложение работает постоянно. Реализация AlarmManager позволяет безопасно убивать ваше приложение между выполнением.

Утверждение, что вы пытались использовать AlarmManager, но не получило желаемого результата, не является полезным выражением, поскольку оно никому не говорит о том, как помочь вам правильно разобраться. Было бы гораздо полезнее выразить то, что произошло.

http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/ содержит полезное руководство по AlarmManager. Вот основные моменты:

1) Ваш будильник вызовет срабатывание Intent, когда он истечет. Вам решать, что это за Intent и как это должно быть реализовано. Ссылка, предоставленная мной, содержит полный пример, основанный на BroadcastReceiver.

2) Вы можете установить будильник, например:

public void setOnetimeTimer(Context context) {
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
    intent.putExtra(ONE_TIME, Boolean.TRUE);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (1000 * 60 * 5), pi);
}

Ответ 2

Ниже я предоставил три файла MainActivity.java для запуска службы, второй файл MyService.java, предоставляющий услугу в течение 5 минут и третьих, представляет файл манифеста.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService(new Intent(this, MyService.class)); //start service which is MyService.java
    }
}

MyService.java

 public class MyService extends Service {

    public static final int notify = 300000;  //interval between two services(Here Service run every 5 Minute)
    private Handler mHandler = new Handler();   //run on another Thread to avoid crash
    private Timer mTimer = null;    //timer handling

    @Override
    public IBinder onBind(Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        if (mTimer != null) // Cancel if already existed
            mTimer.cancel();
        else
            mTimer = new Timer();   //recreate new
        mTimer.scheduleAtFixedRate(new TimeDisplay(), 0, notify);   //Schedule task
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mTimer.cancel();    //For Cancel Timer
        Toast.makeText(this, "Service is Destroyed", Toast.LENGTH_SHORT).show();
    }

    //class TimeDisplay for handling task
    class TimeDisplay extends TimerTask {
        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    // display toast
                    Toast.makeText(MyService.this, "Service is running", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
}

AndroidManifest.xml

  <service android:name=".MyService" android:enabled="true" android:exported="true"></service>

Ответ 3

Создайте объект Timer и дайте ему TimerTask, который выполняет код, который вы хотите выполнить.

Timer timer = new Timer ();
TimerTask hourlyTask = new TimerTask () {
    @Override
    public void run () {
        // your code here...
    }
};

// schedule the task to run starting now and then every hour...
timer.schedule (hourlyTask, 0l, 1000*60*60);   // 1000*10*60 every 10 minut

Преимущество использования объекта Timer заключается в том, что он может обрабатывать несколько объектов TimerTask, каждый со своим временем, задержкой и т.д. Вы также можете запускать и останавливать таймеры, пока вы держите объект Timer, объявляя его как переменная класса или что-то в этом роде.