Sunday, January 13, 2019

Kiểm tra màn hình điện thoại có phải là home hay không (2)

Có những ứng dụng chạy liên tục trên màn hình chính. Ta cần ẩn nó đi khi có app mới mở ra, chỉ hiện lại ở màn hình home. Trong bài trước, ta đã dùng broadcast để kiểm tra màn hình, cách này rất tốn pin.
Bài này, ta dùng handler để làm.
Khai báo các biến.
private Handler handler = new Handler();
int ra=0;
WindowManager wm;
Tạo một hàm check như sau.
Runnable notification;
     private void check() {
     notification = new Runnable() {
     @TargetApi(Build.VERSION_CODES.GINGERBREAD)
          @SuppressLint("NewApi")
     public void run() {
     ActivityManager am = (ActivityManager)getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
String t =am.getRunningTasks(1).get(0).topActivity.getPackageName();
               int d = t.length();
                String duoi = t.substring(d-8, d);                       
                 if(duoi.equals("launcher")){
                  if(ra==1){
                   wm.addView(mView, myParams);
                    ra=0;
                    }
                   }
                   else{
                   if(ra==0){
 ((WindowManager) getSystemService(WINDOW_SERVICE))                                              .removeView(mView);
                   ra=1;
                    }
                   }
               check();
     }
     };
     handler.postDelayed(notification, 1000);
   }
Gọi hàm trong onCreate();
check();
Thêm đoạn sau để hủy khi thoát class.
@Override
    public void onDestroy(){
    handler.removeCallbacks(notification);
       super.onDestroy();
}
Thêm permission trong file manifest.xml
<uses-permission android:name="android.permission.GET_TASKS" />

Chi tiết dùng windowManager để tạo view bạn có thể xem ở bài kiểm tra màn hình home nhưng dùng broadcastReciver.
Thử nghiệm thực tế trên điện thoại với cùng mức pin ban đầu, nếu không cài app, để yên 10 giờ sẽ mất 8% dung lượng pin. Nếu cài ứng dụng chạy kiểm tra với handler, sau 10 giờ sẽ mất 11% dung lượng pin. Nếu dùng broadcast sẽ mất 71% dung lượng pin.
Điều này thật lạ lùng, cùng check 1 giây một lần mà broadcast ngốn sạch pin sau hơn nửa ngày còn handler chỉ ảnh hưởng rất ít.

Nên nếu ứng dụng buộc dùng service chạy liên tục trên màn hình chính, ta có thể dùng handler như một cách chấp nhận được.

No comments:

Post a Comment