zoukankan      html  css  js  c++  java
  • Android小项目之服务【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);
        }
    }
     
     
    运行效果图:
    差不多就到这里吧,有点晚了,把源码提供给大家:

    本文出自 “Terry_龙” 博客,请务必保留此出处http://terryblog.blog.51cto.com/1764499/338863

  • 相关阅读:
    怎样获取节点的文本值
    怎样获取节点的名称
    怎样获取节点的类型
    Sublime Text 3
    ubuntu QT安装以及配置交叉编译环境
    Ubuntu下搭建NFS,并在开发板挂载
    Tk1上搭建turtlebot环境
    sudo dpkg --configure -a无法解决的问题
    ARM TK1 安装kinect驱动
    opencv2.4.9+vs2012安装配置
  • 原文地址:https://www.cnblogs.com/hnrainll/p/2225377.html
Copyright © 2011-2022 走看看