Активность с определенной высотой перед экраном блокировки

Я хочу отобразить активность перед экраном блокировки. Я попытался с этим кодом в моем методе onCreate:

super.onCreate(savedInstanceState);
Window window = getWindow();

window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);        
setContentView(R.layout.test);

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

super.onCreate(savedInstanceState);
Window window = getWindow();

LayoutParams layout = new WindowManager.LayoutParams();
layout.copyFrom(window.getAttributes());
layout.height = 200;

window.setAttributes(layout);
window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);

setContentView(R.layout.test);

Но тогда активность не видна перед экраном блокировки. Если я разблокирую телефон, активность отображается напрямую. Есть идеи, почему и как я могу это исправить?

РЕДАКТИРОВАТЬ: Я думаю, что это как-то связано с плавающей окна FLAG. Если этот флаг установлен (и я думаю, что он будет, когда я изменю размер), активность не отображается на экране блокировки. Но это только презумпция. Любые идеи или обходной путь, чтобы это исправить?

4 ответа

У меня было подобное требование при разработке моего музыкального плеера. В конечном итоге я делаю виджет блокировки экрана:

  1. У меня был прозрачный фон для моего виджета экрана блокировки.
  2. добавлена ​​кнопка "Нажмите для выхода на экран блокировки" внизу макета.
  3. Чтобы создать ощущение коробки, добавили белую границу вокруг кнопок.

Вы можете посмотреть его, загрузив мой музыкальный плеер "Fusion Music Player" из Google Play.

Прежде всего, сохранить в настройках Keyguard instanse.

После этого - программно отключить экран блокировки по умолчанию на вашем телефоне.

Затем реализует Service которые ловят, когда телефон переходит в состояние блокировки.

когда SCREEN_ON проверьте активность в стеке, если она существует, покажите ей, НЕТ - запустить singleTask,

Это единственный способ реализации Activity на Lockscreen. Потому что Google отвергает локскрины для макияжа и любые манипуляции с этим делом взломаны.

Вы можете сделать виджет и поставить его на экран блокировки или ниже написанным способом.

К вашему сведению: Google это моя блокировка для Android (Источник на code.google.com)

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

Ниже мой код в onStartCommand моего сервиса

WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

View mView = mInflater.inflate(R.layout.score, null);

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
        /* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
        PixelFormat.RGBA_8888);

mWindowManager.addView(mView, mLayoutParams);

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

Это можно сделать, определив пользовательскую тему в файле res/values/styles.xml (первоначально показано на Как создать прозрачную активность на Android?):

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:backgroundDimEnabled">false</item>
  </style>
</resources>

Затем добавив эту тему в свой ActivityМанифест декларации:

android:theme="@style/Theme.Transparent"

Далее вы можете создать макет (R.layout.lockscreen) для этого занятия, добавив это XML файл. Здесь вы указываете высоту в пикселях:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <FrameLayout 
        android:layout_width="match_parent"
        android:layout_height="200px"
        android:centerInParent="true" >

        <include layout="@layout/test" /> <!-- This points to your R.layout.test layout. -->

    </FrameLayout>

</RelativeLayout>

Наконец, просто используйте первый метод, показанный выше, чтобы показать Activity:

super.onCreate(savedInstanceState);
Window window = getWindow();

window.addFlags(LayoutParams.FLAG_SHOW_WHEN_LOCKED);        
setContentView(R.layout.lockscreen);
Другие вопросы по тегам