Как создать активность, которая видна в верхней части экрана блокировки - PullRequest
11 голосов
/ 16 февраля 2011

Я получаю уведомление о входящем 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 я просыпаюсь следующим образом:проснулся, но активность уведомлений не видна, пока я не разблокирую экран.

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

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

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

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

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

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

0 голосов
/ 03 декабря 2012

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

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..

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

0 голосов
/ 16 февраля 2011

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

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

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

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

...