Để
bắt sự kiện nút home, ta có thể dùng onWindowFocusChanged để biết ứng dụng đã mất focus, hoặc ta tạo
một hàm nghe riêng nút home như sau.
public class HomeWatcher {
static final String TAG = "hg";
private Context mContext;
private IntentFilter mFilter;
private
OnHomePressedListener mListener;
private InnerReceiver mReceiver;
public
HomeWatcher(Context context) {
mContext = context;
mFilter = new
IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
}
public void
setOnHomePressedListener(OnHomePressedListener listener) {
mListener = listener;
mReceiver = new
InnerReceiver();
}
public void startWatch() {
if (mReceiver != null) {
mContext.registerReceiver(mReceiver, mFilter);
}
}
public void stopWatch() {
if (mReceiver != null) {
mContext.unregisterReceiver(mReceiver);
}
}
class InnerReceiver extends
BroadcastReceiver {
final String SYSTEM_DIALOG_REASON_KEY = "reason";
final String SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS = "globalactions";
final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
@Override
public void
onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY);
if (reason != null) {
//Log.e(TAG,
"action:" + action + ",reason:" + reason);
if (mListener != null) {
if (reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) {
mListener.onHomePressed();
} else if (reason
.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
mListener.onHomeLongPressed();
}
}
}
}
}
}
}
Tại
class chính, khai báo biến.
HomeWatcher mHomeWatcher = new HomeWatcher(this);
Copy hàm sau vào trên ngoặc đóng cuối cùng.
public interface
OnHomePressedListener {
void onHomePressed();
void onHomeLongPressed();
}
Copy vào trong
onCreate()
mHomeWatcher.setOnHomePressedListener(new
OnHomePressedListener() {
@Override
public void onHomePressed()
{
finish();
Intent intent = new
Intent(getBaseContext(), ac.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT)
startActivity(intent);
}
@Override
public void
onHomeLongPressed() {
}
});
mHomeWatcher.startWatch();
@Override
protected void onDestroy() {
mHomeWatcher.stopWatch();
super.onDestroy();
}
Nếu bạn canh các nút trên
điện thoại theo cách sau.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode ==
KeyEvent.KEYCODE_HOME)) {
return true;
}
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
return true;
}
if ((keyCode ==
KeyEvent.KEYCODE_MENU)) {
return false;
}
return super.onKeyDown(keyCode, event);
}
Thực tế nút home
sẽ không có phản ứng gì khi ấn nó. Nếu thêm đoạn sau vào.
@Override
public void onPause() {
super.onPause();
//do smt
}
Lúc này nút home sẽ có thể bắt được sự kiện chạm vào, lệnh xảy ra
khi ấn nút home sẽ là lệnh ở trong onPause(). Tuy nhiên cả nút home và nút menu
đều có phản ứng như nhau nếu trong KEYCODE_MENU bạn để là return true; muốn phân biệt chúng phải để là return false; và đặt thêm các biến phụ.
Dùng cách trên chỉ có nút home phản ứng khi chạm
vào.
No comments:
Post a Comment