问题描述
我创建了一个服务,该服务应该在按下按钮时在后台运行,并在按下按钮时停止。它是从片段而不是活动开始的。我可以在屏幕打开时启动和运行它,但是在屏幕关闭时,将调用其onDestroy方法并自行停止。我还没有找到让我意识到自己做错了(很可能很显然)做错事情的帖子。
我开始给它一个部分唤醒锁,但是它什么也没做。
清单具有权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
服务从带有布尔意图的片段开始,以指定是否应获取唤醒锁
Intent intent = new Intent(mainActivity.getApplicationContext(),NetworkService.class);
intent.putExtra("Wake Lock",wakeLockBox.isEnabled());
mainActivity.startService(intent);
我的服务创建使用Partial标签获取唤醒锁,并返回重新传递意图。
private PowerManager mPowerManager;
private PowerManager.WakeLock wakeLock;
private boolean wakeLockSet;
// service doing its thing code here
@Override
public int onStartCommand(Intent intent,int flags,int startId) {
Log.d("Service","Started");
wakeLockSet = intent.getBooleanExtra("Wake Lock",false);
// ...
setWakeLock();
// ...
return START_REDELIVER_INTENT;
}
private void setWakeLock()
{
mPowerManager = (PowerManager) getSystemService(getApplicationContext().POWER_SERVICE);
wakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"NetworkService::WakelockTag");
wakeLock.acquire();
}
根据我以前的文章以及测试所得,释放唤醒锁的唯一方法是销毁服务。
@Override
public void onDestroy()
{
super.onDestroy();
// ...
if (wakeLockSet) wakeLock.release();
Log.d("Service","Shutdown");
stopSelf();
}
每当我的屏幕关闭时,就会调用服务onDestroy()方法,该服务释放锁定然后自行停止。因此,我对唤醒锁如何与应该在屏幕关闭时运行的服务一起使用感到困惑。
我什至在服务开始启动时记录日志,以跟踪意图是否得到重新传递,而事实并非如此。
我关闭了手机的电池优化功能,但无济于事。当屏幕关闭时,我唯一可以运行它的时间是当我在onDestroy上注释掉时,这不是一个好的解决方案。
我也尝试过使其成为前台服务。
在片段中
// notification builder made earlier
Intent intent = new Intent(mainActivity.getApplicationContext(),NetworkService.class);
intent.putExtra("Notification",builder.build());
intent.putExtra("Wake Lock",wakeLockBox.isEnabled());
mainActivity.startForegroundService(intent);
然后创建服务
private PowerManager mPowerManager;
private PowerManager.WakeLock wakeLock;
private boolean wakeLockSet;
// service doing its thing code here
@Override
public int onStartCommand(Intent intent,int startId) {
startForeground(400,intent.getExtras().getParcelable("Notification"));
Log.d("Service","NetworkService::WakelockTag");
wakeLock.acquire();
}
结果相同。
关于我在做什么错的任何想法?该项目的最低SDK为27。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)