1.activity如果要使用传感器,就必须实现SensorEventListener接口
2.得到传感器管理对象(sensormanager)
3.使用sensormanager.registerlistener 方法注册指定的传感器
4.在sensoreventlistener 接口中的onsensorchanged和onaccuracychanged方法中完成其他具体工作
@Override protected void onResume() { super.onResume(); StatService.onResume(this); // 加速度传感器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), // 还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等, // 根据不同应用,需要的反应速率不同,具体根据实际情况设定 SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); StatService.onPause(this); mSensorManager.unregisterListener(this); // 销毁传感器事件 }
Sensor参数下有多有多个常量,表示不同的传感器名称:
加速传感器(Sensor.TYPE_ACCELEROMETER)
磁场传感器(Sensor.TYPE_MAGNETIC_FLELD)
光线传感器 (Sensor.TYPE_LIGHT )
方向传感器 (TYPE_ORIENTATION)
SensorManager下有多个常量,表示获得传感器的数据速度。
SensorManager.SENSOR_DELAY_FASTEST: 以最快的速度获得传感器数据
SENSOR_DELAY_GAME: 适合与在游戏中获得传感器数据
SENSOR_DELAY_UI :适合于在ui空间中获得数据
SENSOR_DELAY_NORMAL: 以一般的速度获得传感器数据
@Override public void onSensorChanged(SensorEvent event) { if(PublicUtil.isWallPaperLocked(this))return; //屏幕如果锁定 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { String s = event.vaues[0]+ event.vaues[1]+event.vaues[2] } }
event.vaues 的长度为3,不一定每一个数组的元素都有意义,每个数组元素的含义不同
Accelerometer(加速传感器)
values[0] :沿x轴方向加速度
values[1]: 沿 y 轴方向的加速度
values[2] : 沿 z 轴方向的加速度,也就是重力加速度
Gravity(重力感应器)
values数组中的三个元素分别代表x轴,y轴,z轴的重力大小
Light(光线传感器)
values数组只有第一个元素values[0]有意义,表示光线的强度,最大值是120000.0f.
Gyroscope( 陀螺传感器)
values,分别表示x,y,z轴的旋转的角速度
Orientation(方向传感器)
values[0] : 该值表示方位,也就是手机绕着z轴旋转的角度. 0表示北(north),90表示动(east),180表示南(south),270表示西(west)
values[1]:表示倾斜度. x 轴倾斜时,该值变化,-180<= vaules[1] <= 180
values[2]: 表示沿y轴的滚动角度,-90<=values[2] <=90
在android2.3 sdk中,并不推荐使用sensor.TYPE_ORIENTATION,values[0]值,有时会出现异常。官方推荐使用SensorManager.getOrientaion的方法来获得正确的方向
1.android模拟器管理
mac下
http://www.qings.com/web/index.php/blogs/study/809-android
cd /Users/admin/Documents/android/android-sdk-macosx/tools
./android
一般在两个Acitivity之间传递数据使用简单的 Bundle 就可以做到, 但是只能传递一些基本类型的数据, 如果需要传递一个对象作为数据携带者, 就需要使用 Parcelable 接口, 实现该方法的类就可以传递到 Bundle 中去, 作为一个对象进行数据传递.
这里直接使用一个例子来说明如果实现 Parcelable 接口:
class Tweet implements Parcelable { public Tweet(Parcel in) { id = in.readString(); text = in.readString(); } // For interface Parcelable public int describeContents() { return 0; } public void writeToParcel(Parcel out, int flags) { out.writeString(id); out.writeString(text); } public static final Parcelable.Creator<Tweet> CREATOR = new Parcelable.Creator<Tweet>() { public Tweet createFromParcel(Parcel in) { return new Tweet(in); } public Tweet[] newArray(int size) { // return new Tweet[size]; throw new UnsupportedOperationException(); } };
首先实现 writeToParel() 抽象方法, 在其中将需要传递的数据写入到 Parcel out 中去, Parcel 有一整套的各种类型数据 write 和 read 方法. 一般性的是把该类的成员变量写入其中去, 当然你想附带传递点其他数据都是可以的(亲, 包邮哦), 这里没有限制, 唯一的限制是顺序, 这里写入的顺序决定了你读取时的顺序, 这可以考虑第3点即明.
实例化一个 Parcelable.Creator<E> ,在其中实现 createFromParcel() 方法, 该方法返回该类的一个实例, 则这个实例是通过读取 Parcel 中写入的数据来进行实例化对象的. 这里的例子是 return new Tweet(in) .
实现一个构造函数 其参数是 Parcel 类型, 这里例子里是 public Tweet(Parcel in) , 在其中利用 Parcel 里的数据来初始化对象, 而 Parcel 里有哪些数据,即数据的顺序都由我们第一步里面利用 write 方法写入操作来决定, 也就是说比如我在第一步里面先 writeString(id) , 然后再 writeString(text) , 那么我读的时候就必须按照这个顺序 , 先 readString() 出来的就是 id ,在read一个就是 text , 数据的类型和顺序都必须一一对应.