2

你好

我想检查我的服务是否正在运行,如果服务正在运行,什么也不做。

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

所以我做这样的事情。

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;
}

}

但是当我开/关屏幕时什么都没有发生

我究竟做错了什么?

4

2 回答 2

2

您无法通过清单文件注册屏幕开/关广播,tt不起作用(需要探索原因)。通过代码将其注册到您的主要活动中

    ifilter=new IntentFilter();
    ifilter.addAction(Intent.ACTION_SCREEN_OFF);
    ifilter.addAction(Intent.ACTION_SCREEN_ON);
    registerReceiver(new Receiver(), ifilter);

直到您的活动仍在内存中,您将在接收器中收到这些广播,我已经对其进行了测试并且能够接收广播。但是,如果您的活动完成,您将不会收到这些广播。因此,使用 START_STICKY 功能在您的应用中的某个 LocalService 中注册这些广播将解决您的问题。

于 2013-04-12T05:59:19.990 回答
1

如果您希望您的服务保持正常运行,则无需执行此操作。只需让 onStartCommand 返回 START_STICKY。这将导致 Android 重新启动它停止的任何服务,只要它有足够的内存。

于 2013-04-12T04:56:44.103 回答