2013-02-28 94 views
0

即使当我的应用程序未打开时,我想追踪电池信息(是充电,电平等)。我想服务可能会对它有好处?或者也许还有其他解决方案?我全身心地投入。电池信息服务。要监控电池状态等

+0

您可以使用服务定期触发ACTION_BATTERY_CHANGED意图,并按照我的[answer here](http:// stackoverflow)中所示读取数据。com/questions/14805318/android-batterymanager-returns-only-1/14805410#14805410) – 2013-02-28 19:40:39

+0

@robin太棒了,你能告诉我应该多久开一次这个意图,也许你有一些代码示例的服务?会非常有帮助:) – whiteLT 2013-02-28 19:50:05

回答

1

这其实是一个很老的文章,但因为公认的答案似乎是一个存根服务,我认为有必要深究下去。

您需要在android清单中声明服务。如果你在一个特定的包中,它的声明是:

<service android:name="packagename.servicename" /> 

然后你需要实现服务类。我为我的一个应用程序创建了一个。希望这可以帮助你。

我在传感器的背景下有这个。传感器是我想做的监测,所以我创建了类似的界面如下:

public interface Sensor { 

    SensorType getSensorType(); 

    SensorName getSensorName(); 

} 

我必须ENUM类,代表各类型和传感器的名字,我有:

public enum SensorName { 
    ENVIRONMENTAL_SENSOR, AUDIO_SENSOR, SOUND_SENSOR, SOCIAL_SENSOR, 
    LOCATION_SENSOR, PHOTO_SENSOR, ACCELEROMETER_SENSOR, BATTERY_SENSOR; 
} 

public enum SensorType { 
    HARDWARE_SENSOR, SOFTWARE_SENSOR, HYBRID_SENSOR; 
} 

,因为我有几个传感器,我可能想要列出所有需要实现此接口的传感器。接下来,我创建了一个抽象类来实现类似于我所有传感器的行为。

public abstract class SensorElement extends Service implements Sensor{ 

    protected SensorType type; 
    protected SensorName name; 

    @Override 
    public abstract IBinder onBind(Intent arg0); 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId){ 
     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public abstract void onCreate(); 

    @Override 
    public void onDestroy(){ 
     super.onDestroy(); 
    } 
} 

我的传感器需要这种方法才能正常工作。在我的情况下,我只需要绑定器就可以将服务绑定到我的活动上。

现在,你想要什么,电池传感器本身:

public class BatterySensor extends SensorElement { 

    // Binder given to clients 
    private final IBinder mBinder = new BatteryLocalBinder(); 

    /** 
    * Class used for the client Binder. Because we know this service always 
    * runs in the same process as its clients, we don't need to deal with IPC. 
    */ 
    public class BatteryLocalBinder extends Binder { 
     public BatterySensor getService() { 
      // Return this instance of MotionLightOrientationSensor so clients 
      // can call 
      // public 
      // methods 
      return BatterySensor.this; 
     } 
    } 

    private static final String TAG = "BatterySensor"; 
    public static final SensorType type = SensorType.SOFTWARE_SENSOR; 
    public static final SensorName name = SensorName.BATTERY_SENSOR; 

    private int status; 
    private boolean isCharging; 
    private int chargePlug; 
    private boolean usbCharge; 
    private boolean acCharge; 
    private int level; 
    private int scale; 
    private double batteryPct; 
    private Battery battery; 

    @Override 
    public SensorType getSensorType() { 
     return type; 
    } 

    @Override 
    public SensorName getSensorName() { 
     return name; 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return mBinder; 
    } 

    @Override 
    public void onCreate() { 
     Log.e(TAG, "onCreate"); 
     IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
     registerReceiver(powerconnectionreceiver, ifilter); 
     battery = new Battery(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.e(TAG, "onStartCommand"); 
     super.onStartCommand(intent, flags, startId); 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     Log.e(TAG, "onDestroy"); 
     super.onDestroy(); 
     unregisterReceiver(powerconnectionreceiver); 
    } 

    private BroadcastReceiver powerconnectionreceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // Retrieves a map of extended data from the intent. 
      status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
      isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING 
        || status == BatteryManager.BATTERY_STATUS_FULL; 

      chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); 
      usbCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; 
      acCharge = chargePlug == BatteryManager.BATTERY_PLUGGED_AC; 
      level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); 
      scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); 
      batteryPct = level/(float) scale; 
      battery.setStatus(status); 
      battery.setCharging(isCharging); 
      battery.setChargePlug(chargePlug); 
      battery.setUsbCharge(usbCharge); 
      battery.setAcCharge(acCharge); 
      battery.setLevel(level); 
      battery.setScale(scale); 
      battery.setBatteryPct(batteryPct); 

     } 

    }; 

    public Battery getBatteryReading() { 
     return this.battery; 
    } 

    public int getStatus() { 
     return status; 
    } 

    public boolean isCharging() { 
     return isCharging; 
    } 

    public int getChargePlug() { 
     return chargePlug; 
    } 

    public boolean isUsbCharge() { 
     return usbCharge; 
    } 

    public boolean isAcCharge() { 
     return acCharge; 
    } 

    public int getLevel() { 
     return level; 
    } 

    public int getScale() { 
     return scale; 
    } 


} 

从该传感器获取的数据,你只需要启动它在你的活动是这样的:

private BatterySensor batterySensor; 
private boolean mBatteryBound = false; 
private Intent intentBattery; 

intentBattery = new Intent(this.context, BatterySensor.class); 

然后我开始服务:

context.startService(intentBattery); 

,并将其绑定:

if(this.context.bindService(intentBattery, mBatteryConnection, Context.BIND_AUTO_CREATE)){ 
      this.numBoundedSensors++; 
     } 

绑定它,你需要有这个类在你的活动:

/** Defines callbacks for service binding, passed to bindService() */ 
    private ServiceConnection mBatteryConnection = new ServiceConnection() { 

     @Override 
     public void onServiceConnected(ComponentName className, 
       IBinder service) { 
      // We've bound to LocalService, cast the IBinder and get LocalService instance 
      BatteryLocalBinder BatteryBinder = (BatteryLocalBinder) service; 
      batterySensor = BatteryBinder.getService(); 
      mBatteryBound = true; 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName arg0) { 
      mBatteryBound = false; 
     } 
    }; 

然后,如果它成功了,你可以调用所有来自传感器的方法,像这样绑定:

public Battery getBatteryData(){ 
     return mBatteryBound ? batterySensor.getBatteryReading() : null; 
} 
1

服务需要在AndroidManifest.xml中声明,实现类必须扩展Service类或其中的一个子类。以下代码显示了服务声明及其实现的示例。

<service 
    android:name="MyService" 
    android:icon="@drawable/icon" 
    android:label="@string/service_name" 
    > 
</service> 

public class MyService extends Service { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    //TODO do something useful 
    return Service.START_NOT_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
    //TODO for communication return IBinder implementation 
    return null; 
    } 
}