2014-04-14 40 views
7

Jak programować telefon z systemem Android z trybu uśpienia (zawiesić na mem)? Nie chcę mieć żadnego wakelocka, co oznacza, że ​​telefon przechodzi w "prawdziwy" sen z wyłączonym procesorem. Chyba mogę użyć jakiegoś mechanizmu RTC (zegar czasu rzeczywistego)?jak obudzić telefon z systemem Android ze snu?

Czy ktoś ma jakieś przykłady?

Dzięki.

+0

Kiedy dokładnie chcesz go obudzić? Po pewnym czasie oczekiwania? W określonym dniu i czasie? –

+0

Czy znalazłeś rozwiązanie? Czy uważasz, że jedna z odpowiedzi jest przydatna? – bendaf

+0

Jeśli znajdziesz odpowiedź na swoje pytanie, zaakceptuj jedną z poniższych lub zmodyfikuj swoje pytanie, aby móc Ci pomóc. – bendaf

Odpowiedz

0

Użyj aplikacji AlarmManager do nadania zamiaru w czasie, w którym chcesz wykonać pracę i aby urządzenie się obudziło. W BroadcastReceiver, albo wykonaj pracę, którą musisz wykonać (jeśli jest krótka), lub uzyskaj WakeLock (prawdopodobnie przez singleton), uruchom usługę, zlec niech serwis, a następnie otrzymasz usługę WakeLock.

Możesz przeczytać o tym tutaj: https://groups.google.com/forum/#!topic/android-developers/5--QRAPlFL0

+1

hmmm ..., wypróbowałem AlarmManager i wydawało mi się, że nie obudzi telefonu, jeśli telefon jest w "rzeczywistym" śnie (bez wakelock). – jiawen

+1

Jak obudzić telefon, gdy jest w trybie uśpienia. –

+0

@jiawen AlarmManager będzie działał, używając setAndAllowWhileIdle() lub setExactAndAllowWhileIdle() zamiast set(). Alarmy ustawione w ten sposób będą bradcastowane, nawet gdy urządzenie śpi. – Karthiksrndrn

7

Aby umożliwić odpowiednie działanie obudzić urządzenie i nie wymagają hasło/bezstykowa, trzeba tylko dodać kilka flagi. Aby dostać się, że należą do kodu:

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

Będzie to wake up swoją aktywność w aplikacji.

1

Właśnie napisałem aplikację, która może to zrobić, tu jest jakiś przykładowy kod: Najpierw tworzę AlarmManager i ustawić alarm na określony czas:

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 15); 
calendar.set(Calendar.MINUTE, 30); 
calendar.set(Calendar.SECOND, 0); 
// if the time is before now then add one day to it 
if(calendar.getTimeInMillis() < System.currentTimeMillis()) 
    calendar.setTimeInMillis(calendar.getTimeInMillis()+86400000); 
manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 0); 

muszę BroadcastReciever otrzymywać ten alarm. Do tego muszę umieścić w moim manifeście:

<application ...> 
    <receiver android:name="hu.bendaf.example.AlarmReceiver"/> 
... 
</application> 

i mam również klasę AlarmReciever, który rozpoczyna się mój główny aktywny na odbieranie:

public class AlarmReceiver extends BroadcastReceiver { 
    public static final String WAKE = "Wake up"; 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //Starting MainActivity 
     Intent myAct = new Intent(context, MainActivity.class); 
     myAct.putExtra(WAKE, true); 
     myAct.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(myAct); 
    } 
} 

i funkcji onCreate Moja aktywność w mam:

// Wake up phone if needed 
if(getIntent().hasExtra(AlarmReceiver.WAKE) && getIntent().getExtras().getBoolean(AlarmReceiver.WAKE)){ 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
         WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
         WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, 
         WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | 
         WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
         WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
} 

Ten kod budzi mój telefon o godzinie 15:30:00 (jest dziś lub jutro).

+0

Czy budzik budzi się tylko ze stanu wstrzymania, czy też z trybu wstrzymania? – ransh

+0

Ta odpowiedź mówi, że http://stackoverflow.com/a/5120225/3162918 gwarantuje również pracę w trybie uśpienia. Tak też potwierdziły się moje testy, alarm budził moją aplikację w każdej sytuacji, z wyjątkiem tego, że była wyłączona. – bendaf