android - 延迟 15 秒的 Handler 仅在设备充电时才能正常工作
问题描述
我正在创建一个应用程序,我希望处理程序每 15 秒发送一次 http 请求。问题是,当我的设备(华为手表 2)处于充电状态时,处理程序按预期工作,但是当我将手表从充电器上取下时,15 秒在 15 到 40 秒之间变化。我的实施有问题吗?我没有将任何 Runnable 传递给 Handler,因为只有一点工作要做。我有一个SensorHelper
类,它只获取心率值。在请求中,我将自定义消息对象作为 JSON 发送。
MainActivity
:
public class MainActivity extends WearableActivity {
private static ConnectionService mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.BODY_SENSORS)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.BODY_SENSORS},
1);
}
Intent intent = new Intent(this, ConnectionService.class);
this.startService(intent);
this.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
setContentView(R.layout.activity_main);
// Enables Always-on
setAmbientEnabled();
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
ConnectionService.LocalBinder binder = (ConnectionService.LocalBinder) service;
mService = binder.getServiceInstance();
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
};
public static void sendMessage(String message) {
mService.sendMessage(message);
}
}
ConnectionService
为了避免我的应用程序进入打盹模式:
public class ConnectionService extends Service {
private final IBinder mBinder = new LocalBinder();
private static SensorHelper sensorHelper;
private static OkHttpClient client = new OkHttpClient();
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
public class LocalBinder extends Binder {
public ConnectionService getServiceInstance() {
return ConnectionService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
if (sensorHelper == null) {
sensorHelper = new SensorHelper(this);
}
super.onCreate();
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("ASD")
.setContentText("ASD")
.setContentIntent(pendingIntent).build();
startForeground(1337, notification);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
return START_REDELIVER_INTENT;
}
public void sendMessage(String message) {
Message msg = new Message("HR", message);
RequestBody requestBody = RequestBody.create(JSON, msg.toJson());
Request request = new Request.Builder()
.url("http://104.248.32.100/")
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
}
});
}
}
SensorHelper
为了获得心率值,并发布它:
public class SensorHelper implements SensorEventListener {
private String sensorValue = "normal";
private static Handler handler = new Handler();
private int delay = 15000;
public SensorHelper(Context context) {
SensorManager sensorManager = (SensorManager) context.getSystemService(SENSOR_SERVICE);
Sensor heartRateSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE);
sensorManager.registerListener(this, heartRateSensor, SensorManager.SENSOR_DELAY_NORMAL);
handler.postDelayed(new Runnable(){
public void run() {
sendMessage();
handler.postDelayed(this, delay);
}
}, delay);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_HEART_RATE) {
sensorValue = String.valueOf(event.values[0]);
}
}
@Override
public void onAccuracyChanged (Sensor sensor,int i){
}
private String getSensorValue() {
return sensorValue;
}
private void sendMessage() {
MainActivity.sendMessage(getSensorValue());
}
}
当处理程序无法正常工作时,我是否犯了任何错误?是否需要传递 Runnable 才能创建新线程?据阅读,处理程序正在创建一个新线程
解决方案
我遇到了同样的问题,很多应用程序在设备不充电时在后台运行。问题是Android的电池优化。
解决方案非常简单,您必须通过转到设置 > 电池 > 电池优化来禁用应用的电池优化(路径因制造商而异)。
一些制造商还通过减少定时任务的执行频率来添加额外的措施来优化电池,因此请检查可能影响这一点的额外设置。
希望这可以帮助!
推荐阅读
- c++ - 构建时如何解决 ReLU is not a member of torch::nn 错误?
- java - 如何在 Spring 中使用(如果可能)Java 配置将 myBatis 与 OneToOne 关系结合使用?
- java - 使用一个唯一目的是将 2 个(非常相关的)对象组合在一起的类是否被认为是一个好主意?
- entity-framework-core - 将全局会话过滤器添加到存储库实体
- jquery - Jquery限制复选框选择不起作用
- python - 编译后的 slug 大小:578.1M 太大(最大为 500M)
- python-3.x - 如何自动下载种子的字幕
- azure - Azure AD 会话令牌的位置
- python - 求 6648031207514 的最大素因数
- laravel - 为什么或何时使用 Laravel 资源/集合