2011-06-22 2 views
3

Я использую обработчик для повторного запроса пользователя для ввода каждый, например. 5 минут. Когда устройство переходит в спящий режим, и экран заблокирован, как я могу разбудить устройство, когда мое приложение запрашивает у пользователя ввод? Я пробовал это, но он, похоже, не работает. Я добавил WAKE_LOCK разрешение в манифесте.Пробудите устройство, когда приложение предложит пользователю

class BtHandler extends Handler { 
    private PowerManager pm; 
    private WakeLock wl; 

    @Override 
    public void handleMessage(Message msg) { 
     pm = (PowerManager)FixedNode.this.getSystemService(Context.POWER_SERVICE); 
     if (!pm.isScreenOn()) { 
      wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "TAG"); 
      wl.acquire(); 
     } 
     FixedNode.this.setAlwaysDiscoverable(); 
     wl.release(); 
    } 
} 

Любые идеи?

Редактировать: Использование AlarmManager для трансляции пользовательских намерений.

mReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
     v.vibrate(300); 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
     WakeLock wl = null; 

     if (!pm.isScreenOn()) { 
      KeyguardLock kl = km.newKeyguardLock("TAG"); 
      kl.disableKeyguard(); 
      wl = pm.newWakeLock(
       PowerManager.SCREEN_BRIGHT_WAKE_LOCK | 
       PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG"); 
      wl.acquire(); 
     } 

     Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show(); 
     wl.release(); 
    } 
}; 

mFilter = new IntentFilter(ACTION_NAME); 

Intent mIntent = new Intent(ACTION_NAME);   
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mIntent, 0); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (120 * 1000), pendingIntent); 
Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show(); 
+0

Я не думаю, что можно обойти блокировку экрана с помощью приложения. – Haphazard

+0

Что вы предлагаете в этом случае? Есть ли способ сообщить пользователям, что им необходимо предоставить ввод? – springrolls

+0

Вам нужно будет держать экран на неопределенный срок. Это, конечно же, пережевывает батарею. – Haphazard

ответ

4

Обычно wakelock оленья кожа фактический поворот на на экран. Таким образом, вы должны получить блокировку бодрствование с

ACQUIRE_CAUSES_WAKEUP

в качестве дополнительного флага.

+0

Вы имеете в виду замену 'FULL_WAKE_LOCK' с' ACQUIRE_CAUSES_WAKEUP'? Это не работает. Когда я разбужу устройство, мое приложение странно уходит. Я что-то пропустил? – springrolls

+0

нет не замена. добавьте этот флаг как FULL_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUP –

+0

А, просто прочитайте несколько потоков, связанных с этим. Тем не менее, он все еще не работает. Но я прочитаю другие темы и попробую. Благодаря! PS: Примите, как ответ, когда я заставлю его работать;) – springrolls

3

Посмотрите на класс AlarmManager http://developer.android.com/reference/android/app/AlarmManager.html Это что-то вроде "хрон"

Ok, вот кусок рабочего кода - первый приходит класс активность:

import android.app.Activity; 
import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 

public class MainActivity extends Activity { 
    private WakeLock wl; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     //acquire wake lock 
     PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); 
     wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "TAG"); 
     wl.acquire(); 

     // schedule alarm 
     Intent i = new Intent(); 
     i.setAction(WakeReciever.WAKE_INTENT); 
     PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, i, 0); 

     AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
     am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 120000, 
       pIntent); 
    } 

    @Override 
    protected void onPause() { 
     wl.release(); 
     super.onPause(); 
    } 

} 

Далее идет BroadcastReceiver:

package com.test; 

import android.content.BroadcastReceiver; 
import android.content.Intent; 
import android.content.Context; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 

public class WakeReciever extends BroadcastReceiver { 
    public static final String WAKE_INTENT = "com.test.WAKE"; 


    /** 
    * @see android.content.BroadcastReceiver#onReceive(Context,Intent) 
    */ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //acquire wake lock 

     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG"); 
     wl.acquire(); 


     //start activity 
     Intent i = new Intent(); 
     i.setClassName("com.test", "com.test.MainActivity"); 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

     context.startActivity(i); 

     wl.release(); 
    } 
} 

И, наконец, не забудьте про файл манифеста:

<?xml version="1.0" encoding="UTF-8"?> 
<manifest android:versionCode="1" android:versionName="1.0" 
    package="com.test" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <uses-sdk android:minSdkVersion="8"/> 
    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:label="@string/app_name" android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
     <receiver android:name=".WakeReciever" android:enabled="true"> 
      <intent-filter> 
       <action android:name="com.test.WAKE"></action> 
      </intent-filter> 
     </receiver> 

    </application> 
</manifest> 
+2

Моя тревога не срабатывает, когда устройство переходит в спящий режим. Любой конкретный метод сигнализации, который вы бы предложили? – springrolls

+0

Я предлагаю вам использовать AlarmManager для генерации запланированных намерений и BroadcastReciever для активации блокировки слежения и запуска вашего приложения. Такой подход экономит время автономной работы гораздо больше, чем при использовании обработчика.BTW - в вашем коде, который я вижу, пробуют разбудить телефон - вы установили блокировку вокала, чтобы поддерживать телефон в активном состоянии? В противном случае ваше приложение даже не запускает этот код, когда телефон находится в спящем режиме. – piotrpo

+0

Да, я тоже пробовал это, но он ничего не делает. Как я уже сказал, будильник не срабатывает, когда устройство спит. См. Отредактированный пост. Я прикрепляю код. – springrolls

0

Из того, что я вижу, вы освобождаете замок после того, как приобрели его. Вот почему создается впечатление, что он не работает. Удалите его и поместите в другое место вне метода, который его приобретает.

mReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
     v.vibrate(300); 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
     WakeLock wl = null; 

     if (!pm.isScreenOn()) { 
      KeyguardLock kl = km.newKeyguardLock("TAG"); 
      kl.disableKeyguard(); 
      wl = pm.newWakeLock(
       PowerManager.SCREEN_BRIGHT_WAKE_LOCK | 
       PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG"); 
      wl.acquire(); 
     } 

     Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show(); 
    } 
}; 
Смежные вопросы