Запустить приложение в определенное время
Мне было интересно, возможно ли (и если да, то как) запустить мое приложение в определенное время, что-то вроде будильника, который выключается в определенное время. Допустим, я хочу, чтобы мое приложение запустилось в 8 утра, это возможно ?
3 ответов
Вы можете сделать это с помощью 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));
}
}
вы, вероятно, ищете AlarmManager, которые позволяют вам запускать службы / действия / отправлять трансляции через определенные промежутки времени или в заданное время, повторяя или нет. Это, как вы пишете, памяти фоновые службы в Андроид. AlarmManager
похоже на cron в unix. Это позволяет вашей фоновой службе начать, сделать свою работу и выйти из памяти.
вы, вероятно, не хотите начинать действие (если это то, что вы имели в виду под "приложением"). Если вы хотите чтобы предупредить пользователя о том, что что-то произошло, добавьте сигнал тревоги, который запускает приемник в данный момент времени, и попросите получателя добавить уведомление. Уведомление может открыть приложение при нажатии. Это менее инвазивно, чем вывод некоторых потенциально нежелательных действий на передний план.
есть очень хороший учебник:http://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html
вот c&p:
Android AlarmManager учебник по Rakesh Cusat 20 сентября 2012 / подал в: Android Core
при написании приложения возникает необходимость запланировать выполнение кода в будущем. AlarmManager может потребоваться для планирования работы в указанное время. AlarmManager обращается к сигнализации и графики выполнение кода, даже если приложение не запущено. Информация о проекте: мета-информация о проекте. Версия платформы: Android API Уровень 10. IDE: Eclipse Helios Service Release 2 Эмулятор: Android 4.1
предпосылка: предварительное знание рамок приложений Android и приемника широковещательной передачи намерения.
AlarmManager:
AlarmManager имеет доступ к службам системной сигнализации. С помощью AlarmManager вы можете запланировать выполнение кода в будущем. Объект AlarmManager не может создавать экземпляр напрямую, однако его можно получить, вызвав контекст.getSystemService (Context.ALARM_SERVICE). AlarmManager всегда регистрируется с намерением. Когда сигнал тревоги гаснет, намерение, которое было зарегистрировано в AlarmManager, передается системой автоматически. Это намерение запускает целевое приложение, если оно не запущено. Рекомендуется использовать AlarmManager, если вы хотите, чтобы код приложения запускался в определенном время, даже если приложение не запущено в данный момент. Для других операций синхронизации следует использовать обработчик, потому что он прост в использовании. Обработчик рассматривается в другом учебнике.
Описание Метода set () планирует будильник на один раз. setInexactRepeating () планирует тревогу с неточным повторением. Время срабатывания не следует строгим ограничениям. setRepeating () планирует будильник с точным временем повторения. setTime () устанавливает время настенных часов системы. setTimeZone() наборы часовой пояс системы по умолчанию. Дополнительные сведения см. В документе AlarmManager.
в этом уроке давайте научимся создавать одноразовый таймер и повторяющийся таймер, а также отменять повторяющийся таймер. Здесь таймер и будильник используются взаимозаменяемо, но в этом учебном контексте оба они имеют одинаковое значение.
Пример Кода:
давайте создадим три кнопки начать повторять таймер, отменить повторяющийся таймер и одноразовый таймер в макете файл. Эти кнопки прикреплены с помощью методов i.e 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 (). Этот метод вызывается сразу после получения intent. Как только мы получим намерение мы пытаемся получить дополнительный параметр, связанный с этим намерением. Этот дополнительный параметр определяется пользователем i.e ONE_TIME, в основном указывает, было ли это намерение связано с одноразовым таймером или повторяющимся. После извлечения значения параметра ONE_TIME отображается соответствующее сообщение тостов. Также были определены вспомогательные методы, которые можно использовать из других мест с помощью объектов i.e методы setAlarm(), cancelAlarm() и onetimeTimer (). Эти методы также могут быть определено где-то еще, чтобы сделать операцию на таймере i.e установить, отменить и т. д. Чтобы этот учебник был простым, мы определили его в BroadcastReceiver.
setAlarm (): этот метод устанавливает повторяющийся сигнал тревоги с помощью метода setRepeating (). метод setRepeating () требует четырех аргументов:
тип тревоги, время запуска: установите его в текущее время интервал в миллисекундах: в этом примере мы проходим 5 секунд ( 1000 * 5 миллисекунд) в ожидании намерения: он будет зарегистрирован с эта тревога. Когда сигнал тревоги получает вызванным pendingIntent будет передан. 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>
теперь определим класс activity, который определяет некоторые методы. Эти методы будут обрабатывать нажатие кнопки. Здесь, в этом классе, мы создаем экземпляр 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 Rakesh Cusat в блоге Code4Reference.
http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/