BroadcastReceiver - 每次用户ON / OFF屏幕时如何触发服务

时间:2013-04-12 04:48:06

标签: java android broadcastreceiver

你好

我想检查我的服务是否正在运行,如果服务正在运行,则不执行任何操作。

但是如果服务没有运行,请重启服务。

所以我这样做。

In Manifest.xml

<receiver android:name="com.varma.android.aws.receiver.Receiver">
<intent-filter>
    <action android:name="android.intent.action.SCREEN_ON" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
    <action android:name="android.intent.action.SCREEN_OFF" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

Receiver.java

public class Receiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    Log.i("aws", "Received...");

    if(isMyServiceRunning(context)) {
        Log.v("aws", "Yeah, it's running, no need to restart service");
    }

    else {
        Log.v("aws", "Not running, restarting service");
        Intent intent1 = new Intent(context, Service.class);
        context.startService(intent1);
    }

}

private boolean isMyServiceRunning(Context context) {
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (Service.class.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

}

但是当我打开/关闭屏幕时没有发生任何事情

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您无法通过清单文件注册屏幕开/关广播,tt不起作用(需要探究原因)。 通过代码

在主要活动中注册
    ifilter=new IntentFilter();
    ifilter.addAction(Intent.ACTION_SCREEN_OFF);
    ifilter.addAction(Intent.ACTION_SCREEN_ON);
    registerReceiver(new Receiver(), ifilter);

直到您的活动留在记忆中,您将在接收器中接收这些广播,我已经测试过并能够接收广播。 但是,如果您的活动完成,您将无法收到这些广播。因此,使用START_STICKY 功能在您的应用中的某些 LocalService中注册这些广播将解决您的问题。

答案 1 :(得分:1)

如果您希望自己的服务保持不变,则无需执行此操作。只需让onStartCommand返回START_STICKY即可。这将导致Android在有足够内存后立即重新启动它停止的任何服务。