销毁Service时调用onDestroy()方法

5

我想要调用android中Service的

onDestroy()

方法。

我已经在互联网上进行了很多搜索,而且很多答案都是:如果

服务被强制停止或者它的onDestroy()永远不会被调用。

但我真的需要知道何时服务停止。

我的项目涉及音乐播放器。

因此,它使用服务和一个正在运行的通知。 我需要找出服务何时停止?并且需要停止音乐并删除通知。

但它从来没有显示任何onDestroy()日志。 有人能帮我吗?如果不是onDestroy(),那么是哪个方法以及如何实现?

编辑:

我不想显式调用onDestroy()。 当我从设备菜单的正在运行应用程序中删除我的应用程序时,我想要删除通知。 因为当我停止我的应用程序时,onDestroy()不会被调用,我的通知仍然留在状态栏中。

我已经使用以下代码启动了我的服务。

Intent playin = new Intent(this, MusicService.class);
startService(playin);

1
你的意思是想在应用程序崩溃时记录日志吗? - Wolfish
你想调用服务的onDestroy()方法,还是想知道服务崩溃时如何取消通知? - DrkStr
你是如何启动你的服务的?它是有界服务器还是无界服务器? - Ashwin N Bhanushali
4个回答

9

Service类中调用:

stopSelf();

从其他类中,例如您的MainActivity

Intent i = new Intent(this, ServiceName.class); stopService(i);

这两种方法都可以停止您的服务。请确保返回START_NOT_STICKY,以便服务不会重新启动。


3
stopSelf() 会调用 onDestroy() 吗? - IgorGanapolsky

2
我想在Android中调用Service的onDestroy()方法。
  • 不要直接调用此方法

public void onDestroy ()

系统会调用此方法通知Service不再使用并将其删除。服务应该在此时清理任何它所持有的资源 (线程、已注册的接收器等)。返回后,将不会再有对这个Service对象的调用,它实际上已经死亡。不要直接调用此方法。

但是您可以检查Service是否正在运行。

我需要找出Service何时停止?并需要停止音乐和移除通知。

请使用以下方式:

private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

然后使用 - isMyServiceRunning(MyService.class) 调用它。
参考资料:
1)Service onDestroy() 2)如何检查 Android 中服务是否在运行

那么应该调用 stopSelf() 而不是 onDestroy() 吗? - IgorGanapolsky

2

如果您想停止服务,只需按照下面所示的方法发送一个意图来停止服务。

Intent intent = new Intent();
intent.setClass(getApplicationContext(), YourService.class);
stopService(intent);

这是强制停止服务的方法。使用此方法停止服务时,Android框架保证会调用onDestroy方法。

希望这能帮助解决您的问题。


0

你应该使用前台服务。在你的情况下,我认为这是最好的选择。

前台服务会显示状态栏通知,以便用户能够明确知道你的应用正在前台执行任务并消耗系统资源。除非服务被停止或从前台移除,否则无法取消通知。

要使用前台服务,你首先需要在清单文件中声明权限<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>。这是一项普通权限,不需要用户操作。

然后,你可以使用applicationContext.startForgroundService(intent)为你的Activity或其他组件启动服务。这是告诉系统这将是一个前台服务。

你需要在服务内部(通常在onStartCommand()中)使用startForeground(int, Notification)启动前台服务,并使用stopForeground(boolean)停止前台服务(它需要一个布尔值,询问是否要删除通知)

在启动前台服务后,如果你关闭了应用程序或服务自行停止,通知也将被删除。

注意:当你手动停止服务时,应该调用 stopSelf() 或者 stopService() 而不是 stopForeground(),因为仅仅调用 stopForeground() 是不够的,它只会移除状态栏中的通知。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接