Активность с определенной высотой перед экраном блокировки
Я хочу отобразить активность перед экраном блокировки. Я попытался с этим кодом в моем методе 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 ответа
У меня было подобное требование при разработке моего музыкального плеера. В конечном итоге я делаю виджет блокировки экрана:
- У меня был прозрачный фон для моего виджета экрана блокировки.
- добавлена кнопка "Нажмите для выхода на экран блокировки" внизу макета.
- Чтобы создать ощущение коробки, добавили белую границу вокруг кнопок.
Вы можете посмотреть его, загрузив мой музыкальный плеер "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);