2013-05-02 1 views
3

Я делаю приложение, где запуск активности запланирован AlarmManager. Я хотел бы появиться, даже если экран выключен, и устройство заблокировано.Android включить экран

для того чтобы достигнуть этого набора флаги окна

final Window win = getWindow(); 
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
     | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
     | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
     | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 

И попытаться получить блокировку для экрана

if(_lock == null) 
{ 
    PowerManager pm = (PowerManager)App.getAppContext() 
      .getSystemService(Context.POWER_SERVICE); 

    _lock = pm.newWakeLock(
      PowerManager.FULL_WAKE_LOCK, "ScreenOn"); 
    _lock.acquire(); 
} 

_lock является PowerManager.WakeLock, который высвобождается в OnPause

protected void onPause() 
{ 
    if(_lock != null) 
    { 
      _lock.release(); 
    } 
} 

Этот код выполнен в onCreate и onRestart. Все работает нормально, если активность еще не запущена.

Но если он был запущен ранее, экран не отключается.

  • onRestart называется первым
  • onResume тогда называется
  • OnPause вызывается сразу

Так деятельность не запускается. Мой вопрос - как включить экран в такой ситуации. (Я использую API 15).

+0

Опубликовать больше своего кода - все это. Что - где _lock? и вы, вероятно, имеете в виду «экран не выключен *** на ***» –

+0

Итак, блокировка - это статический член _private? Вы уверены, что все работает нормально, если активность еще не запущена? Даже когда телефон alseep? Попытайтесь увеличить начальное время будильника - я уверен, что действие не будет работать. Когда я говорю больше кода, я имею в виду также Тревогу и приемник для тревоги - вы используете приемник для ararm no? И _again, вы, вероятно, имеете в виду, что «экран не поворачивается ** на **» _ –

ответ

0

Просто используйте код:

final Window win = getWindow(); 
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
     | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

в OnCreate() только и удалить все эти другие методы Activity-Cycle, если они что-нибудь еще, то это не делает.

Я не думаю, что вам нужен еще один код для его использования.

+0

Он работает отлично только в первый раз. Но когда я включу эту операцию в фоновом режиме, в следующий раз она ничего не сделает. – Seagull

2

Я придумал решение. Я создал новую активность, которая будет пытаться включить экран в onCreate(), а затем подождать, пока он не будет включен. Когда экран будет в порядке, он запустит активность, которая должна отображаться. Для того, чтобы сделать Android всегда создает эту деятельность

public class TurnOnScreen extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     if (pm.isScreenOn()) openActivity(); 
     else { 
      registerReceiver(mScreenOnReceiver, new IntentFilter(
        Intent.ACTION_SCREEN_ON)); 
      reciever_registered = true; 
      turnScreenOn(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (reciever_registered) { 
      unregisterReceiver(mScreenOnReceiver); 
      reciever_registered = false; 
     } 
    } 

    private boolean reciever_registered = false; 
    private final BroadcastReceiver mScreenOnReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      openActivity(); 
     } 
    }; 

    private void openActivity() { 
     Intent intent = new Intent(); 
     // .... 
     finish(); 
    } 

    private void turnScreenOn() { 
     final Window win = getWindow(); 
     win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED 
       | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 
     win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
       | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON); 
    } 
} 

Я до сих пор ищу объяснения, почему экран не включен в onRestart.

+0

Вы должны переместить свой код в 'onResume' и отменить регистрацию на' onPause' –

+0

Кажется, что не работает, если я помещаю этот код в onResume. – Seagull

+0

Я имею в виду код регистратора - он должен находиться в 'onResume' и отменить регистрацию в паузе: http: // stackoverflow.com/questions/7887169/android-when-to-register-unregister-broadcast-receiver-created-in-a-activity –

Смежные вопросы