Started Service实例

Started Service实例

再一次的重申:一个started service 是另一个组件靠调用startService()并传递一个Intent来启动的,结果调用service的onStartCommend()并接受来自startService()传递过的Intent

  1. 有两个你可以继承的类去开启一个started service

  • Service类(加个类吧,免得引起误会)

这个类对于所有的service是一个基本类,当你继承这个类的时候,很有必要开启一个新的线程去完成所有的service工作,依然是那个原因,这个service会使用你的主线程

  • IntentService

这是service类的子类,继承了这个类,那么这个service将使用一个辅助线程去处理所有的开始请求,如果你不要求你的service同时去处理多种请求,那继承这样的服务将是一个好的选择,你只需实现onHandleIntent()方法,这个方法接收每一个请求的intent

       2.下面是started service的两种方式的实例

继承IntentService类

这个intentService要做以下几件事:

创建一个默认的辅助线程执行将所有的intent发送给onStartCommand()

创建一个工作队列每次只将一个intent发送给onHandleIntent(),所以你不必担心多线程的问题

当所有的请求被处理完后,这个service将会停止,因此你也不必调用stopSelf()

提供一个默认的onBind(),返回的null值

提供一个默认的onStartCommand(),将发送intent给工作队列,然后调用onHandleIntent()

不说了,下面是实例

这是MainActivity类

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

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

	public void sendMessage (View V)
	{
		System.out.println("你点击了按钮");
		Intent intent = new Intent();
		intent.setClass(MainActivity.this, HelloIntentService.class);
		startService(intent);
	}
}

这是mainAcivity类的xml配置文件

<Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="76dp"
        android:layout_marginTop="115dp"
        android:onClick="sendMessage"
        android:text="开始" />

这是intentServiceexample类

public class HelloIntentService extends IntentService{

//	这个构造方法是必需的,调用父类的构造方法
	public HelloIntentService() {
	      super("HelloIntentService");
	  }
	@Override
		public int onStartCommand(Intent intent, int flags, int startId) {
			// TODO Auto-generated method stub
		System.out.println("onStartCommand-------被调用");
			return super.onStartCommand(intent, flags, startId);
		}
	@Override
	protected void onHandleIntent(Intent intent) {
		// TODO Auto-generated method stub
//	我们可以在这里处理一些工作,比如下载等等,这里我们为了看清楚他们的调用方法,将输出提示信息
		System.out.println("onHandleIntent --------被调用");
	}

}

别忘了加

<service android:name="HelloIntentService"></service>

输出结果可以用Logcat查看

如果你也一定要重写其他的回调方法,想onCreate(),onStartComman()或onDestrory(),时一定要调用父类的实现

继承Service类

如果你要求你的service执行一些多线程(而不是通过工作队列处理开始请求),那么你可以继承Service类

为了进行比较下面的例子,这个将和上面那个例子实现一样的工作

这是MainActivity类

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	public void sendMessage(View v)
	{
		System.out.println("你点击了按钮");
		Intent intent = new Intent();
		intent.setClass(MainActivity.this, HelloService.class);
		startService(intent);
	}
}

这MainActivity类的配置文件

<Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="76dp"
        android:layout_marginTop="93dp"
        android:text="点击" 
        android:onClick="sendMessage"/>

这是HelloService类

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.widget.Toast;

public class HelloService extends Service{
	private Looper mServiceLooper;
	  private ServiceHandler mServiceHandler;

	  //接收来自线程的Message
	  private final class ServiceHandler extends Handler {
//		  ServiceHandler的构造方法
	      public ServiceHandler(Looper looper) {
	          super(looper);
	      }
	      @Override
	      public void handleMessage(Message msg) {
	          // 我们要做的工作可以在这里写
	          // 这里我们只在logCat输出信息
	          System.out.println("handleMessage------被调用");
	          // 使用 startId停止服务
	          // the service in the middle of handling another job
	          stopSelf(msg.arg1);
	      }
	  }

	  @Override
	  public void onCreate() {
	    // Start up the thread running the service.  Note that we create a
	    // separate thread because the service normally runs in the process's
	    // main thread, which we don't want to block.  We also make it
	    // background priority so CPU-intensive work will not disrupt our UI.
		  System.out.println("onCreate------被调用");
	    HandlerThread thread = new HandlerThread("ServiceStartArguments",
	            Process.THREAD_PRIORITY_BACKGROUND);
	    thread.start();

	    // Get the HandlerThread's Looper and use it for our Handler
	    mServiceLooper = thread.getLooper();
	    mServiceHandler = new ServiceHandler(mServiceLooper);
	  }

	  @Override
	  public int onStartCommand(Intent intent, int flags, int startId) {
		  System.out.println("onStartCommand------被调用");
	      Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();

	      // For each start request, send a message to start a job and deliver the
	      // start ID so we know which request we're stopping when we finish the job
	      Message msg = mServiceHandler.obtainMessage();
	      msg.arg1 = startId;
	      mServiceHandler.sendMessage(msg);

	      // If we get killed, after returning from here, restart
	      return START_STICKY;
	  }
	  @Override
	  public void onDestroy() {
		  System.out.println("onDestory------被调用");
	    Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
	  }

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
}

记得加

<service android:name="HelloService"></service>

