12/08/2018, 14:34

[Android] Tạo một app lockScreen

I.Giới thiệu Khi chúng ta bật điện thoại thì màn hình hiển thị đầu tiền sẽ là LockScreen, có thể coi LockScreen là màn hình mà người dùng tiếp cận nhiều nhất, thỉnh thoảng lại mở xem thời gian, xem tin nhắn. Nhận thấy tầm quan trọng đó của LockScreen các nhà phát triển phần mềm thi nhau tạo ...

I.Giới thiệu

  • Khi chúng ta bật điện thoại thì màn hình hiển thị đầu tiền sẽ là LockScreen, có thể coi LockScreen là màn hình mà người dùng tiếp cận nhiều nhất, thỉnh thoảng lại mở xem thời gian, xem tin nhắn.
  • Nhận thấy tầm quan trọng đó của LockScreen các nhà phát triển phần mềm thi nhau tạo ra các Ứng dụng màn hình LockScreen theo các style của riêng họ. Họ không chỉ làm hiển thị các tính năng cơ bản như hiển thị thời gian hay các thông báo tin nhắn mà còn tích hợp các loại thông tin, quảng cáo, video, hình ảnh theo style của riêng họ.
  • LockScreen cũng là màn hình thể hiện được các ý tưởng của nhà phát triển một cách nhanh nhất, đơn giản nhất đến người dùng.
  • Chỉ cần Search keyword: "lock screen" trên appstore thì có thể thấy số lượng kết quả tìm kiếm vô cùng lớn, Các bạn chỉ cần chọn những ứng dụng phù hợp với mình mà sử dụng.
  • Nếu là 1 dev Android, mà lại muốn tạo cho mình 1 Ứng dụng màn hình lockScreen theo ý tưởng của chính mình thì hãy đọc bài viết dưới đây của mình.
  • Mình sẽ hướng dẫn các bước cơ bản để các bạn tạo 1 lockScreen.

