2011-08-13 14 views
7

Przelałem przez kilkanaście samouczków i odpowiedzi na forum o tym problemie, ale nadal nie udało mi się uzyskać kodu działającego razem. Postaram się odpowiedzieć prosto:Jak rozpocząć działanie z Menedżerem alarmów w systemie Android?

W jaki sposób korzystasz z Menedżera alarmów (w Androidzie API), aby rozpocząć działanie w określonym czasie? Możliwe będzie rozwiązanie tego problemu.

Moja ostatnia próba osiągnięcia tego jest poniżej.

(Import pominięte. Spodziewam MyActivity rozpocząć po 3 sekundach program jest otwarty, który nie ma. Nie ma żadnych komunikatów o błędach mówić.)

public class AndroidTest2Activity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Context context = this;//.getApplicationContext(); 

     AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); // CORRECT 
     Intent intent = new Intent(context, myReceiver.class); // CORRECT 
     PendingIntent pending = PendingIntent.getBroadcast(context, 0, intent, 0); // CORRECT 
     manager.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, pending); // CORRECT 

     setContentView(R.layout.main); 
    } 
} 

public class myReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Intent i=new Intent(context, myActivity.class); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 
    } 
} 

public class myActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d("", "Elusive success"); 
     setContentView(R.layout.main); 
    } 
} 

Wszelkie porady będą mile widziane.

Uwaga: Mam myReceiver w manifeście już

+2

Czy zarejestrowałeś odbiornik w swoim AndroidManifest? –

+0

Przepraszam, powinienem był o tym wspomnieć. Z linią , tak, zrobiłem. Daj mi znać, jeśli to zła linia. – BenLambell

Odpowiedz

0

Zgodnie z nazwą klasy Java konwencja zacząć Capital letter.So zmienić

"myReceiver" to "MyReceiver" and "myActivity" to "MyActivity". 

Następnie dodać swój odbiornik w pliku manifestu jak poniżej.

<application 
------------ 
<receiver android:name="MyReceiver"></receiver> 
--------------------- 
</application> 
+0

Przyjąłem właściwą konwencję Java, na wszelki wypadek. Miałem już jednak prawidłową linię (próbowałem używać .MyReceiver i MyReceiver jako android: nazwa - źródła, które widziałem, jak się wydaje). W każdym razie nie rozwiązuje to problemu, ale dzięki za Twoją sugestię. – BenLambell

4

Jak używać AlarmManager (w Android API), aby rozpocząć działalność w danym momencie?

dostarczyć PendingIntent na wezwanie set() który identyfikuje aktywność założyć. Albo rób to, co robisz, co powinno działać dobrze.

This sample project jest nieco skomplikowana, bo to 19 tutoriali głąb jednej z moich książek, ale jeśli spojrzeć na zajęciach jak EditPreferences, OnBootReceiver i OnAlarmReceiver, widać ten sam podstawowy przepis, który używasz powyżej. W takim przypadku mogłem po prostu użyć getActivity()PendingIntent, ale samouczek po tym daje użytkownikowi możliwość wyboru działania lub wyświetlenia Notification, więc BroadcastReceiver ma więcej sensu.

Poszukaj ostrzeżeń oprócz błędów w LogCat. Najprawdopodobniej twój odbiorca lub działanie nie znajduje się w twoim manifeście.

Należy zauważyć, że pojawienie się działalności z nikąd nie jest dobrym pomysłem. Cytowanie się z książki w pytaniu:

Wyświetlanie alarmu porze lunchu poprzez aktywność pełnoekranowym na pewno działa, i jeśli użytkownik patrzy na ekran, to ich uwagę. Jednak jest również dość uciążliwy, jeśli zdarzyło się, że używają telefonu natychmiastowo. Na przykład, jeśli piszą wiadomość tekstową podczas jazdy, twoja aktywność alarmowa pojawiająca się znikąd może rozpraszać ich na tyle, że spowodowała wypadek. Dlatego, w interesie bezpieczeństwa publicznego, powinniśmy dać użytkownikowi opcję, aby mieć bardziej subtelny sposób przypominania im o lunchu.

+0

Dzięki za szybką reakcję - faktycznie widziałem już Twój tutorial. Próbowałem zastępując Intent intent = new Intent (context, MyActivity.class); // CORRECT PendingIntent pending = PendingIntent.getActivity (context, 0, intent, 0); // CORRECT – BenLambell

+1

Przepraszam, spróbuj ponownie: – BenLambell

+0

Dziękuję za szybką odpowiedź - faktycznie widziałem już Twój samouczek (i umieścić odbiorcę w manifeście). Próbowałem podstawiania w \t Intencja intent = new Intent (kontekst, MyActivity.class); PendingIntent pending = PendingIntent.getActivity (context, 0, intent, 0); \t ale nadal nie ma żadnych dowodów działania MyActivity.Jednak otrzymuję następujący komunikat dziennika: \t (ActivityManager) Rozpoczęcie: Intent {flg = 0x4 cmp = com.ben/.MyActivity (ma dodatki)} z pid -1 – BenLambell

5

Jeśli ktoś się o to potknie - oto działający kod (Testowany w wersji 2.3.3 emulator):

public final void setAlarm(int seconds) { 
    // create the pending intent 
    Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); 
    // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, 
      intent, 0); 
    // get the alarm manager, and scedule an alarm that calls the receiver 
    ((AlarmManager) getSystemService(ALARM_SERVICE)).set(
      AlarmManager.RTC, System.currentTimeMillis() + seconds 
        * 1000, pendingIntent); 
    Toast.makeText(MainActivity.this, "Timer set to " + seconds + " seconds.", 
      Toast.LENGTH_SHORT).show(); 
} 

public static class AlarmReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     Log.d("-", "Receiver3"); 
    } 
} 

AndroidManifest.xml:

<receiver android:name="com.example.test.MainActivity$AlarmReceiver" > 
    </receiver> 

problemy z BenLambell kodzie:

  • albo:
    • Przesuń odbiornik do własnej pliku .java lub
    • Wykonaj wewnętrzny cl ass statyczne - może więc być dostępne z zewnątrz
  • Odbiornik nie jest zadeklarowany poprawnie w manifeście:
    • jeśli jest to wewnętrzna klasa użytkowania główną działalność: <receiver android:name="package.name.MainActivity$AlarmReceiver" ></receiver>
    • jeśli jest w osobnym pliku : <receiver android:name="package.name.AlarmReceiver" ></receiver>

Jeśli intencją jest, aby wyświetlić okno dialogowe, w odbiornik onReceive (jak ja): to niedozwolone - tylko czynności mogą uruchamiać okna dialogowe. Można to osiągnąć za pomocą dialog activity.

Można bezpośrednio zadzwonić działalność z AlarmManager:

Intent intent = new Intent(MainActivity.this, TriggeredActivity.class); 
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 
((AlarmManager) getSystemService(ALARM_SERVICE)).set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + seconds * 1000, pendingIntent); 
1

dodać to w android pliku mainifest i będzie miejmy nadzieję pracować

<activity android:name=".MyReceiver" /> 
     <receiver android:name=".MyReceiver"> </receiver> 
0

nie wysyłają żadnych transmisjach na odbiorniku Odbiornik i jeszcze więcej to lokks jak chcesz ekran powitalny lub coś takiego do tego celu możesz rozpocząć nowy wątek czekać na sekundę, a następnie rozpocząć aktywność w tym i dla tego okresu możesz zrobić to, co kiedykolwiek chcesz w interfejsie użytkownika wątek ...

Powiązane problemy