PhoneGap for Android平台源码示例

对于初入Android开发的网友可以很好的了解代码规范,同时很多成熟的可复用代码希望对大家有帮助。PhoneGap内部数据传递使用了JSON,比如PhoneGap中指南针部分源码如下:

public class CompassListener extends Plugin implements SensorEventListener {

public static int STOPPED = 0;
public static int STARTING = 1;
public static int RUNNING = 2;
public static int ERROR_FAILED_TO_START = 3;

public long TIMEOUT = 30000;  // Timeout in msec to shut off listener

int status;       // status of listener
float heading;      // most recent heading value
long timeStamp;      // time of most recent value
long lastAccessTime;    // time the value was last retrieved

private SensorManager sensorManager;// Sensor manager
Sensor mSensor;      // Compass sensor returned by sensor manager

/**

  • Constructor.
    */
    public CompassListener() {
    this.timeStamp = 0;
    this.setStatus(CompassListener.STOPPED);
    }

/**

  • Sets the context of the Command. This can then be used to do things like
  • get file paths associated with the Activity.
  • @param ctx The context of the main Activity.
    */
    public void setContext(PhonegapActivity ctx) {
    super.setContext(ctx);
    this.sensorManager = (SensorManager) ctx.getSystemService(Context.SENSOR_SERVICE);
    }

/**

  • Executes the request and returns PluginResult.
  • @param action The action to execute.
  • @param args JSONArry of arguments for the plugin.
  • @param callbackId The callback id used when calling back into JavaScript.
  • @return A PluginResult object with a status and message.
    */
    public PluginResult execute(String action, JSONArray args, String callbackId) {
    PluginResult.Status status = PluginResult.Status.OK;
    String result = “”;

try {
if (action.equals(“start”)) {
this.start();
}
else if (action.equals(“stop”)) {
this.stop();
}
else if (action.equals(“getStatus”)) {
int i = this.getStatus();
return new PluginResult(status, i);
}
else if (action.equals(“getHeading”)) {
// If not running, then this is an async call, so don’t worry about waiting
if (this.status != RUNNING) {
int r = this.start();
if (r == ERROR_FAILED_TO_START) {
return new PluginResult(PluginResult.Status.IO_EXCEPTION, ERROR_FAILED_TO_START);
}
// Wait until running
long timeout = 2000;
while ((this.status == STARTING) && (timeout > 0)) {
timeout = timeout - 100;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (timeout == 0) {
return new PluginResult(PluginResult.Status.IO_EXCEPTION, AccelListener.ERROR_FAILED_TO_START);
}
}
float f = this.getHeading();
return new PluginResult(status, f);
}
else if (action.equals(“setTimeout”)) {
this.setTimeout(args.getLong(0));
}
else if (action.equals(“getTimeout”)) {
long l = this.getTimeout();
return new PluginResult(status, l);
}
return new PluginResult(status, result);
} catch (JSONException e) {
e.printStackTrace();
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
}
}

/**

  • Identifies if action to be executed returns a value and should be run synchronously.

  • @param action The action to execute

  • @return T=returns value
    */
    public boolean isSynch(String action) {
    if (action.equals(“getStatus”)) {
    return true;
    }
    else if (action.equals(“getHeading”)) {
    // Can only return value if RUNNING
    if (this.status == RUNNING) {
    return true;
    }
    }
    else if (action.equals(“getTimeout”)) {
    return true;
    }
    return false;
    }

    /**

    • Called when listener is to be shut down and object is being destroyed.
      */
      public void onDestroy() {
      this.stop();
      }

    //--------------------------------------------------------------------------
    // LOCAL METHODS
    //--------------------------------------------------------------------------

    /**

    • Start listening for compass sensor.
    • @return status of listener
      */
      public int start() {

// If already starting or running, then just return
if ((this.status == CompassListener.RUNNING) || (this.status == CompassListener.STARTING)) {
return this.status;
}

// Get accelerometer from sensor manager
List list = this.sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);

    // If found, then register as listener

if (list.size() > 0) {
this.mSensor = list.get(0);
this.sensorManager.registerListener(this, this.mSensor, SensorManager.SENSOR_DELAY_NORMAL);
this.lastAccessTime = System.currentTimeMillis();
this.setStatus(CompassListener.STARTING);
}

// If error, then set status to error
else {
this.setStatus(CompassListener.ERROR_FAILED_TO_START);
}

    return this.status;

}

/**
 * Stop listening to compass sensor.
 */

public void stop() {
if (this.status != CompassListener.STOPPED) {
this.sensorManager.unregisterListener(this);
}
this.setStatus(CompassListener.STOPPED);
}

public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}

/**
 * Sensor listener event.
 * 
 * @param SensorEvent event
 */

public void onSensorChanged(SensorEvent event) {

// We only care about the orientation as far as it refers to Magnetic North
float heading = event.values[0];

// Save heading
this.timeStamp = System.currentTimeMillis();
this.heading = heading;
this.setStatus(CompassListener.RUNNING);

// If heading hasn’t been read for TIMEOUT time, then turn off compass sensor to save power
if ((this.timeStamp - this.lastAccessTime) > this.TIMEOUT) {
this.stop();
}
}

/**
 * Get status of compass sensor.
 * 
 * @return   status
 */

public int getStatus() {
return this.status;
}

/**

  • Get the most recent compass heading.
  • @return heading
    */
    public float getHeading() {
    this.lastAccessTime = System.currentTimeMillis();
    return this.heading;
    }

/**

  • Set the timeout to turn off compass sensor if getHeading() hasn’t been called.
  • @param timeout Timeout in msec.
    */
    public void setTimeout(long timeout) {
    this.TIMEOUT = timeout;
    }

/**

  • Get the timeout to turn off compass sensor if getHeading() hasn’t been called.
  • @return timeout in msec
    */
    public long getTimeout() {
    return this.TIMEOUT;
    }

/**

  • Set the status and send it to JavaScript.
  • @param status
    */
    private void setStatus(int status) {
    this.status = status;
    }

}