您现在的位置是:首页 > 开发类 > 移动开发移动开发

Android-Sensor源码分析总结

2021-06-05 09:11:14移动开发人已围观

简介本文概要性地介绍如下内容1,类架构框图2,Sensor Server初始化过程3,Sensor Client初始化过程与Server端通信的建立过程4,应用开发总结1,类架构框图如上图所示,Sensor Framework相对于Audio等模块来说,比较简单,摘录几个关键类的设计意图如下:/** * <p> * SensorManager lets you access the device's {@link android.hardware.Sensor *

本文概要性地介绍如下内容
1,类架构框图
2,Sensor Server

  • 初始化过程

3,Sensor Client

  • 初始化过程
  • 与Server端通信的建立过程

4,应用开发总结

1,类架构框图

如上图所示,Sensor Framework相对于Audio等模块来说,比较简单,摘录几个关键类的设计意图如下:

/**
 * <p>
 * SensorManager lets you access the device's {@link android.hardware.Sensor
 * sensors}. Get an instance of this class by calling
 * {@link android.content.Context#getSystemService(java.lang.String)
 * Context.getSystemService()} with the argument
 * {@link android.content.Context#SENSOR_SERVICE}.
 * </p>
 * <p>
 * Always make sure to disable sensors you don't need, especially when your
 * activity is paused. Failing to do so can drain the battery in just a few
 * hours. Note that the system will <i>not</i> disable sensors automatically when
 * the screen turns off.
 * </p>
 * <p class="note">
 * Note: Don't use this mechanism with a Trigger Sensor, have a look
 * at {@link TriggerEventListener}. {@link Sensor#TYPE_SIGNIFICANT_MOTION}
 * is an example of a trigger sensor.
 * </p>
 * <pre class="prettyprint">
 * public class SensorActivity extends Activity, implements SensorEventListener {
 *     private final SensorManager mSensorManager;
 *     private final Sensor mAccelerometer;
 *
 *     public SensorActivity() {
 *         mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
 *         mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
 *     }
 *
 *     protected void onResume() {
 *         super.onResume();
 *         mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
 *     }
 *
 *     protected void onPause() {
 *         super.onPause();
 *         mSensorManager.unregisterListener(this);
 *     }
 *
 *     public void onAccuracyChanged(Sensor sensor, int accuracy) {
 *     }
 *
 *     public void onSensorChanged(SensorEvent event) {
 *     }
 * }
 * </pre>
 *
 * @see SensorEventListener
 * @see SensorEvent
 * @see Sensor
 *
 */
public abstract class SensorManager {
        ......
}
/**
 * Sensor manager implementation that communicates with the built-in
 * system sensors.
 *
 * @hide
 */
public class SystemSensorManager extends SensorManager {
        ......
}
class ISensorServer : public IInterface
{
public:
    DECLARE_META_INTERFACE(SensorServer);
 
    virtual Vector<Sensor> getSensorList(const String16& opPackageName) = 0;
    virtual sp<ISensorEventConnection> createSensorEventConnection(const String8& packageName,
             int mode, const String16& opPackageName) = 0;
    virtual int32_t isDataInjectionEnabled() = 0;
};
/**
 * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
 * and the fields of this data structure must begin with hw_module_t
 * followed by module specific information.
 */
struct sensors_module_t {
    struct hw_module_t common;
 
    /**
     * Enumerate all available sensors. The list is returned in "list".
     * @return number of sensors in the list
     */
    int (*get_sensors_list)(struct sensors_module_t* module,
            struct sensor_t const** list);

    /**
     *  Place the module in a specific mode. The following modes are defined
     *
     *  0 - Normal operation. Default state of the module.
     *  1 - Loopback mode. Data is injected for the the supported
     *      sensors by the sensor service in this mode.
     * @return 0 on success
     *         -EINVAL if requested mode is not supported
     *         -EPERM if operation is not allowed
     */
    int (*set_operation_mode)(unsigned int mode);
};

2,Sensor Server的初始化过程

3,Sensor Client

3.1 初始化过程

3.2 与Server端通信的建立过程

4,应用开发总结

其中SensorEventListener的定义摘录如下,更多应用层开发细节请参考google 官方文档。

/**
* Used for receiving notifications from the SensorManager when
* sensor values have changed.
*/
public interface SensorEventListener {

   /**
    * Called when sensor values have changed.
    * <p>See {@link android.hardware.SensorManager SensorManager}
    * for details on possible sensor types.
    * <p>See also {@link android.hardware.SensorEvent SensorEvent}.
    * 
    * <p><b>NOTE:</b> The application doesn't own the
    * {@link android.hardware.SensorEvent event}
    * object passed as a parameter and therefore cannot hold on to it.
    * The object may be part of an internal pool and may be reused by
    * the framework.
    *
    * @param event the {@link android.hardware.SensorEvent SensorEvent}. 
    */
   public void onSensorChanged(SensorEvent event);

   /**
    * Called when the accuracy of the registered sensor has changed.
    *
    * <p>See the SENSOR_STATUS_* constants in
    * {@link android.hardware.SensorManager SensorManager} for details.
    *
    * @param accuracy The new accuracy of this sensor, one of
    *         {@code SensorManager.SENSOR_STATUS_*}
    */
   public void onAccuracyChanged(Sensor sensor, int accuracy);
}
m accuracy The new accuracy of this sensor, one of
    *         {@code SensorManager.SENSOR_STATUS_*}
    */
   public void onAccuracyChanged(Sensor sensor, int accuracy);
}

文章来源:https://blog.csdn.net/m0_57624732/article/details/117521477

Tags:android 移动开发 面试 

很赞哦! ()

随机图文

文章评论

留言与评论(共有 0 条评论)
   
验证码:

本栏推荐

站点信息

  • 文章统计247968篇文章
  • 浏览统计18356次浏览
  • 评论统计1个评论
  • 标签管理标签云
  • 统计数据:统计代码
  • 微信公众号:扫描二维码,关注我们