監(jiān)視傳感器事件
要監(jiān)視原始的傳感器數(shù)據(jù),你需要實(shí)現(xiàn)兩個(gè)通過SensorEventListener接口暴露的回調(diào)方法:onAccuracyChanged()和onSensorChanged()。Android系統(tǒng)在任何發(fā)生下列事情的時(shí)候都會(huì)調(diào)用這兩個(gè)方法:
1. 傳感器精度的改變:
這種情況中,系統(tǒng)會(huì)調(diào)用onAccuracyChanged()方法,它提供了你要引用的發(fā)生精度變化的Sensor對(duì)象。精度使用以下四個(gè)狀態(tài)常量之一來(lái)代表的:
SENSOR_STATUS_ACCURACY_LOW
SENSOR_STATUS_ACCURACY_MEDIUM
SENSOR_STATUS_ACCURACY_HIGH
SENSOR_STATUS_UNRELIABLE
2. 傳感器報(bào)告新的值:
這種情況中,系統(tǒng)會(huì)調(diào)用onSensorChanged()方法,它提供了一個(gè)SensorEvent對(duì)象。SensorEvent對(duì)象包含了有關(guān)新的傳感器數(shù)據(jù)的信息,包括:數(shù)據(jù)的精度、產(chǎn)生數(shù)據(jù)的傳感器、產(chǎn)生數(shù)據(jù)時(shí)的時(shí)間戳、以及傳感器記錄的新的數(shù)據(jù)。
下列代碼顯示了如何使用onSensorChanged()方法來(lái)監(jiān)視來(lái)自亮度傳感器的數(shù)據(jù)。這個(gè)例子在一個(gè)TextView中顯示原始的傳感器數(shù)據(jù):
publicclassSensorActivityextendsActivityimplementsSensorEventListener{privateSensorManager mSensorManager;privateSensor mLight;@Override publicfinalvoid onCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);mSensorManager =(SensorManager)getSystemService(Context.SENSOR_SERVICE);mLight =mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);} @Overridepublicfinalvoid onAccuracyChanged(Sensor sensor,intaccuracy){ //Do something here if sensor accuracy changes.} @OverridepublicfinalvoidonSensorChanged(SensorEventevent){// The light sensor returns a singlevalue. //Many sensors return 3 values, one for eachaxis. floatlux=event.values[0];// Do something with this sensor value. }@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mLight,SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
}
在這個(gè)例子中,在調(diào)用registerListener()方法時(shí),指定了默認(rèn)的數(shù)據(jù)延遲(SENSOR_DELAY_NORMAL)。數(shù)據(jù)延遲(或采樣率)控制著傳感器事件通過onSensorChanged()回調(diào)方法發(fā)送給你的應(yīng)用程序的時(shí)間間隔。默認(rèn)的數(shù)據(jù)延遲適用于監(jiān)視典型的屏幕方向的變化,它所使用的時(shí)間延遲是200,000毫秒。你能夠指定其他的數(shù)據(jù)延遲類型,如SENSOR_DELAY_GAME(20,000毫秒延遲)、SENSOR_DELAY_UI(60,000毫秒延遲)、或者是SENSOR_DELAY_FASTEST(0毫秒延遲)。Android3.0(APILevel 11)以后,你也能夠使用一個(gè)絕對(duì)值(以毫秒的形式)來(lái)指定延遲。
你所指定的延遲只是建議性的延遲。Android系統(tǒng)和其他應(yīng)用程序都能夠修改這個(gè)延遲。作為最好的實(shí)踐,你應(yīng)該指定你所需要的最大延遲,因?yàn)橄到y(tǒng)通常會(huì)使用比你指定的要小的延遲(也就是說,你應(yīng)該選擇你的應(yīng)用所需要的最低的采樣率)。使用較大的延遲會(huì)降低處理器的負(fù)載,同時(shí)也因此降低了電量的損耗。

有沒有公開的方法用于判斷傳感器框架把傳感器事件發(fā)送給你的應(yīng)用程序的頻率;但是,你能夠使用前后兩個(gè)傳感器事件的時(shí)間戳來(lái)計(jì)算采樣率。一旦你設(shè)置了采樣率(延遲)就不要改變。如果因?yàn)槟承┰蛐枰淖儯敲淳捅仨毾茸N然后在重新注冊(cè)傳感器監(jiān)聽器。
在這個(gè)例子中還要重點(diǎn)關(guān)注的是:使用onResume()和onPause()回調(diào)方法來(lái)注冊(cè)和注銷傳感器監(jiān)聽事件。作為最好的實(shí)踐,你始終應(yīng)該在不需要的時(shí)候禁用傳感器,尤其是在Activity被掛起的時(shí)候。如果不這樣做,因?yàn)橛行﹤鞲衅饔泻艽蟮碾娏啃枨螅虼藭?huì)很快的消耗掉電池電量。在屏幕關(guān)閉的時(shí)候,系統(tǒng)不會(huì)自動(dòng)的禁用傳感器。
愛華網(wǎng)

