2010-12-15 17 views
18

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

+0

Źródłem Budzik - https://android.googlesource.com/platform/packages/apps/DeskClock/+/master/src/com/android – fiction

+0

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. –

+0

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

Odpowiedz

12

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)); 
    } 
} 
+2

Myślę, że czegoś brakuje: am.set (AlarmManager.RTC_WAKEUP, futureDate.getTimeInMillis (), nadawca); –

+0

Mój obiekt Date nie ma metody "getTimeInMillis"() .. – flipperweid

11

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.

+0

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

1

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/

Powiązane problemy