フォアグラウンドで実行されていると思われるサービスがあります。実装が機能しているかどうかを確認するにはどうすればよいですか?
6 に答える
public static boolean isServiceRunningInForeground(Context context, Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
if (service.foreground) {
return true;
}
}
}
return false;
}
private boolean isServiceRunning(String serviceName){
boolean serviceRunning = false;
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> l = am.getRunningServices(50);
Iterator<ActivityManager.RunningServiceInfo> i = l.iterator();
while (i.hasNext()) {
ActivityManager.RunningServiceInfo runningServiceInfo = i
.next();
if(runningServiceInfo.service.getClassName().equals(serviceName)){
serviceRunning = true;
if(runningServiceInfo.foreground)
{
//service run in foreground
}
}
}
return serviceRunning;
}
サービスがフォアグラウンドで実行されているかどうかを知りたい場合は、他のいくつかのファットアプリケーションを開いてから、サービスがまだ実行されているかどうかを確認するか、フラグを確認してくださいservice.foreground
。
回答のより効率的なバリエーション:https ://stackoverflow.com/a/36127260/1275265
public static boolean isServiceRunningInForeground(Context context, Class<?> serviceClass) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.getName().equals(service.service.getClassName())) {
return service.foreground;
}
}
return false;
}
API 26以降、getRunningService()
は非推奨になりました。
現在の解決策の1つは、アクティビティをサービスにバインドすることです。次に、アクティビティからサービスのメソッドを呼び出して、実行されているかどうかを確認できます。
1-サービスで、Binderを拡張し、サービスを返すクラスを作成します
public class LocalBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
2-サービスで、バインダーを宣言します
private final IBinder binder = new LocalBinder();
3-サービスで、を実装しますonBind()
。これにより、バインダーが返されます。
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
4-サービスで、実行されているかどうかを確認するメソッドを作成します(たとえば、変数が初期化されているかどうかを確認します)
public boolean isRunning() {
// If running
return true;
// If not running
return false;
}
5-アクティビティで、サービスを保持する変数を作成します
private MyService myService;
6-これで、アクティビティで、サービスにバインドできます
private void checkIfEnabled() {
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className,
IBinder service) {
MyService.LocalBinder binder = (MyService.LocalBinder) service;
myService = binder.getService();
// Calling your service public method
if(myService.isRunning()) {
// Your service is enabled
} else {
// Your service is disabled
}
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
};
// Bind to MyService
Intent intent = new Intent(this, MyService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
詳細については、公式ドキュメントの境界サービスの概要を確認してください。
これは、暗号ニュースのCoinverseアプリで私のために働きました。
これは、最も簡潔なKotlinソリューションです。このGitHubの問題でAbbasNaqdiに感謝します。
@Suppress("DEPRECATION") // Deprecated for third party Services.
fun <T> Context.isServiceRunning(service: Class<T>) =
(getSystemService(ACTIVITY_SERVICE) as ActivityManager)
.getRunningServices(Integer.MAX_VALUE)
.any { it.service.className == service.name }
アダムの答えに少し触れてください:
@Suppress("DEPRECATION") // Deprecated for third party Services.
fun <T> Context.isServiceForegrounded(service: Class<T>) =
(getSystemService(ACTIVITY_SERVICE) as? ActivityManager)
?.getRunningServices(Integer.MAX_VALUE)
?.find { it.service.className == service.name }
?.foreground == true