Android小项目之--服务【Service】

简介:
有段时间没有写博客了,最近一段时间跳到了深圳,新的公司新的环境要去适应,人挺累的,所以近段时间没有写博客。这几天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);
    }
}
 
 
运行效果图:
差不多就到这里吧,有点晚了,把源码提供给大家:




 本文转自 terry_龙 51CTO博客,原文链接:http://blog.51cto.com/terryblog/338863,如需转载请自行联系原作者

相关文章
|
2月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
121 1
|
2月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
122 2
|
2月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
195 0
安卓项目:app注册/登录界面设计
|
3月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
1月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
53 6
|
2月前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
51 2
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
32 1
|
3月前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习
|
2月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
3月前
|
JavaScript 前端开发 Android开发
让Vite+Vue3项目在Android端离线打开(不需要起服务)
让Vite+Vue3项目在Android端离线打开(不需要起服务)
118 10