你好
我想检查我的服务是否正在运行,如果服务正在运行,则不执行任何操作。
但是如果服务没有运行,请重启服务。
所以我这样做。
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;
}
}
但是当我打开/关闭屏幕时没有发生任何事情
我做错了什么?
答案 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在有足够内存后立即重新启动它停止的任何服务。