Zastanawiam się, czy to możliwe (i jeśli tak jest), aby uruchomić moją aplikację w określonym czasie, coś jak budzik, który uruchamia się o określonej godzinie. Powiedzmy, że chcę, aby moja aplikacja uruchamiała się o 8 rano, czy to możliwe?Uruchom aplikację o określonej godzinie
Odpowiedz
Możesz to zrobić za pomocą programu AlarmManager, oto krótki przykład. Najpierw trzeba ustawić alarm:
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);
Następnie trzeba stworzyć odbiornik z kodem, aby wykonać swoją aplikację (ie- rozpoczynając swoją aplikację):
public class MyAppReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
startActivity(new Intent(context, MyAppMainActivity.class));
}
}
Myślę, że czegoś brakuje: am.set (AlarmManager.RTC_WAKEUP, futureDate.getTimeInMillis (), nadawca); –
Mój obiekt Date nie ma metody "getTimeInMillis"() .. – flipperweid
Prawdopodobnie szukasz numeru AlarmManager, który pozwala Ci rozpocząć korzystanie z usług/działań/wysyłać wiadomości w określonych odstępach czasu lub w określonym czasie, powtarzając lub nie. W ten sposób zapisujesz przyjazne pamięci usługi tła w systemie Android. AlarmManager
to coś w rodzaju crona w systemie UNIX. Pozwala na uruchomienie usługi w tle, wykonanie jej pracy i wyczerpanie pamięci.
Prawdopodobnie nie chcesz rozpoczynać działalności (jeśli masz na myśli "zgłoszenie"). Jeśli chcesz powiadomić użytkownika, że coś się stało, dodaj alarm, który uruchamia odbiornik w określonym czasie, i niech odbiorca doda powiadomienie. Powiadomienie może otworzyć aplikację po kliknięciu. To mniej inwazyjne niż przeniesienie potencjalnie niepożądanej aktywności na pierwszy plan.
tak naprawdę chcę uruchomić moją główną działalność: DI rozumiem, że twoje podejście jest mniej inwazyjne, ale chcę też zrobić coś inwazyjnego: P – TiGer
istnieje bardzo dobry tutorial: http://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html
oto c & p:
Android AlarmManager poradnik przez Rakesh Kuzy t 20 września 2012 r. | Zapisano w: Android Core
Podczas pisania wniosku, konieczne jest zaplanowanie wykonania kodu w przyszłości. Możesz wymagać, aby AlarmManager zaplanował pracę w określonym czasie. AlarmManager uzyskuje dostęp do alarmu systemowego i planuje wykonanie kodu, nawet gdy aplikacja nie jest uruchomiona. Informacje o projekcie: Meta-informacje o projekcie. Wersja platformy: Android API Level 10. IDE: Eclipse Helios Service Release 2 Emulator: Android 4.1
Wymagania wstępne: Wstępna wiedza na temat struktury aplikacji Android i odbiornika Intent Broadcast.
AlarmManager:
AlarmManager ma dostęp do służb alarmowych systemu. Za pomocą programu AlarmManager można zaplanować wykonanie kodu w przyszłości. Obiekt AlarmManager nie może bezpośrednio utworzyć instancji, ale można go odzyskać, wywołując Context.getSystemService (Context.ALARM_SERVICE). AlarmManager jest zawsze rejestrowany z zamiarem. Gdy alarm się wyłączy, funkcja, która została zarejestrowana w AlarmManager, jest automatycznie nadawana przez system. Ta intencja uruchamia aplikację docelową, jeśli nie jest uruchomiona. Zaleca się używanie programu AlarmManager, gdy chcesz, aby kod aplikacji był uruchamiany o określonej godzinie, nawet jeśli aplikacja nie jest aktualnie uruchomiona. Do innych operacji czasowych należy używać programu obsługi, ponieważ jest łatwy w użyciu. Handler jest objęty innym samouczkiem.
Metoda Opis zestaw() Planuje alarm na jeden raz. setInexactRepeating() Planuje alarm z niedokładnym powtarzaniem. Czas wyzwalania nie podlega ścisłemu ograniczeniu. setRepeating() Zaplanowanie alarmu z dokładnym czasem powtarzania. setTime() Ustawia czas zegara ściennego systemu. setTimeZone() Ustawia domyślną strefę czasową systemu. Sprawdź dokumentację AlarmManager, aby uzyskać więcej informacji.
W tym tutorialu nauczmy się stworzyć czasomierz jednorazowe i powtarzające się stoper, a także, aby anulować powtarzający się stoper. Tutaj timer i alarm były używane zamiennie, ale w tym tutorialowym kontekście oba mają to samo znaczenie.
Przykład Kod:
Stwórzmy trzy przyciski rozpocząć powtarzanie timera anulować powtarzanie stoper i timer jednorazową w pliku układu. Przyciski te są dołączane za pomocą metod, takich jak startRepeatingTimer, cancelRepeatingTimer i onetimeTimer. Metody te zostaną zdefiniowane w klasie Activity. Plik układu pokazano poniżej (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>
Będziemy definiować BroadcastRcever, która obsługuje intencję zarejestrowaną w aplikacji AlarmManager. W danej klasie metoda onReceive() została zdefiniowana. Ta metoda jest wywoływana natychmiast po otrzymaniu zamiaru. Po otrzymaniu intencji próbujemy uzyskać dodatkowy parametr związany z tym intencją. Ten dodatkowy parametr jest zdefiniowany przez użytkownika, np. ONE_TIME, w zasadzie wskazuje, czy zamiar ten był powiązany z jednorazowym timerem czy z powtarzającym się. Po wyodrębnieniu wartości parametru ONE_TIME wyświetlany jest odpowiedni komunikat Toast. Określono również metody pomocnicze, które można wykorzystywać z innych miejsc za pomocą obiektów, np. Metody setAlarm(), cancelAlarm() i onetimeTimer(). Metody te można także zdefiniować gdzie indziej, aby wykonywać operacje na zegarze, np. Ustawić, anulować itd. Aby utrzymać ten samouczek w prosty sposób, zdefiniowaliśmy go w BroadcastReceiver.
setAlarm(): Ta metoda ustawia powtarzający się alarm za pomocą metody setRepeating(). setRepeating metoda() potrzebuje cztery argumenty:
typ alarmu, czas wyzwalania: ustawić go do obecnego czasu przedziału w milisekundach: w tym przykładzie mijamy 5 sekund (1000 * 5 milisekund) oczekiwaniu intencję: Jest zostanie zarejestrowany z tym alarmem. Kiedy alarm zostanie wyzwolony, oczekująca transmisja zostanie nadana. cancelAlarm(): Ta metoda anuluje poprzednio zarejestrowany alarm, wywołując metodę cancel(). Metoda cancel() przyjmuje wartość argumentu oczekuje na oczekiwanie. Element oczekujący powinien odpowiadać jednemu, tylko wtedy metoda cancel() może usunąć alarm z systemu.
onetimeTimer(): Ta metoda tworzy jednorazowy alarm. Można to osiągnąć, wywołując metodę set(). Metoda set() pobiera trzy argumenty:
typ alarmu czasie wyzwalania oczekiwaniu intencją
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);
}
}
Poniżej jest plik manifestu. Tutaj wymagane jest uprawnienie WAKE_LOCK, ponieważ blokada wybudzania jest używana podczas przetwarzania w metodzie onReceive() obecnej w klasie AlarmManagerBroadcastReceiver. AlarmManagerBroadcastReceiver został zarejestrowany jako odbiornik transmisji.
<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>
Teraz określmy klasę aktywności, która definiuje niektóre metody. Te metody będą obsługiwać kliknięcia przycisków. Tutaj w tej klasie tworzymy instancję AlarmManagerBroadcastReciever, która pomoże nam uzyskać dostęp do setAlarm(), cancelAlarm() i setOnetime(). Reszta kodu jest łatwa do zrozumienia.
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;
}
}
Gdy skończysz z kodowaniem, po prostu wykonać projekt i znajdziesz podobnego rodzaju aplikacji uruchomionej w emulatorze.
Proszę pobrać https://github.com/rakeshcusat/Code4Reference/tree/master/AndroidProjects/AlarmManagerExamplecode, jeśli potrzebujesz kodu referencyjnego.
Odniesienia: Samouczek na Android AlarmManager od naszego partnera JCG Rakesh Cusat na blogu Code4Reference.
http://code4reference.com/2012/07/tutorial-on-android-alarmmanager/
Źródłem Budzik - https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/src/com/android – fiction
uruchomieniu aplikacji na planie może również osiągnąć dzięki aplikacji [AutomateIt] (https://play.google.com/store/apps/details?id=AutomateIt.mainPackage&hl=en). Zegar można ustawić, a wybrana aplikacja uruchomi się o określonej godzinie. –
Wiele programów budzika (takich jak budzik Plus) obejmuje możliwość uruchomienia programu o określonej porze, jeśli chciałbyś, aby inny program wykonał dla ciebie ciężki lifting. – Zoot