Bea*_*ear 7 android power-management broadcastreceiver
我能够Intent.ACTION_BATTERY_CHANGED在我的活动中听取意图并且效果很好.我尝试在清单中定义接收器:
<receiver android:name="com.beargreaves.battery.BatteryReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
但它没有用,我在这里读了一篇文章,说它必须以编程方式定义.我想在服务中实现这一点,而不是在我的Activity中注册接收器,以便它不断监视.我已经成功实现了这一点,并且它有效,但我想检查一下我的工作,看看它是否是正确的方法.
我开始扩展BroadcastReceiver:
public class BatteryReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if(null == bundle)
return;
boolean isPresent = intent.getBooleanExtra("present", false);
String technology = intent.getStringExtra("technology");
int plugged = intent.getIntExtra("plugged", -1);
int scale = intent.getIntExtra("scale", -1);
int health = intent.getIntExtra("health", 0);
int status = intent.getIntExtra("status", 0);
int rawlevel = intent.getIntExtra("level", -1);
int level = 0;
Log.d("Debug","Battery Receiver OnReceive");
if(isPresent) {
if (rawlevel >= 0 && scale > 0) {
level = (rawlevel * 100) / scale;
Log.d("Debug","BatterReceiver: " + level);
Toast.makeText(context,"Battery Receiver: " + level + "\t" + status + "Raw: " + rawlevel,Toast.LENGTH_LONG).show();
if(level <60) {
/*
* Only invoke the service when level below threshold
*/
Intent i = new Intent(context, BatteryService.class);
i.putExtra("level", level);
context.startService(i);
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用服务首先注册接收器onCreate(),然后处理事件onStart().如果级别低于阈值,我的BroadcastReceiver将启动服务.
public class BatteryService extends Service {
/*
* First Call to onStart we don't want to do anything
*/
boolean avoidFirst = false;
private BroadcastReceiver receiver;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
receiver = new BatteryReceiver();
registerReceiver(receiver, filter);
}
@Override
public void onStart(Intent intent, int startId) {
Log.d("Debug","Battery Service On Start");
int level = intent.getIntExtra("level", -1);
if(avoidFirst) {
if(level != -1) {
Log.d("Debug","Battery Alert Notifying..... " + level);
SMSManager.sendSMS(BatteryService.this, "<number redacted>", "Battery Level Aleart: " + level);
stopSelf();
}
} else {
avoidFirst = true;
}
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
PreferenceUtil.updatePreference(BatteryService.this, "battery_monitor_on", false);
unregisterReceiver(receiver);
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?是注册接收器onCreate(),然后在收到事件时启动服务.首先我尝试不使用服务但是我无法注册接收器,因为它无法在清单中实现.其次,当我尝试发送短信时抛出异常onReceive().我读过onReceive()不应该开始任何线程.
提前致谢
是的,这是正确的做法。这与我对我的应用程序所做的非常相似,十多年来,我的应用程序一直在生产中运行良好(自 Android 早期以来),并且我没有看到您在这里遗漏或出错的任何内容。您是对的,您无法从清单中注册该广播;您确实需要以编程方式执行此操作。根据您共享的其余内容,在服务而不是活动中执行此操作显然是正确的。
| 归档时间: |
|
| 查看次数: |
8850 次 |
| 最近记录: |