Вопрос по service, alarmmanager, android, timertask – Запускать службу Android через каждые 5 минут

16

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

РЕДАКТИРОВАТЬ: Мне нужно, чтобы служба запускалась каждые 5 минут, даже если мое приложение не запущено.

Ваш Ответ

3   ответа
-4

Создать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, объявив его как класс переменная или что-то.

@ мах: хорошо. не могли бы вы сказать мне, как это сделать? Nirav Ranpara
Какой негативный голос ?? Это рабочий код Nirav Ranpara
Downvoted; Таймер - абсолютно плохое решение для этого, потому что Android может завершить приложение, и если вы используете Timer или TimerTask, с ним нельзя справиться. Это'нерабочий код ", его "работать только в идеальных условиях " код. mah
Мне очень жаль упоминать, что я хочу, чтобы эта служба запускалась каждые 5 минут, даже если мое приложение не запущено. Я также редактировал вопрос. KULKING
8

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>
@RonakShethia, принятый ответ решил мою проблему ... KULKING
@KULKING даже если я хочу знать то же самое, дайте мне знать, если вы нашли какое-либо решение Ronak Shethia
осм .............. Ravish Sharma
Как насчет того, когда служба будет завершена, и я хочу снова запустить службу через пять минут без какого-либо участия пользователя? KULKING
23

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);
}
Я использовал AlarmManager для той же цели. Я установил 2 минуты в AlarmManager. Но AlarmManager срабатывает случайно. Я думаю, что это не лучший способ звонить каждые 2 минуты с помощью AlarmManager. kels
Хороший подход, правда. Вы должны использовать AlarmManager таким образом;Calendar wakeUpTime = Calendar.getInstance(); wakeUpTime.add(Calendar.SECOND, seconds); AlarmManager aMgr = (AlarmManager) getSystemService(ALARM_SERVICE); aMgr.set(AlarmManager.RTC_WAKEUP, wakeUpTime.getTimeInMillis(), pendingIntent); Alpay

Похожие вопросы