Я разрабатываю пользовательские lockscreen app.its, работающие нормально в версии 4.0, но выше 4.0, когда мы нажимаем кнопку "домой", приложение останавливается. Есть ли какое-либо решение для этого приложения не будет останавливаться при нажатии кнопки "домой", пока не откроется экран. go locker app)
Создание пользовательского LockScreen в android
Ответ 1
Еще один способ разработки приложения LockScreen - использовать Представления, позвольте мне объяснить это.
Прежде всего, вы можете "отключить" в некоторых устройствах экран блокировки системы, отключив KEYGUARD
:
((KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock("IN").disableKeyguard();
Вы должны поместить эту строку кода в свой Service
.
После этого вы можете запускать действие каждый раз, когда экран отключается:
public class AutoStart extends BroadcastReceiver {
public void onReceive(Context arg0, Intent arg1) {
if(arg1.getAction().equals("android.intent.action.SCREEN_OFF")) {
Intent localIntent = new Intent(arg0, LockScreen.class);
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
localIntent.addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
arg0.startActivity(localIntent);
}
}
}
Если вы прочитали документацию для WindowManager.LayoutParams.TYPE_SYSTEM_ERROR
, она объясняет, что это тип внутренних системных окон ошибок, появляется поверх всего, что может. В многопользовательских системах отображается только в пользовательском окне пользователя.
Итак, теперь у вас есть активность поверх всего, но нажатие кнопки HOME
выйдет из действия.
Здесь вы увидите Представления. Вы можете раздуть представление из ресурса макета и добавить его в WindowManager
как TYPE_SYSTEM_ERROR
, так что это будет поверх всего. И поскольку вы можете контролировать, когда удалять этот Вид, лучшее место находится в onDestroy
вашего Activity
, потому что нажатие кнопки HOME
приостанавливает вашу активность, и просмотр будет по-прежнему быть видимым.
public WindowManager winManager;
public RelativeLayout wrapperView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT);
this.winManager = ((WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE));
this.wrapperView = new RelativeLayout(getBaseContext());
getWindow().setAttributes(localLayoutParams);
View.inflate(this, R.layout.lock_screen, this.wrapperView);
this.winManager.addView(this.wrapperView, localLayoutParams);
}
public void onDestroy()
{
this.winManager.removeView(this.wrapperView);
this.wrapperView.removeAllViews();
super.onDestroy();
}
Чтобы избежать появления панели уведомлений, я добавил флаги FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREEN
, чтобы использовать все события указателя.
Не забудьте добавить эти две строки в ваш манифест:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Отсюда вам просто нужно добавить логику вашего приложения Lock Screen, чтобы пользователь мог использовать свой смартфон:)
Ответ 2
Пользовательская пусковая установка - это в основном приложение (вы можете заставить его вести себя как сетка, список, реализовать собственное перетаскивание и т.д.), тогда вам нужно только добавить эти строки в фильтр намерений основной деятельности, при этом после установки вашего приложения и нажатия кнопки "домой" ваше приложение появится в списке доступных экранов.
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
То, что я не могу найти, - это способ заменить экран блокировки, и взломать как отключить экран блокировки на телефоне, а использование активности в пользовательской пусковой установке фактически не заменяет lockscreen ^^
Ответ 3
Вы можете использовать метод ниже, чтобы отключить ключ Home в android:
@Override
public void onAttachedToWindow() {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
super.onAttachedToWindow();
}
Ответ 4
Я развиваюсь на Samsung Galaxy S4 5.0, и то, что сработало для меня, просто меняло getWindow().setFlags(..)
на getWindow().addFlags(..)
Ответ 5
Я думаю, что в первую очередь вы должны спросить себя, действительно ли вы хотите захватить домашний ключ. Иногда вам это может понадобиться. Но я думаю, что размещение приложения на экране блокировки Android, позволяющее домашнему ключу действовать нормально и позволяя основному экрану блокировки Android заботиться о защите паролем устройства, - это то, что вы действительно хотите во многих случаях (если вы не хотите изменить это делается по умолчанию).
Нижняя строка, позволяющая отображать приложение на экране блокировки Android, довольно близка к написанию собственного пользовательского экрана блокировки. И это явно проще, так как вам не нужно самостоятельно управлять паролями. Не говоря уже о том, что это безопаснее и надежнее, так как вы не захватываете домашний ключ.
Я сделал это так, и он работает очень хорошо. Вы можете увидеть подробности здесь:
показать веб-сайт на экране блокировки Android
Вопрос заключается в отображении веб-сайта на экране блокировки, так как это меня заинтересовало, но ответ более общий, он работает с любым приложением. Вы можете увидеть здесь приложение, которое в Google Play было написано так:
https://play.google.com/store/apps/details?id=com.a50webs.intelnav.worldtime