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