我编写了一个NotificationListenerService
的子类,它在我的应用程序运行时在后台运行。但是,我希望允许用户在他们想要节省电池的情况下关闭服务。我按如下方式实现:
MainActivity.java
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch (id) {
case R.id.action_quit:
Intent serviceStopIntent = new Intent(getResources().getString(R.string.communicator_intent));
serviceStopIntent.putExtra("command", "shutdown");
sendBroadcast(serviceStopIntent);
}
ListeningService.java
public class ListeningService extends NotificationListenerService {
public void doStop() {
Log.d(LOGTAG, "***** DEBUG_jwir3: Requesting stop of ListeningService");
this.stopSelf();
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mCommunicator);
Log.d(LOGTAG, "***** DEBUG_jwir3: Destroying ListeningService");
mMessageHandler.shutdown();
}
class ListeningCommunicator extends BroadcastReceiver {
@Override
public void onReceive(Context aContext, Intent aIntent) {
Log.d(LOGTAG, "***** DEBUG_jwir3: Received command");
if (aIntent.getStringExtra("command").equals("shutdown")) {
Log.d(LOGTAG, "***** DEBUG_jwir3: Received shutdown command");
ListeningService.this.doStop();
}
}
}
}
(我已经简化了代码,但如果需要,我可以提供更多示例)。
我知道BroadcastReceiver
正在接收消息,我知道正在调用doStop()
(由于日志消息),但是没有调用服务的onDestroy()
。此外,我可以从Settings -> Apps -> Running
告诉该服务仍在运行。
我一直在研究这个问题,似乎(出于某种原因)NotificationListenerService
没有回复stopSelf()
或stopService()
个请求。我发现How to stop my service?此处接受的答案建议将NotificationListenerService
包装在另一个Service
中,然后根据需要停止/启动它。但是,这似乎无济于事,因为NotificationListenerService
仍然需要以某种方式停止,这个包装服务也无法阻止它。
似乎应该有一个更好的方法来做到这一点而不是接受的答案,我想知道是否有人能够了解我将如何解决这个问题?