Wednesday, January 11, 2012

[Android] Tổng kết kinh nghiệm làm việc với service và activity

1. Một service có thể vẽ hình, đặt nó trên tất cả các View khác  và nhận event khi user touch vào màn hình nhờ thiết lập qua WindowManager.LayoutParams. Event service nhận được duy nhất là MotionEvent.ACTION_OUTSIDE.

2. Tọa độ khi bắt event bằng service bắt đầu từ (0,0) tại vị trí góc trên trái, dưới StatusBar. Trong StatusBar thì tọa độ y của nó là âm (từ -25 đến 0). Tọa độ bắt bằng View trong Activity bắt đầu từ (0,25) cũng tại điểm góc trên trái dưới StatusBar vừa nói. Bởi thế phải cộng thêm 25 vào tọa độ lấy được từ service nếu muốn sử dụng nó cho Activity.

3. Khi 1 activity không được active nữa (mở 1 activity khác từ nó), hệ thống gọi method onStop() trên nó. Hàm này khác với onDestroy (thoát bằng back...)

4. Nếu service của bạn có "nguy cơ" sẽ tương tác với Activity, tốt nhất là nên implement các method onBind, onUnbind. Chú ý nếu implement onBind mà ko implement onUnbind có thể dẫn đến lỗi "leaks service hay binder j đó"

5. Nếu cần update UI, nhớ dùng view.invalidate()

6. method bindService()  không phải là hàm cho kết quả "ngay lập tức" nên nếu dùng instance của service trả về qua binder để gọi method của service sẽ bị lỗi service đó là null.
Khắc phục: không gọi API của service ngay lập tức (vd 2 dòng này cùng nằm trong onCreate() chẳng hạn). Có thể gọi API trong onConnected, hay bindService trong onCreate()/onStart() và gọi API trong 1 listener nào đó.

No comments: