Задать вопрос

Как сделать кастомный Lock Screen для Android 4?

Нужно сделать Lock screen, после запуска который отображается поверх стандартного (то есть, получается два лок скрина, это важно, именно не заменить стандартный, а добавить еще один). Пример — лок скрин плеера Poweramp. Подскажите или поделитесь туториалом, как теоретически такое реализовывается.
  • Вопрос задан
  • 4958 просмотров
Подписаться 10 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Android-разработчик
    12 месяцев
    Далее
  • Нетология
    Android-разработчик с нуля
    14 месяцев
    Далее
  • LearnQA
    Автоматизатор мобильных приложений
    9 недель
    Далее
Пригласить эксперта
Ответы на вопрос 1
@constv
при включении экрана будет секунду показывать черный экран, требуются разрешения
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"></uses-permission>
  <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

public class LockService extends Service {

	PowerManager.WakeLock wl;
	WindowManager mWindowManager;
	boolean isShowing;
	View mView;
	Thread mThread;

	BroadcastReceiver mReceiver = new BroadcastReceiver() {

		@Override
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			if (action.equals(Intent.ACTION_SCREEN_ON)) {

				if (isShowing) {
					if ((mThread == null)
							|| ((mThread != null) && (!mThread.isAlive())))
						mThread = new Thread() {

							@Override
							public void run() {
								// TODO Auto-generated method stub
								try {
									Thread.sleep(1000);
									mWindowManager.removeView(mView);
									isShowing = false;
								} catch (InterruptedException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}

							}

						};
					mThread.start();
				}
			}
			if (action.equals(Intent.ACTION_SCREEN_OFF)) {

				if (!isShowing) {
					WindowManager.LayoutParams params = new WindowManager.LayoutParams(
							WindowManager.LayoutParams.FILL_PARENT,
							WindowManager.LayoutParams.FILL_PARENT,
							WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
							WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
									|
									// Draws over status bar
									WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
							PixelFormat.TRANSLUCENT);

					mWindowManager.addView(mView, params);
					isShowing = true;
				}
			}
		}

	};


	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {

		mView = new View(this);
		mView.setBackgroundColor(Color.BLACK);

		mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);

		PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
		wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
				"com.google.syncloc.SyncLocService");
		wl.acquire();
	
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(Intent.ACTION_SCREEN_ON);
		intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
		//intentFilter.addAction(Intent.ACTION_USER_PRESENT);
		intentFilter.setPriority(999);
		registerReceiver(mReceiver, intentFilter);

		super.onCreate();
	}

	@Override
	public void onDestroy() {

		if (isShowing)
			mWindowManager.removeView(mView);
		if ((mThread != null) && (mThread.isAlive()))
			mThread.interrupt();

		wl.release();
		super.onDestroy();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {

		return START_STICKY;
	}

}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы