32

フォアグラウンドで実行されていると思われるサービスがあります。実装が機能しているかどうかを確認するにはどうすればよいですか?

4

6 に答える 6

36
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;
   }
于 2016-03-21T09:30:45.753 に答える
30
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

于 2011-06-23T10:27:24.017 に答える
13

回答のより効率的なバリエーション: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;
}
于 2017-12-07T09:53:56.987 に答える
5

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

詳細については、公式ドキュメントの境界サービスの概要を確認してください。

于 2020-10-18T10:22:11.053 に答える
1

これは、暗号ニュースの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 }
于 2019-06-07T18:19:39.230 に答える
1

アダムの答えに少し触れてください:

@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
于 2020-09-15T14:51:54.500 に答える