package com.cooleshow.base.utils;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import androidx.annotation.NonNull;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2016/08/02
* desc : utils about service
*
*/
public final class ServiceUtils {
private ServiceUtils() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
/**
* Return all of the services are running.
*
* @return all of the services are running
*/
public static Set getAllRunningServices() {
ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE);
List info = am.getRunningServices(0x7FFFFFFF);
Set names = new HashSet<>();
if (info == null || info.size() == 0) return null;
for (RunningServiceInfo aInfo : info) {
names.add(aInfo.service.getClassName());
}
return names;
}
/**
* Start the service.
*
* @param className The name of class.
*/
public static void startService(@NonNull final String className) {
try {
startService(Class.forName(className));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Start the service.
*
* @param cls The service class.
*/
public static void startService(@NonNull final Class> cls) {
startService(new Intent(Utils.getApp(), cls));
}
/**
* Start the service.
*
* @param intent The intent.
*/
public static void startService(Intent intent) {
try {
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Utils.getApp().startForegroundService(intent);
} else {
Utils.getApp().startService(intent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Stop the service.
*
* @param className The name of class.
* @return {@code true}: success
{@code false}: fail
*/
public static boolean stopService(@NonNull final String className) {
try {
return stopService(Class.forName(className));
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* Stop the service.
*
* @param cls The name of class.
* @return {@code true}: success
{@code false}: fail
*/
public static boolean stopService(@NonNull final Class> cls) {
return stopService(new Intent(Utils.getApp(), cls));
}
/**
* Stop the service.
*
* @param intent The intent.
* @return {@code true}: success
{@code false}: fail
*/
public static boolean stopService(@NonNull Intent intent) {
try {
return Utils.getApp().stopService(intent);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* Bind the service.
*
* @param className The name of class.
* @param conn The ServiceConnection object.
* @param flags Operation options for the binding.
*
* - 0
* - {@link Context#BIND_AUTO_CREATE}
* - {@link Context#BIND_DEBUG_UNBIND}
* - {@link Context#BIND_NOT_FOREGROUND}
* - {@link Context#BIND_ABOVE_CLIENT}
* - {@link Context#BIND_ALLOW_OOM_MANAGEMENT}
* - {@link Context#BIND_WAIVE_PRIORITY}
*
*/
public static void bindService(@NonNull final String className,
@NonNull final ServiceConnection conn,
final int flags) {
try {
bindService(Class.forName(className), conn, flags);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Bind the service.
*
* @param cls The service class.
* @param conn The ServiceConnection object.
* @param flags Operation options for the binding.
*
* - 0
* - {@link Context#BIND_AUTO_CREATE}
* - {@link Context#BIND_DEBUG_UNBIND}
* - {@link Context#BIND_NOT_FOREGROUND}
* - {@link Context#BIND_ABOVE_CLIENT}
* - {@link Context#BIND_ALLOW_OOM_MANAGEMENT}
* - {@link Context#BIND_WAIVE_PRIORITY}
*
*/
public static void bindService(@NonNull final Class> cls,
@NonNull final ServiceConnection conn,
final int flags) {
bindService(new Intent(Utils.getApp(), cls), conn, flags);
}
/**
* Bind the service.
*
* @param intent The intent.
* @param conn The ServiceConnection object.
* @param flags Operation options for the binding.
*
* - 0
* - {@link Context#BIND_AUTO_CREATE}
* - {@link Context#BIND_DEBUG_UNBIND}
* - {@link Context#BIND_NOT_FOREGROUND}
* - {@link Context#BIND_ABOVE_CLIENT}
* - {@link Context#BIND_ALLOW_OOM_MANAGEMENT}
* - {@link Context#BIND_WAIVE_PRIORITY}
*
*/
public static void bindService(@NonNull final Intent intent,
@NonNull final ServiceConnection conn,
final int flags) {
try {
Utils.getApp().bindService(intent, conn, flags);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Unbind the service.
*
* @param conn The ServiceConnection object.
*/
public static void unbindService(@NonNull final ServiceConnection conn) {
Utils.getApp().unbindService(conn);
}
/**
* Return whether service is running.
*
* @param cls The service class.
* @return {@code true}: yes
{@code false}: no
*/
public static boolean isServiceRunning(@NonNull final Class> cls) {
return isServiceRunning(cls.getName());
}
/**
* Return whether service is running.
*
* @param className The name of class.
* @return {@code true}: yes
{@code false}: no
*/
public static boolean isServiceRunning(@NonNull final String className) {
try {
ActivityManager am = (ActivityManager) Utils.getApp().getSystemService(Context.ACTIVITY_SERVICE);
List info = am.getRunningServices(0x7FFFFFFF);
if (info == null || info.size() == 0) return false;
for (RunningServiceInfo aInfo : info) {
if (className.equals(aInfo.service.getClassName())) return true;
}
return false;
} catch (Exception ignore) {
return false;
}
}
}