ActivityManager(五)--判断Service是否已经启动

简介: MainActivity如下:package cn.testservice1;import java.util.ArrayList;import java.
MainActivity如下:
package cn.testservice1;

import java.util.ArrayList;
import java.util.Iterator;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/**
 * Demo描述:
 * 判断服务(Service)是否已经启动
 * 
 * 判断步骤:
 * 1 利用ActivityManager得到所有正在运行的Service的集合.
 * 2 判断该集合是否包含某一服务
 * 
 * 注意事项:
 * 1 不需要什么权限
 * 2 在调用getRunningServices(int maxNum)方法时将maxNum的值设大一些.
 *   有这么一种可能maxNum=30时返回的集合不包括需要判断的服务,
 *   但设置maxNum=100时所获取到的集合里包括了需要判断的服务
 * 3 ActivityManager还有一方法getRecentTasks(maxNum, flags)可判断最近的任务
 * 4 ActivityManager可以获取运行中的BroadcastReceiver和ContentProvider么?
 *   不可以.
 * 
 */
public class MainActivity extends Activity {
	private Button mStartButton;
	private Button mStopButton;
	private Button mCheckServiceButton;
	private Intent intent;
	private Context mContext;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}

	private void init() {
		mContext = this;
		intent = new Intent();
		intent.setAction("cc.test.com");

		// 开启服务
		mStartButton = (Button) findViewById(R.id.startButton);
		mStartButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				startService(intent);
			}
		});

		// 终止服务
		mStopButton = (Button) findViewById(R.id.stopButton);
		mStopButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				stopService(intent);
			}
		});

		// 检测服务是否在运行
		mCheckServiceButton = (Button) findViewById(R.id.checkServiceButton);
		mCheckServiceButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				boolean isRunning = isServiceRunning(mContext,"cn.testservice1.ServiceSubclass");
				if (isRunning) {
					System.out.println("服务在运行中");
				} else {
					System.out.println("服务未启动");
				}
			}
		});
	}

	/**
	 * 判断服务是否在运行中
	 * @param context 即为Context对象
	 * @param serviceName 即为Service的全名
	 * @return 是否在运行中
	 */
	private boolean isServiceRunning(Context context, String serviceName) {
		if (!TextUtils.isEmpty(serviceName) && context != null) {
			ActivityManager activityManager
			= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
			ArrayList<RunningServiceInfo> runningServiceInfoList
			= (ArrayList<RunningServiceInfo>) activityManager.getRunningServices(100);
			for (Iterator<RunningServiceInfo> iterator=runningServiceInfoList.iterator();iterator.hasNext();) {
				RunningServiceInfo runningServiceInfo = (RunningServiceInfo) iterator.next();
				if (serviceName.equals(runningServiceInfo.service.getClassName().toString())) {
					return true;
				}
			}
		} else {
			return false;
		}
		return false;
	}
	
	
}


ServiceSubclass如下:
package cn.testservice1;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class ServiceSubclass extends Service {

	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}
	
	public void onCreate() {
		System.out.println("---> Service onCreate()");
	}
	
	@Override
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		System.out.println("---> Service onStart()");
	}
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		System.out.println("---> Service onStartCommand()");
		return super.onStartCommand(intent, flags, startId);
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		System.out.println("---> Service onDestroy()");
	}

	
}

main.xml如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
   >

    <Button
        android:id="@+id/startButton"
        android:layout_width="200dip"
        android:layout_height="150dip"
        android:text="启动Service" 
     />
    
      <Button
        android:id="@+id/stopButton"
        android:layout_width="200dip"
        android:layout_height="150dip"
        android:text="停止Service" 
      />
      
      <Button
        android:id="@+id/checkServiceButton"
        android:layout_width="200dip"
        android:layout_height="150dip"
        android:text="检测Service是否已经在运行" 
      />

</LinearLayout>


相关文章
|
11月前
|
Kubernetes 负载均衡 算法
【K8S系列】深入解析Service
【K8S系列】深入解析Service
117 0
【K8S系列】深入解析Service
|
28天前
|
Kubernetes 负载均衡 网络协议
在K8S中,Service的类型有哪些?
在K8S中,Service的类型有哪些?
|
1月前
|
Kubernetes 负载均衡 网络协议
在K8S中,Service类型有哪些?
在K8S中,Service类型有哪些?
|
3月前
关于systemd自定义,一个service 启动多个实例
关于systemd自定义,一个service 启动多个实例
43 2
|
4月前
|
Java Android开发
Service的启动过程
Service的启动过程
31 2
|
9月前
|
Kubernetes 监控 Cloud Native
k8s 自身原理之 Service
k8s 自身原理之 Service
|
12月前
|
Linux Shell 网络安全
服务停止后,自启动的service怎么写
当服务停止后,你可以通过在特定目录中创建一个.service文件来实现自启动。下面是一个示例: 1. 打开终端或者SSH连接到CentOS服务器上。 2. 进入`/etc/systemd/system/`目录。这是存放系统服务的位置,你可以将你的自启动服务文件放在这里。 3. 使用文本编辑器(如vi或nano)创建一个新的.service文件,文件名可以是任意的以`.service`结尾。 ```bash sudo vi myservice.service ``` 在文件中添加以下内容: ``` [Unit] Description=My
113 0
|
开发框架 .NET API
Andrid 9.0 init.rc中增加启动自定义service
Andrid 9.0 init.rc中增加启动自定义service
666 0
Andrid 7.1 启动init.rc中自定义service
Andrid 7.1 启动init.rc中自定义service
158 0
|
Apache Windows
Apache service monitor下无服务可供启动
Apache service monitor下无服务可供启动
226 0