Как создать действие, которое будет отображаться поверх экрана блокировки

Я получаю входящее уведомление C2DM, когда экран заблокирован. Я хотел бы разбудить экран и отобразить уведомление поверх экрана блокировки с помощью действия. Я запускаю действие уведомления из моего C2DM BroadcastReceiver следующим образом:

Intent new_intent= new Intent().setClass( context, EIAlertDialog.class );           
new_intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );      
new_intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );      
context.startActivity( new_intent );

и в методе onCreate действия уведомления я просыпаюсь на экране следующим образом:

PowerManager powerManager= (PowerManager)getSystemService( Context.POWER_SERVICE );
if (!powerManager.isScreenOn()) {
    mWakeLock= powerManager.newWakeLock(
                   PowerManager.FULL_WAKE_LOCK |
                   PowerManager.ACQUIRE_CAUSES_WAKEUP, 
                   "My Tag" )
    mWakeLock.acquire();
}

Экран просыпается, но активность уведомлений не видна, пока я не разблокирую экран.

Я понимаю, что могу избежать экрана блокировки с помощью приведенного ниже кода, но это нежелательно. Я хочу, чтобы пользователь разблокировал телефон, только если он заинтересован в чтении/ответе на уведомление.

getWindow().addFlags(
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
);

person Russell Mitchell    schedule 15.02.2011    source источник
comment
Похоже, вы используете Android. Было бы неплохо добавить тег Android, чтобы больше людей могли увидеть ваш вопрос.   -  person f20k    schedule 16.02.2011
comment
@ f20k, да, это Android, спасибо   -  person Russell Mitchell    schedule 16.02.2011


Ответы (3)


Это невозможно, насколько я знаю. Похоже, вы пытаетесь воспроизвести опыт iOS. Вы должны понимать, что у Android есть свои собственные соглашения, и нарушать их — это не то, что вы должны делать легкомысленно.

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

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

person num1    schedule 23.02.2012

Использование флагов — правильный способ сделать это, использование диспетчера питания — неправильно.

Ваши запросы кажутся мне противоречивыми: вы говорите, что хотите, чтобы активность появлялась поверх экрана блокировки (на самом деле мы этого не делаем, мы скрываем экран блокировки, чтобы активность была видна), и в то же время вы хотите, чтобы пользователь сначала разблокировал устройство.

Если вы думаете, что хотите, чтобы пользователь видел уведомление, прежде чем разблокировать устройство, чтобы увидеть вашу активность... Я действительно думаю, что вы этого не хотите. Уведомление очень маленькое (в строке состояния вверху), а следующее, которое отображается при его публикации, очень быстротечно. Это не будет хорошим опытом для тех, кто услышал звуковой сигнал или жужжание своего телефона и вытащил его, чтобы посмотреть, что происходит.

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

person hackbod    schedule 16.02.2011
comment
Я пытаюсь имитировать поведение iPhone. Когда телефон спит, входящее уведомление пробуждает телефон и отображает уведомление во всплывающем окне, но не разблокирует телефон. Если пользователь разблокирует телефон, откроется целевое приложение для уведомления. - person Russell Mitchell; 16.02.2011
comment
поэтому я хочу, чтобы пользователь видел уведомление перед разблокировкой устройства, но не в строке состояния, а скорее как всплывающее сообщение. - person Russell Mitchell; 16.02.2011

Попробуйте это в своей деятельности

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

    boolean screenOn = pm.isScreenOn();//check id screen is on

    if(!screenOn){//if not turn it on or wkaeup the screen

        final PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Screen On");
        wl.acquire();
        Toast.makeText(getBaseContext(), "This is WAKEUP SCREEN", Toast.LENGTH_SHORT).show();
        Thread timer = new Thread(){
            public void run(){
                try {
                    sleep(5000);
                } catch (InterruptedException e) {
                    // TODO: handle exception
                }finally{
                    wl.release();// release wakelock important
                }
            }
        };
        timer.start();
    }

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);//keep the activity running under lock screen..

Надеюсь это поможет

person Atif Farrukh    schedule 03.12.2012
comment
да, я использую его в своем приложении. хотя WakeLock находится в эксплуатации. - person Atif Farrukh; 03.12.2012
comment
Я получил предупреждение от IDE, чтобы я не использовал этот способ пробуждения и попытался использовать следующий: window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - person Mahmoud Mabrok; 08.06.2021