结果是


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Ansible是一种用于自动化运维的工具,可以帮助管理员简化和自动化常见的管理任务。下面是一个使用Ansible的自动化运维实例。 假设我们有一个包含多个服务器的Web应用程序。每次更新应用程序或更改配置时,都需要在所有服务器上手动执行相同的操作,这是一项耗时且容易出错的任务。使用Ansible,我们可以自动化这个过程。 首先,我们需要在Ansible主控节点上创建一个名为inventory的清单文件,列出所有的服务器。然后,我们需要编写一个名为playbook的配置文件,在其中定义我们要执行的任务。 在playbook中,我们可以使用Ansible的模块来执行特定的操作。对于我们的Web应用程序,我们可以使用模块来安装软件包、启动/停止服务、复制文件等。 例如,要更新我们的应用程序,我们可以使用Ansible的模块来从源代码库中拉取最新版本的应用程序代码,并在服务器上进行部署。我们可以通过在playbook中使用Git模块来下载最新代码,并使用Shell模块在服务器上执行必要的命令来构建和部署应用程序。 另外,我们还可以使用Ansible的变量来配置不同的环境。例如,我们可以在playbook中定义一个变量,用于指定部署应用程序时使用的配置文件。 最后,我们可以在命令行中运行Ansible命令,指定使用的inventory和playbook文件。Ansible将会连接到目标服务器并执行我们定义的任务。 通过使用Ansible,我们可以实现自动化运维,避免手动执行重复任务,提高效率和准确性。这不仅节省了管理员的时间和精力,还能减少人为错误的发生,提高整个系统的稳定性和可靠性。 ### 回答2: Ansible是一种自动化运维工具,它具有简单易用、灵活可扩展的特点。下面我将介绍一个使用Ansible实现自动化运维的实例。 假设我们有一个由多台Web服务器组成的集群,需要将代码及相关配置文件更新到每台服务器并重启服务。使用Ansible可以轻松实现这个任务。 首先,我们需要在本地机器上安装Ansible并配置相关的主机清单文件和SSH密钥。主机清单文件用于指定要管理的远程服务器,SSH密钥用于与远程服务器进行安全连接。 接下来,我们创建一个Ansible Playbook文件来定义整个任务的执行流程。在该文件中,我们可以使用Ansible的模块来执行各种操作,如复制文件、运行命令等。 playbook的执行由几个组件组成,包括主机清单文件、变量文件、任务和处理器。我们可以在任务中定义一系列的步骤来完成更新和重启服务的操作。 例如,我们可以使用`copy`模块将最新的代码复制到远程服务器上的指定目录。使用`command`模块可以执行重启服务的命令。同时,还可以使用`notify`和`handlers`来定义触发重启服务的条件和处理方法。 执行该playbook时,Ansible会自动连接到每台服务器,并按照playbook中定义的步骤逐个执行。通过Ansible的并发执行特性,我们可以同时在集群中的多台服务器上进行操作,大大提高了效率。 除了更新代码和重启服务,Ansible还可以实现其他自动化运维任务,如添加用户、配置数据库等。通过编写相应的playbook文件,我们可以轻松地扩展和定制自己的自动化运维需求。 总之,Ansible是一款强大的自动化运维工具,它提供了简单且灵活的方式来管理和维护服务器集群。通过使用Ansible,我们可以轻松实现各种自动化任务,提高工作效率并降低人为失误的风险。 ### 回答3: Ansible是一款强大的自动化运维工具,它具有简单易用、开放源代码、轻量级等特点。下面我将以一个简单的实例来说明Ansible的自动化运维能力。 假设我们有一组服务器,需要在每个服务器上安装一个名为"Nginx"的Web服务器,并确保所有服务器上的Nginx服务都处于运行状态。使用Ansible可以轻松实现这个任务。 首先,我们需要编写一个Ansible的Playbook,定义我们希望在目标服务器上执行的操作。假设我们的Playbook文件名为"nginx_installation.yml",内容如下: --- - name: Install and start Nginx hosts: web_servers become: true tasks: - name: Install Nginx apt: name=nginx state=present - name: Start Nginx service: name=nginx state=started 这个Playbook定义了一个名为"Install and start Nginx"的任务,使用apt模块在目标服务器上安装Nginx,并使用service模块启动Nginx服务。我们还通过指定hosts参数将任务应用到名为"web_servers"的服务器组上,并通过become参数指定使用特权权限执行任务。 接下来,我们可以使用ansible命令来运行这个Playbook,指定目标服务器组和登录凭证: ansible-playbook -i inventory.ini nginx_installation.yml -u username -k 其中,inventory.ini是一个主机清单文件,包含了我们的服务器信息,username是登录服务器的用户名,-k参数表示提示输入密码。 当我们运行这个命令后,Ansible会自动连接到每个目标服务器,并在其上执行定义的操作。安装和启动Nginx服务的过程将在每个服务器上自动完成,我们不再需要手动登录服务器进行操作。 通过这个简单的实例,我们可以看到Ansible实现自动化运维的便利性和高效性。只需要编写一个简单的Playbook,就能轻松地在多台服务器上执行相同的操作,大大提升运维效率。而且,Ansible的语法简洁明了,易于理解和维护,即使对于没有编程经验的运维人员也能够快速上手使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值