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

Запустить приложение в определенное время

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

4b9b3361

Ответ 1

Вы можете сделать это с помощью 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));
   }
}

Ответ 2

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

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

Ответ 3

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

здесь находится c & p:

Учебник Android AlarmManager by Rakesh Cusat 20 сентября 2012 | Подано в: Android Core

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

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

AlarmManager:

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

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

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

Пример кода:

Позволяет создать три кнопки запуска повторного таймера, отменить повторный таймер и одноразовый таймер в файле макета. Эти кнопки подключаются с помощью методов, которые запускаютRepeatingTimer, cancelRepeatingTimer и ontimeTimer соответственно. Эти методы будут определены в классе 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() определен. Этот метод вызывается, как только будет получено намерение. Как только мы получим намерение, мы попытаемся получить дополнительный параметр, связанный с этим намерением. Этот дополнительный параметр определяется пользователем i.e ONE_TIME, в основном указывает, связано ли это намерение с одноразовым таймером или повторяющимся. После того, как значение параметра ONE_TIME было извлечено, отображается сообщение Toast. Также были определены методы помощника, которые можно использовать из других мест с помощью объектов, например, setAlarm(), cancelAlarm() и ontimeTimer(). Эти методы также могут быть определены где-то в другом месте для работы с таймером. Установите, отмените и т.д. Чтобы этот учебник был прост, мы определили его в BroadcastReceiver.

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

тип тревоги, время запуска: установите его на текущее время интервал в миллисекундах: в этом примере мы проходим 5 секунд (1000 * 5 миллисекунд) в ожидании намерения: он будет зарегистрирован с помощью этого сигнала. Когда срабатывает тревога, будет транслироваться ожидающий вход. cancelAlarm(): этот метод отменяет ранее зарегистрированный сигнал тревоги, вызывая метод cancel(). cancel() принимает 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/