II.Hướng dẫn tạo app LockScreen

  1. Các tính năng chính cần thiết

    • Khóa màn hình:
      • Đây là chức năng quan trọng nhất, cần thiết nhất của app LockScreen, nó phải đảm bảo được tính bảo mật tuyệt đối cho người dùng.
      • Như vậy màn hình Lock phải thiết kế làm sao mọi phương pháp mở màn hình đều phải qua nó kể cả reset máy.
      • Để đáp ứng được điều đó chúng ta hay tạo 1 màn hình Lock trên thành phần WindowManager (getSystemService(Context.WINDOW_SERVICE)) với thuộc tính addView cho nó.
    • Hiển thị time:
      • Tính năng này thì đơn giản hơn chỉ cần dùng 1 TextClock là được đảm bảo time luôn được update liên tục.
  2. Cách thực hiện:

    • Bước 1: Tạo 1 service để thực hiện điều khiển View của màn hình Lock.

      • Service này chịu trách nhiệm điều khiển đóng/ mở màn hình Lock.
      • Phải đăng ký 1 BroadcastReceiver trong AndroidMainifest.xml với action ( android.intent.action.BOOT_COMPLETED ) để khởi động server khi máy được reset, hay bị tắt nguồn.
          <receiver
          android:name=".receiver.BootComplete"
          android:enabled="true">
          <intent-filter>
              <action android:name="android.intent.action.BOOT_COMPLETED"></action>
          </intent-filter>
          </receiver>
      
    • Bước 2: Tạo view hiển thị màn hình Lock

      • View hiển thị màn hình Lock phải là 1 View đơn, hay nó không phải là 1 Activity, fragment hay 1 biển thể nào đó liên quan đến 2 thành phần đó
      • View có thể extends từ RelativeLayout
          public class LockView extends RelativeLayout {
          public LockView(Context context, ViewGroup viewGroup) {
              super(context);
          }
          public LockView(Context context, AttributeSet attrs) {
              super(context, attrs);
          }
      
    • Bước 3: Add View Lock vào Windowmanager

      • Tạo một LayoutParams: ở đây set các TYPE, FLAG để có thể hiển thị màn hình Lock đè lên tất cả các view khác.
           public WindowManager.LayoutParams getLayoutParams() {
               return new WindowManager.LayoutParams(
                   ViewGroup.LayoutParams.MATCH_PARENT,
                   ViewGroup.LayoutParams.MATCH_PARENT, 0, 0,
                   WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                   WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                       | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
                   PixelFormat.TRANSPARENT);
           }
      
      • Tạo SystemUiVisibility để điều khiển thanh Navigation: set các FLAG ẩn đi thanh Navigation, hay có thể hiểu là ẩn đi các phím Back, Home hiển thị trên màn hình.
          public int getSystemUiVisibility() {
              return View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                  | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                  | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                  | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
          }
      
      • Thực hiện các hàm xử lý on/off LockScreen: Các sử lý này được thực hiện trong Service điều khiển.
      • On LockScreen: - Ở đây mình sẽ add View Lock vào windowManager dựa trên các hàm hỗ trợ ở trên:
          public void onLockScreen(){
              WindowManager windowManager = (WindowManager) mContext.getSystemService(mContext.WINDOW_SERVICE);
              windowManager.addView(LockView.this, getLayoutParams());
              setSystemUiVisibility(getSystemUiVisibility());
          }
      
      • Off LockScreen: - On LockScreen là add View Lock vào windowManager còn Off chỉ đơn giản là remove cái view mình vừa add vào là ok:
          public void offLockScreen(){
               windowManager.removeView(this);
          }
      
    • Bước 4: Điều khiển tự động On/Off LockScreen

      • Nguyên lý hoạt động của On/Off này là khi ta tắt màn hình và bật lại thì màn hình Lock được hiển thị.
      • Như vậy mình cần đằng ký thêm 1 BroadcastReceiver với các action (ACTION_SCREEN_OFF / ACTION_SCREEN_ON) để bắt sự kiện bật tắt màn hình mà điều khiển trạng thái On/Off.
           <receiver
              android:name=".receiver.BootComplete"
              android:enabled="true">
              <intent-filter>
                  <action android:name="android.intent.action.BOOT_COMPLETED"></action>
                  <action android:name="android.intent.action.SCREEN_OFF"></action>
                  <action android:name="android.intent.action.SCREEN_OFF"></action>
              </intent-filter>
          </receiver>
      
      • Thực hiện điều khiển khi device vào các action này
           private BroadcastReceiver mReceiverSystem = new BroadcastReceiver() {
                      @Override
                      public void onReceive(Context context, Intent intent) {
                          String action = intent.getAction();
                          if (action.equals(Intent.ACTION_SCREEN_OFF) ) {
                                 offLockScreen()
                          }
                           if (action.equals(Intent.ACTION_SCREEN_ON) ) {
                                 onLockScreen();
                          }
                      }
            };
      
    • Bước 5: Các vấn đề liên quan đến điều khiển tương tác On/Off lock thì xử lý trên lớp LockView, hiển thị time cũng xử lý trên view này.

      • Với time chỉ cần thêm 1 TextLock Vào XML là xong.
         <TextClock
           android:layout_awidth="wrap_content"
           android:layout_height="wrap_content"
           android:format24Hour="HH:mm"/>
      

IV.Kết Thúc

  • Như vậy mình đã hướng dẫn các bước cơ bản nhất để tạo 1 app lockScreen. Việc tạo các style, các nội dung hiển thị thì các bạn tự thể hiện theo ý thích của cá nhân trên giao diện LockView là được.
  • Qua phần hướng dẫn trên các bạn cũng có thể học được thêm về lớp WindowManager, và các BroadcastReceiver của hệ thống. Trong quá trình làm các bước trên sẽ sảy ra các bug phát sinh, các bạn hãy tự mình tìm hiểu fix các bug đó để hiểu sâu hơn về bản chất các thành phần mình đã sử dụng
  • Xin cảm ơn các bạn đã đọc.
0