无法从广播接收器启动/停止服务

3

我有一个启动服务的活动。现在,我想在监听屏幕关闭/打开的广播接收器中启动/停止服务。我使用了以下代码:

public class ScreenReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        Log.d("Screen:", "In Method:  ACTION_SCREEN_OFF");
        context.stopService(new Intent(context, ScreenReceiver.class));
    } 
    else if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
        Log.d("Screen:", "In Method:  ACTION_USER_PRESENT");
        context.startService(new Intent(context, ScreenReceiver.class));
    }
}
}

我已经添加了所需的权限,并在服务中注册/注销了BroadcastReceiver。当我运行代码时,我能够在Logcat中看到日志信息,但服务似乎无法停止。我该如何解决?提前感谢您。


1
为启动服务,请将服务名称作为第二个参数传递给startService,而不是ScreenReceiver(BroadcastReceiver名称),并确保已将服务添加到AndroidManifest文件中。 - ρяσѕρєя K
你的服务是如何定义的?context.stopService(new Intent(context, ScreenReceiver.class)); 第二个参数应该是 YOURSERVICE.class。 - kvh
1个回答

5

您想重启广播接收器。
请使用服务类代替。

context.startService(new Intent(context, ScreenReceiver.class));

应该是

context.startService(new Intent(context, YourService.class));

同时,在您的清单文件中:

<service android:name=".YourService"></service>

他只是在停止方面有问题。 - kvh
@kevinhoo,无论如何这些代码都无法启动他的服务。可能是他从其他地方启动了该服务。 - Lazy Ninja
我已将其更改为服务类。但问题仍然存在。当我调用 stopService() 时,服务中的 onDestroy() 方法会被执行对吗? - Sriniketh
是的,它应该被调用!你的服务是否已绑定? - Lazy Ninja
不,我没有使用绑定服务。我希望当手机锁定时停止服务,并在解锁后重新启动。但是我猜这是不可能的,因为我看到很多文章都说onDestroy()方法不会立即被调用,而只有在操作系统需要释放内存空间时才会调用。 - Sriniketh

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