有段时间没有写博客了,最近一段时间跳到了深圳,新的公司新的环境要去适应,人挺累的,所以近段时间没有写博客。这几天QQ群上有位朋友在问要Service的例子,当时没有跟他应答,现在抽空把例子整理了一下,发表上博客园,希望他能看得到。

  Service 简介

何谓“Service”?“Service” 意思即“服务”的意思, 像 Windows 上面的服务一样,有些服务是在后台上运行,干着静悄悄的勾当不让人知道 。与 Activity 不同,Service 是并不直接与用户交互的运行于后台的一类组件。

  Google对Service的解释

  • 一个服务不是一个单独的进程。服务对象本身并不意味着它是在自己的进程中运行,除非另有规定,否则它与运行程序是同在一个进程中。
  • 一个服务不是一个单独的线程。它是一种手段,本身做着主线的工作 (以避免应用程序没有响应的错误)。

  Service 与 Activity 的相同点与不同点

  • 不同点:Activity是与用户交互的组件,即我们用眼睛可以看到的界面,而Service是在后台运行,执行隐藏的动作。
  • 相同点:使用Activity 时我们需要在配置文件中声明<activity>标签,同样的使用Service 也需要在配置文件中声明<service>标签

  使用Service

创建Service需要继承自 android.app.Service 的类,然后重新实现在Service各个状态要回调的方法,Service的回调方法有三个,分别是:

  • onCreate()
    创建
  • onStart()
    开始
  • onDestry()
    释放

注意:Service是不能自己启动的,只有通过 Context 对象 调用startService和bindService方法来启动。但两种方法的Service生命周期是不同的,下面我们通过一个小例子来区别各自的生命周期。

例子效果图如下:

代码如下:

package com.terry;

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

public class ServiceSample extends Service {

final String TAG="Service";
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        Log.i(TAG,"onBind");
        return null;
    }
    
    @Override
    public boolean onUnbind(Intent intent) {
        // TODO Auto-generated method stub
        Log.i(TAG, "onUnbind");
        return super.onUnbind(intent);
    }

@Override
    public void onRebind(Intent intent) {
        // TODO Auto-generated method stub 
        super.onRebind(intent);
        Log.i(TAG, "onRebind");
    }
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Log.i(TAG, "onCreate");
    }
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.i(TAG, "onDestroy");
    }
    
    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        Log.i(TAG, "onStart");
    }
    
}

当调用startService方法时:

  • 1、若Servcie没有启动,则首先会调用该Service的onCreate方法,然后再调用onStart方法。
  • 2、若Service己经启动则首先会直接调用onStart方法,
  • 3、关闭时使用stopservice来关闭。

当调用bindService方法时:

  • 1、若Service没有启动,则首先调用onCreate方法,来初始化启动Service,然后调用Service的onBind。
  • 2、通过onUnbind和onDestry方法停止Service运行。

下面通过一组图来更详细的说明Service的生命周期

开始服务

停止服务

绑定服务

销毁服务

音乐服务DEMO

通过上面的小例子可能有些园友还是很模糊,下面通过一个播放音乐的小例子加深大家对Service 的理解,该例子通过播放一首mp3 ,当用户点击开始“按钮”,音乐开始播放,即时你退出程序音乐也会播放,点击“停止”按钮,停止播放音乐 。

该例子继承service 然后重写onStart播放音乐 重写onDestry停止音乐 ,代码如下:

package com.terry;

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

public class musicServer extends  Service {

private MediaPlayer player;
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
    
    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
    if(player==null)
    {
        player=MediaPlayer.create(this, R.raw.start);
        player.start();
    }
    }
    
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        player.stop();
    }
}

完成了service类,我们只要在对应的Activity的事件中调用服务即可实现,代码如下:

package com.terry;

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

public class musicActivity  extends Activity{

private Intent intent=new Intent("com.terry.Android.MUSIC"); 
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.music);
        findView();
        viewHolder.myButton.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                startService(intent);
            }
        });
        
        viewHolder.myButton2.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                stopService(intent);
            }
        });
    }
    
    
    void findView(){
        viewHolder.myButton=(Button)findViewById(R.id.play);
        viewHolder.myButton2=(Button)findViewById(R.id.stop);
    }
}

运行效果图:

差不多就到这里吧,有点晚了,把源码提供给大家:/Files/TerryBlog/ServiceTestDemo.rar

