即使当我的应用程序未打开时,我想追踪电池信息(是充电,电平等)。我想服务可能会对它有好处?或者也许还有其他解决方案?我全身心地投入。电池信息服务。要监控电池状态等
0
A
回答
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;
}
}
相关问题
- 1. 监控机器人电池
- 2. ACTION_POWER_CONNECTED上的电池状态
- 3. Android AppWidget电池状态
- 4. OSX中的电池状态?
- 5. 电池状态始终不充电
- 6. iOS:监控电池电量使用更多电池?应该自动保存?
- 7. 获取没有WMI的电池信息
- 8. 有关电池的通知栏信息
- 9. 如何获取电池状态?
- 10. 电池拉动后的应用状态
- 11. 从J2ME获取电池状态
- 12. 通过SMBus访问/监视电池状态
- 13. 检查AltBeacon信标的电池电量
- 14. Android电池电量
- 15. 服务检查电池百分比Android
- 16. 在我的笔记本电脑中伪造电池信息
- 17. 用单电池供电arduino和伺服
- 18. Mac - 获取电池/充电状态(插入或不插入)
- 19. 目前的电池状态总是返回“充电”在ios
- 20. 装载电池
- 21. 串联电池
- 22. 如何优化电池和资源的短信后台服务
- 23. 计算电池剩余时间直到电池放电?
- 24. InstallShield电池电量警告
- 25. 检测电池充电Android
- 26. 电池充电通知
- 27. 模拟电池放电
- 28. Android的电池电量低
- 29. NStimer的电池电量
- 30. Phonegap上的电池电量
您可以使用服务定期触发ACTION_BATTERY_CHANGED意图,并按照我的[answer here](http:// stackoverflow)中所示读取数据。com/questions/14805318/android-batterymanager-returns-only-1/14805410#14805410) – 2013-02-28 19:40:39
@robin太棒了,你能告诉我应该多久开一次这个意图,也许你有一些代码示例的服务?会非常有帮助:) – whiteLT 2013-02-28 19:50:05