学习笔记(三)——关于Service的那些事

Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色。Service是一个应用组件,能在后台执行长时间的操作,并且不提供用户界面;所以Service不是一个单独的进程也是不是一个线程。

项目中的每一个Service都必须在AndroidManifest.xml中注册才行。

Service生命周期:

这里写图片描述

从service的生命周期可以看出,从它被创建开始,到它被销毁为止,可以有两条不同的路径:

  • startService():必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。当service被停止时,系统会销毁它。
  • bindService():客户端可以通过一个IBinder接口和service进行通信。可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个客户端绑定,当多个客户端都解除绑定之后,系统会销毁service。

这两条路径并不是完全分开的,我们可以和一个已经调用了 startService()而被开启的service进行绑定。比如一个音乐播放器service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户端都解除绑定。

Service所要重写的方法:

  • onCreate() :创建Service后会被调用
  • onStartCommand(Intent intent, int flags, int startId)
  • onDestroy() :Service关闭之前会调用的方法
  • onBind(Intent intent)

    我们通过音乐播放器的例子来更深刻理解这些方法:

     
    public class MusicService extends Service {
    private MediaPlayer mediaPlayer;
    private IBinder iBinder=new LocalBinder();
    @Override
    public void onCreate() {
    super.onCreate();
    mediaPlayer=MediaPlayer.create(this,R.raw.dongting);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    mediaPlayer.start();
    return START_NOT_STICKY;//在后台强制关闭时可以杀死
    }
    @Override
    public void onDestroy() {
    mediaPlayer.stop();
    super.onDestroy();
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
    return iBinder;
    }
    public class LocalBinder extends Binder{
    MusicService getService(){
    return MusicService.this;
    }
    } }

上面onBind()方法返回了一个可以得到歌曲的Binder对象,该对象将会传给访问该Service的访问者。

public class MusicActivity extends Activity implements View.OnClickListener{

    private Button startbtn;
    private Button stopbtn;
    private MusicService musicService;
    private ServiceConnection serviceConnection=new ServiceConnection(){

        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //ibender负责service与外界通信,ibender是从MusicService的onBind()方法中得到的
            MusicService.LocalBinder localBinder= (MusicService.LocalBinder) iBinder;
            musicService = localBinder.getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };


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

        startbtn = (Button) findViewById(R.id.music_btn_start);
        stopbtn = (Button) findViewById(R.id.music_btn_stop);

        startbtn.setOnClickListener(this);
        stopbtn.setOnClickListener(this);


    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.music_btn_start:
                startService(new Intent(MusicActivity.this,MusicService.class));
                bindService(new Intent(MusicActivity.this,MusicService.class),serviceConnection,BIND_AUTO_CREATE);
               //要在ManiFest中添加service标签
                break;
            case R.id.music_btn_stop:
                unbindService(serviceConnection);
                stopService(new Intent(MusicActivity.this,MusicService.class));
                break;
        }
    }
}

这里写图片描述

IntentService:异步处理服务

Service运行在主线程里,所以它里面不能处理一个耗时操作,否则会报出异常。
IntentService的特点:
IntentService有以下特点:

(1) 它创建了一个独立的工作线程来处理所有的通过onStartCommand()传递给服务的intents。

(2) 创建了一个工作队列,来逐个发送intent给onHandleIntent()。

(3) 不需要主动调用stopSelft()来结束服务。因为,在所有的intent被处理完后,系统会自动关闭服务。

(4) 默认实现的onBind()返回null

(5) 默认实现的onStartCommand()的目的是将intent插入到工作队列中

有关更多的IntentService的内容,大家可以看看以下相关资料:
http://www.cnblogs.com/zhangs1986/p/3602154.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Servlet 是 JavaEE 规范中的一部分,是处理 Web 请求的组件。Servlet 运行在服务器端,能够接收客户端发来的请求,并给客户端响应结果。下面我们来看看 Servlet 的基本概念和使用方法。 ## 一、Servlet 的基本概念 ### 1.1 Servlet 的生命周期 Servlet 的生命周期包含以下个阶段: - 初始化阶段(init):当 Servlet 实例化后,Web 容器会调用其 init() 方法进行初始化操作。在此阶段,Servlet 可以执行一些初始化操作,例如读取配置信息、建立数据库连接等。 - 请求处理阶段(service):当客户端发来请求时,Web 容器会创建一个线程调用 Servlet 的 service() 方法处理请求。在此阶段,Servlet 可以获取请求参数、处理请求并生成响应数据。 - 销毁阶段(destroy):当 Web 应用停止或 Servlet 被卸载时,Web 容器会调用 Servlet 的 destroy() 方法进行清理工作。在此阶段,Servlet 可以释放资源、关闭数据库连接等。 ### 1.2 Servlet 的配置 在使用 Servlet 时,需要在 web.xml 文件中进行配置。以下是一个 Servlet 的基本配置: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.example.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ``` 其中,servlet-name 表示 Servlet 的名称,servlet-class 表示 Servlet 的类名,url-pattern 表示请求的 URL 匹配规则。 ## 二、Servlet 的使用方法 ### 2.1 编写 Servlet 编写 Servlet 有两种方法:一种是继承 HttpServlet 类,另一种是实现 Servlet 接口。这里以继承 HttpServlet 类为例: ```java public class MyServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 GET 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理 POST 请求 PrintWriter out = resp.getWriter(); out.println("Hello, world!"); } } ``` 在 Servlet 中,doGet() 方法用于处理 GET 请求,doPost() 方法用于处理 POST 请求。通过调用 HttpServletResponse 对象的 getWriter() 方法可以向客户端返回响应数据。 ### 2.2 部署 Servlet 将编写好的 Servlet 部署到 Web 容器中,有两种方法:一种是将 Servlet 类打成 war 包放到 Web 容器的 webapps 目录下,另一种是通过 Eclipse 等开发工具将 Servlet 部署到 Web 容器中。部署完成后,可以通过访问 Servlet 的 URL 来测试 Servlet 是否正常工作。 ## 、总结 本文介绍了 Servlet 的基本概念和使用方法。Servlet 是 Java Web 开发中非常重要的组件,掌握 Servlet 的使用方法对于 Java Web 开发人员来说是必不可少的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值