1在需要监听的activity中重写onKeyDown()。
5 Android中home键监听
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.getRepeatCount() == 0) {
//do something...
return true;
}
return super.onKeyDown(keyCode, event);
}
同样的方法可以监听HOME等键。
2 只要触摸键盘就会被触发
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && event.getAction() == KeyEvent.ACTION_UP){
Toast.makeText(context, "挂断电话", Toast.LENGTH_SHORT).show();
return true;
}
return super.onKeyDown(keyCode, event);
}
3 关于动态注册广播
注册广播有两种方法,其中一种方法是在代码中注册广播,称之为动态注册,这样注册的好处是提高了广播注册的灵活性,但是缺点是必须记得取消广播的注册,如果忘记注册会包内存泄露的异常,原因是那个注册广播的Activity还在被使用,内存不能被回收,
虽然内存没有被回收,但是广播接收者已经被销毁,不能够继续接受广播。虽然不影响程序的运行,但是最好避免出现内存溢出的异常,毕竟看着一大顿红色的错误让人揪心!!!
4 ListView添加headView后,控制headView返回顶端
private boolean isaddHeaderView = false;
@Override
public void addHeaderView(View v) {
super.addHeaderView(v);
isaddHeaderView = true;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int y = (int) ev.getY();
final int x = (int) ev.getX();
int position = pointToPosition(x, y);
Log.i("Test", "position = " + position);
if(position==0){
if(isaddHeaderView){
int firstVisablePos = getFirstVisiblePosition();
View firstView = this.getChildAt(firstVisablePos);
int bottom = firstView.getBottom();
int height = firstView.getHeight();
if (bottom == height) {
return false;
}
else if (bottom < height) {
// smoothScrollToPosition(0);
return false;
}
}
}
return super.onInterceptTouchEvent(ev);
}
5 Android中home键监听
以前一直以为home键和back一样,都能在onkey事件中监听,但是实际操作中在onkey事件中其实并不能监听到home键的事件,原因是home键事件系统拦截了,应用层是不能获得home键的事件的。
其实home键的捕获对应用层没有太大的意义,但是在特殊的情况下还是需要的,既然直接获得home键事件不可以,那就佳间接的获得
1、定义BroadcastReceiver 用于接收 action: android.intent.action.CLOSE_SYSTEM_DIALOGS
public class HomeKeyPressedReceiver extends BroadcastReceiver {
private static final String TAG = "TestReceiver";
private static int count = 0;
@Override
public void onReceive(Context context, Intent intent) {
String reason = intent.getStringExtra("reason");
Log.d(TAG, "HomeKeyPressedReceiver reason is " + reason);
if ("homekey".equals(reason)) {
Log.d(TAG, "homekey click count = " + count++);
}
}
}
2、注册receiver到系统中
<receiver android:label="HomeKeyPressedReceiver"
android:name="HomeKeyPressedReceiver" android:enabled="true"
android:exported="true">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.BOOT_COMPLETE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.CLOSE_SYSTEM_DIALOGS" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SCREEN_ON" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF" />
</intent-filter>
</receiver>
测试过了确实可以实现,但是在Android4.0的手机上就不行了,后来又在网上找资料,无意间发现下面一段话
想在程序中监听屏幕SCREEN_ON和SCREEN_OFF这两个action,实现屏幕锁定状态的监听,从而实现自己的相应功能。比较奇怪的是这两个action只能通过代码的形式注册才能被监听到,在AndroidManifest.xml中注册根本监听不到。去网上查了一下,原来是PowerManager那边在发这个广播的时候做了限制,限制只有register到代码中的receiver才能接收。特此记录!
之后将广播在代码注册,可以了,原来有些广播必须在代码中注册才可以哈!!!一下即我在代码中注册的代码
private void registerConnectReceiver(){
try {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
filter.setPriority(1000);
this.registerReceiver(receiver, filter);
} catch (Throwable e) {
e.printStackTrace();
}
}
找了四个手机测试,木有问题哈!!
再次感谢大家的分享!!!
待续