Android代码片段

1在需要监听的activity中重写onKeyDown()。
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();
		}
	}

找了四个手机测试,木有问题哈!!

再次感谢大家的分享!!!

待续

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值