Android小项目之--服务【Service】相关推荐

  1. Android 小项目之--数据存储【Files】(附源码)

    继上篇数据存储,现在我们来讲讲另外一种数据存储,Files.本篇讲述步骤如下: 1.温故而知新,复习四种数据存储的区别. 2.什么是 Files 数据存储. 3.什么是 Properties ? 4. ...

  2. linux 蓝牙 手机遥控器,嵌入式Android小项目之万能手机遥控器详解

    原标题:嵌入式Android小项目之万能手机遥控器详解 在很久很久以前,手机是有红外功能的,后来随着蓝牙技术的成熟,红外逐渐被蓝牙取代,不再是标配了. 红外本身还是有些优点,比如操作简便,成本低.要想 ...

  3. Android小项目———— 冰炭不投de小计算器

    我的第一个Android小项目 冰炭不投de小计算器 一.前言 这是我首个使用java写的app,也在学习郭霖老师的第一行代码和李刚老师的疯狂java讲义之时,进行的练习之作,刚刚学习java和and ...

  4. Android小项目————聊天室(UI篇)

    Android小项目----聊天室(UI篇) 一.前言 这是所做的第二个android项目,主要目的对暑假所学的java和android知识点进行复习巩固和实践,由于知识所限,目前这个聊天室并不是很完 ...

  5. Android小项目——简易备忘录

    Android小项目--简易备忘录的实现 简易备忘录主要实现功能类似手机默认备忘录,可以对备忘录目录进行增添和删除.在编辑页面,可以显示当前时间,编辑备忘录标题,备忘录内容,设置时间提醒,插入图片等 ...

  6. 一个特别适合新手练习的Android小项目——每日一妹纸

    原文链接 http://sparkyuan.me/ 转载请注明出处 介绍 当前版本V 1.2 刚开始学习Android的时候,主要就是学习了一些Activity的生命周期,各种View和Layout的 ...

  7. Android 小项目之--Mini音乐播放器【简单版】(附源码)

    上篇文章讲服务的例子中,有个演示服务的后台播放音乐,今天就来讲一讲多媒体之一的音乐播放. 说到多媒体不得不向上追溯,空间多媒体是如何实现的,如何可以让我们轻松的播放音乐.视频?本章讲述点大致如下: 1 ...

  8. android小项目之新闻客户端四

     基于Android小巫新闻客户端开发---显示新闻详细内容UI设计 2013年2月27日,天气潮湿!!! 距上一次写的主界面业务逻辑实现,已经过来11天,小巫觉得拖得太久了,所以决定尽量把所有的 ...

  9. Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)

    都知道水果公司(苹果)是己尊重用户体验著称的公司,其设计的产品人性化十足,不得不令后来者赞叹,竞相模仿.iphone的成功就是其典型的案例,做为其移动系统的死对头 Google 想要在市场上分得一杯羹 ...

最新文章

  1. 找出前50个素数,构成素数表
  2. Java项目:药品管理系统(java+swing+Gui+mysql)
  3. 书籍记录——C++大学基础教程(第五版)
  4. 最强大的多线程解决方案!!
  5. javaScript实现字符串首字母大写
  6. Linux 利用yum源安装php5.6+nginx
  7. AES 加密256位 错误 java.security.InvalidKeyException: Illegal key size or default parameters
  8. servlet session 跟踪用户上次访问时间
  9. 【渝粤教育】国家开放大学2019年春季 0736-22T烹饪工艺学(2) 参考试题
  10. C++ 用libcurl库进行http 网络通讯编程
  11. hexo+git+github+域名搭建个人博客提示404_不用花一分线,松哥手把手教你上线个人博客...
  12. jmeter 跳板机_Jmeter接口测试进阶
  13. 海康威视:工程项目不是我们的目标,对创新业务发展充满信心...
  14. 《华为研发》读书笔记与读后感范文3300字
  15. 【抽奖】知网研学福利月卡
  16. 『HDU 5855』Less Time, More profit
  17. mysql8初始化 2021-12-18版本 设置mysql大写
  18. 2015年总结,平平淡淡的一年.
  19. 适用于Webstorm的25个最佳Javascript插件
  20. 阿里巴巴字体图标的使用

热门文章

  1. Eclipse——热键amp;Help
  2. 企业级IM应该帮助员工提高绩效,避免无关的信息干扰
  3. 博客刚刚开通,纪念一下。
  4. flex textinput 输入限制(数字、字母)
  5. Python疑难杂症:SyntaxError: Non-ASCII character Python中文处理问题
  6. webshell下执行CMD的小技巧
  7. ExecutionException异常
  8. 同事就是同事,职场没有兄弟姐妹
  9. Qt Creator基本使用方法
  10. MFC GDI绘图基础