Запустить приложение в определенное время - PullRequest
22 голосов
/ 15 декабря 2010

Мне было интересно, возможно ли (и если да, то как) запустить мое приложение в определенное время, что-то вроде будильника, который срабатывает в определенное время.Допустим, я хочу, чтобы мое приложение запускалось в 8 часов утра, это возможно?

Ответы [ 3 ]

18 голосов
/ 15 декабря 2010

Вы можете сделать это с AlarmManager, вот короткий пример. Сначала нужно установить будильник:

AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE);

Date futureDate = new Date(new Date().getTime() + 86400000);
futureDate.setHours(8);
futureDate.setMinutes(0);
futureDate.setSeconds(0);
Intent intent = new Intent(con, MyAppReciever.class);

PendingIntent sender = PendingIntent.getBroadcast(con, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, futureDate.getTimeInMillis(), sender); 

Далее, вам нужно создать приемник с некоторым кодом для выполнения вашего приложения: (т.е. запуск вашего приложения):

public class MyAppReciever extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    startActivity(new Intent(context, MyAppMainActivity.class));
   }
}
11 голосов
/ 15 декабря 2010

Вы, вероятно, ищете AlarmManager , который позволит вам запускать службы / действия / отправлять трансляции через определенные промежутки времени или через определенное время, повторяя или нет.Вот как вы пишете дружественные к памяти фоновые сервисы в Android.AlarmManager похоже на cron в Unix.Это позволяет вашему фоновому сервису запускаться, выполнять свою работу и выходить из памяти.

Вы, вероятно, не хотите начинать деятельность (если вы это имели в виду под «приложением»).Если вы хотите предупредить пользователя о том, что что-то произошло, добавьте сигнал тревоги, который запускает приемник в данное время, и попросите получателя добавить уведомление.Уведомление может открыть приложение при нажатии.Это менее агрессивно, чем выдвигать потенциально нежелательную активность на передний план.

1 голос
/ 23 января 2014

есть очень хороший учебник: http://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html

вот ч & р:

Учебник по Android AlarmManager Ракеш Кусат 20 сентября 2012 года | Подано в: Android Core

При написании приложения возникает необходимость в планировании выполнения кода в будущем. Вам может потребоваться AlarmManager для планирования вашей работы в указанное время. AlarmManager получает доступ к системной тревоге и планирует выполнение кода, даже когда приложение не запущено. Информация о проекте: Мета-информация о проекте. Версия платформы: Android API Level 10. IDE: Eclipse Helios Service Release 2 Эмулятор: Android 4.1

Предварительные условия: предварительные знания о структуре приложений Android и приемнике Intent Broadcast.

AlarmManager:

AlarmManager имеет доступ к системным службам сигнализации. С помощью AlarmManager вы можете запланировать выполнение кода в будущем. Объект AlarmManager не может быть создан напрямую, однако его можно получить, вызвав Context.getSystemService (Context.ALARM_SERVICE). AlarmManager всегда регистрируется с намерением. Когда срабатывает сигнал тревоги, намерение, зарегистрированное в AlarmManager, транслируется системой автоматически. Это намерение запускает целевое приложение, если оно не запущено. Рекомендуется использовать AlarmManager, когда вы хотите, чтобы код вашего приложения запускался в определенное время, даже если ваше приложение в данный момент не запущено. Для других операций синхронизации следует использовать обработчик, потому что он прост в использовании. Обработчик описан в другом учебнике.

Описание метода set () Планирует тревогу на один раз. setInexactRepeating () Планирует тревогу с неточным повторением. Время запуска не подчиняется никаким строгим ограничениям. setRepeating () Планирует тревогу с точным временем повторения. setTime () Устанавливает время настенных часов системы. setTimeZone () Устанавливает часовой пояс системы по умолчанию. Посмотрите документацию AlarmManager для получения дополнительной информации.

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

Пример кода:

Давайте создадим три кнопки запуска повторяющегося таймера, отмены повторяющегося таймера и одноразового таймера в файле макета. Эти кнопки прикрепляются с помощью методов, то есть startRepeatingTimer, cancelRepeatingTimer и onetimeTimer соответственно. Эти методы будут определены в классе Activity. Файл макета показан ниже (activity_alarm_manager.xml).

<linearlayout android:layout_height='match_parent' 
   android:layout_width='match_parent' android:orientation='vertical' 
   xmlns:android='http://schemas.android.com/apk/res/android' 
   xmlns:tools='http://schemas.android.com/tools'>

   <button android:id='@+id/btStart' android:layout_height='wrap_content' 
     android:layout_width='match_parent' android:onclick='startRepeatingTimer' 
     android:padding='@dimen/padding_medium' android:text='@string/btStart'   
     tools:context='.WidgetAlarmManagerActivity'/>
   <button android:id='@+id/btCancel' android:layout_height='wrap_content' 
     android:layout_width='match_parent' android:onclick='cancelRepeatingTimer'  
     android:padding='@dimen/padding_medium' android:text='@string/btCancel' 
     tools:context='.WidgetAlarmManagerActivity'/>
    <button android:id='@+id/btOneTime' android:layout_height='wrap_content' 
    android:layout_width='match_parent' android:onclick='onetimeTimer' 
    android:padding='@dimen/padding_medium' android:text='@string/btOneTime'   
    tools:context='.WidgetAlarmManagerActivity'/>
  </linearlayout>

Мы собираемся определить BroadcastReciever, который обрабатывает намерение, зарегистрированное в AlarmManager. В данном классе был определен метод onReceive (). Этот метод вызывается, как только намерение получено. Как только мы получаем намерение, мы пытаемся получить дополнительный параметр, связанный с этим намерением. Этот дополнительный параметр определяется пользователем, т.е. ONE_TIME, в основном указывает, было ли это намерение связано с одноразовым таймером или повторяющимся. Как только значение параметра ONE_TIME было извлечено, отображается соответствующее сообщение. Также были определены вспомогательные методы, которые можно использовать из других мест с помощью объектов, т.е. методов setAlarm (), cancelAlarm () и onetimeTimer (). Эти методы также могут быть определены где-то еще для выполнения операций с таймером, т.е. установки, отмены и т. Д. Чтобы этот учебник был простым, мы определили его в BroadcastReceiver.

setAlarm (): Этот метод устанавливает повторяющуюся тревогу с помощью метода setRepeating (). Метод setRepeating () нуждается в четырех аргументах:

тип тревоги, время запуска: установите текущее время интервал в миллисекундах: в этом примере мы проходим 5 секунд (1000 * 5 миллисекунд) в ожидании намерения: он будет зарегистрирован с этим сигналом тревоги. Когда сработает сигнализация, будет передано ожидающее намерение. cancelAlarm (): Этот метод отменяет ранее зарегистрированный сигнал тревоги, вызывая метод cancel (). Метод cancel () принимает pendingIntent в качестве аргумента. Значение pendingIntent должно соответствовать одному, только тогда метод cancel () может удалить тревогу из системы.

onetimeTimer (): этот метод создает одноразовый сигнал тревоги. Это может быть достигнуто путем вызова метода set (). Метод set () принимает три аргумента:

тип тревоги время срабатывания ожидаемое намерение

package com.rakesh.alarmmanagerexample;

import java.text.Format;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.widget.Toast;

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {

 final public static String ONE_TIME = 'onetime';

 @Override
 public void onReceive(Context context, Intent intent) {
   PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 'YOUR TAG');
         //Acquire the lock
         wl.acquire();

         //You can do the processing here.
         Bundle extras = intent.getExtras();
         StringBuilder msgStr = new StringBuilder();

         if(extras != null && extras.getBoolean(ONE_TIME, Boolean.FALSE)){
          //Make sure this intent has been sent by the one-time timer button.
          msgStr.append('One time Timer : ');
         }
         Format formatter = new SimpleDateFormat('hh:mm:ss a');
         msgStr.append(formatter.format(new Date()));

         Toast.makeText(context, msgStr, Toast.LENGTH_LONG).show();

         //Release the lock
         wl.release();
 }

 public void SetAlarm(Context context)
    {
        AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        intent.putExtra(ONE_TIME, Boolean.FALSE);
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
        //After after 5 seconds
        am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 5 , pi); 
    }

    public void CancelAlarm(Context context)
    {
        Intent intent = new Intent(context, AlarmManagerBroadcastReceiver.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }

    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(), pi);
    }
}

Ниже приведен файл манифеста. Здесь требуется разрешение WAKE_LOCK, поскольку активная блокировка используется при обработке в методе onReceive (), представленном в классе AlarmManagerBroadcastReceiver. AlarmManagerBroadcastReceiver был зарегистрирован как получатель широковещания.

<manifest android:versioncode='1' android:versionname='1.0' 
       package='com.rakesh.alarmmanagerexample' 
       xmlns:android='http://schemas.android.com/apk/res/android'>

   <uses-sdk android:minsdkversion='10' android:targetsdkversion='15'/>
   <uses-permission android:name='android.permission.WAKE_LOCK'/>
    <application android:icon='@drawable/ic_launcher' 
       android:label='@string/app_name' android:theme='@style/AppTheme'>
        <activity android:label='@string/title_activity_alarm_manager' 
           android:name='com.rakesh.alarmmanagerexample.AlarmManagerActivity'>
            <intent-filter>
                <action android:name='android.intent.action.MAIN'/>
                <category android:name='android.intent.category.LAUNCHER' />
          </intent-filter>
        </activity>
        <receiver android:name='com.rakesh.alarmmanagerexample.AlarmManagerBroadcastReceiver'>
        </receiver>
    </application>
</manifest>

Теперь давайте определим класс активности, который определяет некоторые методы. Эти методы будут обрабатывать нажатия кнопок. Здесь, в этом классе, мы создаем экземпляр AlarmManagerBroadcastReciever, который поможет нам получить доступ к setAlarm (), cancelAlarm () и setOnetime (). Остальную часть кода легко понять.

package com.rakesh.alarmmanagerexample;

import com.rakesh.alarmmanagerexample.R;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import android.support.v4.app.NavUtils;

public class AlarmManagerActivity extends Activity {

 private AlarmManagerBroadcastReceiver alarm;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm_manager);
        alarm = new AlarmManagerBroadcastReceiver();
    }

    @Override
 protected void onStart() {
  super.onStart();
 }

    public void startRepeatingTimer(View view) {
     Context context = this.getApplicationContext();
     if(alarm != null){
      alarm.SetAlarm(context);
     }else{
      Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show();
     }
    }

    public void cancelRepeatingTimer(View view){
     Context context = this.getApplicationContext();
     if(alarm != null){
      alarm.CancelAlarm(context);
     }else{
      Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show();
     }
    }

    public void onetimeTimer(View view){
     Context context = this.getApplicationContext();
     if(alarm != null){
      alarm.setOnetimeTimer(context);
     }else{
      Toast.makeText(context, 'Alarm is null', Toast.LENGTH_SHORT).show();
     }
    }

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_widget_alarm_manager, menu);
        return true;
    }
}

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

Пожалуйста, скачайте https://github.com/rakeshcusat/Code4Reference/tree/master/AndroidProjects/AlarmManagerExamplecode,, если вам нужен код ссылки.

Ссылка: учебник по Android AlarmManager от нашего партнера по JCG Ракеша Кусата в блоге Code4Reference.

http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/

...