`
trygood
  • 浏览: 79134 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Service

阅读更多
一、Service的概念
Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件。



二、Service的生命周期
Service对象不能自己启动,需要通过某个Activity、Service或者其他Context对象来启动。启动的方法有两种,Context.startService和Context.bindService()。两种方式的生命周期是不同的,具体如下所示。
Context.startService方式的生命周期: 
启动时,startService –> onCreate() –> onStart() 
停止时,stopService –> onDestroy()
Context.bindService方式的生命周期: 
绑定时,bindService  -> onCreate() –> onBind() 
解绑定时,unbindService –>onUnbind() –> onDestory()
三、实例:控制音乐播放的Service
下面我们用一个可以控制在后台播放音乐的例子来演示刚才所学知识,同学们可以通过该例子可以明显看到通过绑定方式运行的Service在绑定对象被销毁后也被销毁了。



下面把代码分享如下:
1、建立一个新项目名字叫 Lesson14_HelloService,Activity起名叫MainHelloService.java
2、res/layout/main.xml中代码写成
01 < ?xml version="1.0" encoding="utf-8"?>
02 <linearlayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent">
03 <textview android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="音乐播放服务" android:textsize="25sp" android:layout_margintop="10dp">
04 <button android:text="开启音乐播放服务" android:textsize="20sp"android:id="@+id/Button01" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
05 </button>
06 <button android:text="停止音乐播放服务" android:textsize="20sp"android:id="@+id/Button02" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
07 </button>
08
09 <button android:text="绑定音乐播放服务" android:textsize="20sp"android:id="@+id/Button03" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
10 </button>
11 <button android:text="解绑定音乐播放服务" android:textsize="20sp"android:id="@+id/Button04" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_margintop="10dp">
12 </button>
13 </textview></linearlayout>

在AndroidManifest.xml中描述如下
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="android.basic.lesson14"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainHelloService"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    <service android:enabled="true" android:name=".MusicService">
    </service>
</application>
    <uses-sdk android:minSdkVersion="8" />
</manifest>


2、在res目录中建立一个raw目录,并把一个音乐文件babayetu.mp3拷贝进来
3、在Activity的同目录新建一个service文件MusicService.java
01 package android.basic.lesson14;
02
03 import android.app.Service;
04 import android.content.Intent;
05 import android.media.MediaPlayer;
06 import android.os.IBinder;
07 import android.util.Log;
08 import android.widget.Toast;
09
10 public class MusicService extends Service {
11
12     //为日志工具设置标签
13     String tag ="MusicService";
14
15     //定义音乐播放器变量
16     MediaPlayer mPlayer;
17
18     //其他对象通过bindService方法通知该Service时该方法会被调用
19     @Override
20     public IBinder onBind(Intent intent) {
21         Toast.makeText(this,"MusicService onBind()",Toast.LENGTH_SHORT).show();
22         Log.i(tag, "MusicService onBind()");
23         mPlayer.start();
24         return null;
25     }
26
27     //其他对象通过unbindService方法通知该Service时该方法会被调用
28     @Override
29     public boolean onUnbind(Intent intent){
30         Toast.makeText(this, "MusicService onUnbind()", Toast.LENGTH_SHORT).show();
31         Log.i(tag, "MusicService onUnbind()");
32         mPlayer.stop();
33         return false;
34     }
35
36     //该服务不存在需要被创建时被调用,不管startService()还是bindService()都会在启动时调用该方法
37     @Override
38     public void onCreate(){
39         Toast.makeText(this, "MusicService onCreate()", Toast.LENGTH_SHORT).show();
40         //创建一个音乐播放器对象
41         mPlayer=MediaPlayer.create(getApplicationContext(), R.raw.babayetu);
42         //设置可以重复播放
43         mPlayer.setLooping(true);
44         Log.i(tag, "MusicService onCreate()");
45     }
46
47     //用startService方法调用该服务时,在onCreate()方法调用之后,会调用改方法
48     @Override
49     public void onStart(Intent intent,int startid){
50         Toast.makeText(this,"MusicService onStart",Toast.LENGTH_SHORT).show();
51         Log.i(tag, "MusicService onStart()");
52         mPlayer.start();
53     }
54
55     //该服务被销毁时调用该方法
56     @Override
57     public void onDestroy(){
58         Toast.makeText(this, "MusicService onDestroy()", Toast.LENGTH_SHORT).show();
59         mPlayer.stop();
60         Log.i(tag, "MusicService onDestroy()");
61     }
62 }

4、MainHelloService.java中的代码:

01 package android.basic.lesson14;
02
03 import android.app.Activity;
04 import android.content.ComponentName;
05 import android.content.Context;
06 import android.content.Intent;
07 import android.content.ServiceConnection;
08 import android.os.Bundle;
09 import android.os.IBinder;
10 import android.util.Log;
11 import android.view.View;
12 import android.view.View.OnClickListener;
13 import android.widget.Button;
14 import android.widget.Toast;
15
16 public class MainHelloService extends Activity {
17
18     //为日志工具设置标签
19     String tag = "MusicService";
20
21     /** Called when the activity is first created. */
22     @Override
23     public void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.main);
26
27         //输出Toast消息和日志记录
28         Toast.makeText(MainHelloService.this, "MainHelloService onCreate", Toast.LENGTH_SHORT).show();
29         Log.i(tag, "MainHelloService onCreate");
30
31         //定义组件对象
32         Button b1= (Button)findViewById(R.id.Button01);
33         Button b2= (Button)findViewById(R.id.Button02);
34         Button b3= (Button)findViewById(R.id.Button03);
35         Button b4= (Button)findViewById(R.id.Button04);
36
37          //定义服务链接对象
38          final ServiceConnection conn = new ServiceConnection(){
39
40             @Override
41             public void onServiceConnected(ComponentName name, IBinder service) {
42                 Toast.makeText(MainHelloService.this, "ServiceConnection onServiceConnected", Toast.LENGTH_SHORT).show();
43                 Log.i(tag, "ServiceConnection onServiceConnected");
44
45             }
46
47             @Override
48             public void onServiceDisconnected(ComponentName name) {
49                 Toast.makeText(MainHelloService.this, "ServiceConnection onServiceDisconnected", Toast.LENGTH_SHORT).show();
50                 Log.i(tag, "ServiceConnection onServiceDisconnected");
51
52             }};
53
54         //定义点击监听器
55         OnClickListener ocl= new OnClickListener(){
56
57             @Override
58             public void onClick(View v) {
59                 //显示指定intent所指的对象是个Service
60                 Intent intent = newIntent(MainHelloService.this,android.basic.lesson14.MusicService.class);
61                 switch(v.getId()){
62                 case R.id.Button01:
63                     //开始服务
64                     startService(intent);
65                     break;
66                 case R.id.Button02:
67                     //停止服务
68                     stopService(intent);
69                     break;
70                 case R.id.Button03:
71                     //绑定服务
72                     bindService(intent,conn,Context.BIND_AUTO_CREATE);
73                     break;
74                 case R.id.Button04:
75                     //解除绑定
76                     unbindService(conn);
77                     break;
78                 }
79             }
80         };
81
82         //绑定点击监听器
83         b1.setOnClickListener(ocl);
84         b2.setOnClickListener(ocl);
85         b3.setOnClickListener(ocl);
86         b4.setOnClickListener(ocl);   
87
88     }
89
90     @Override
91     public void onDestroy(){
92         super.onDestroy();
93         Toast.makeText(MainHelloService.this, "MainHelloService onDestroy", Toast.LENGTH_SHORT).show();
94         Log.i(tag, "MainHelloService onDestroy");
95     }
96 }

  • 大小: 54 KB
  • 大小: 311.3 KB
分享到:
评论

相关推荐

    不被杀死 service

    在安卓开发中,Service是一种用于在后台长时间运行的组件,它可以独立于用户界面执行任务,例如播放音乐、网络通信等。"不被杀死的 Service"指的是通过特定技术手段实现的Service,它能够在设备清理内存或者用户关闭...

    android service 简单实例源代码

    在Android开发中,Service是四大组件之一,它在后台运行,不与用户界面直接交互,常用于执行长时间的任务,如播放音乐、网络通信等。本篇文章将深入解析"android service 简单实例源代码",帮助你理解如何在Android...

    Service 启动与停止

    Service是Android系统中的一个重要组件,它负责在后台执行长时间运行的操作,不依赖于用户界面。在Android应用开发中,理解Service的启动与停止机制对于创建高效、稳定的后台服务至关重要。 一、Service概述 ...

    Activity绑定Service(Kotlin)

    在Android应用开发中,Service是用于执行长时间运行操作的一个组件,而Activity是用户与应用交互的界面。将Activity与Service绑定是一种常见的通信方式,尤其在需要在后台运行任务且需要与用户界面保持交互时。本...

    oracle service_name参数

    ### Oracle Service_Name 参数详解 #### 一、概述 在Oracle数据库管理中,`service_name`是一个重要的参数,它用于标识数据库实例所提供的服务名称。通过设置正确的`service_name`,可以确保客户端应用程序能够...

    通过Service播放音频的代码

    在Android开发中,Service是一种可以在后台长时间运行的组件,它不具有用户界面,但可以执行各种后台任务,如播放音乐。本示例的"通过Service播放音频的代码"旨在教你如何利用Service组件来实现音乐播放功能,使得...

    Java Service Wrapper使用总结

    Java Service Wrapper 使用总结 Java Service Wrapper 是一种可以将 Java 应用程序发布为可安装的服务的解决方案,它提供了一种简单的方式来将 Java 应用程序打包成一个独立的服务。下面是 Java Service Wrapper ...

    android 录音机 service 例子

    在这个"android 录音机 service 例子"中,我们将深入探讨如何结合Service和MediaRecorder来创建一个能够后台录制音频的应用。 1. **Service基础** Service组件是Android应用开发中的关键部分,它可以在没有用户...

    Service向Activity传值(kotlin)

    在Android应用开发中,Service和Activity是两个非常重要的组件。Service用于在后台执行长时间运行的任务,而Activity则负责用户界面交互。在某些场景下,我们可能需要Service与Activity之间进行数据传递,例如本例中...

    ServiceNow 基础手册

    ServiceNow是当今流行的企业服务管理平台,它提供了一个集成的系统,允许用户在一个统一的界面中管理和自动化企业内部的各种工作流程。ServiceNow平台的基础手册涵盖了该平台的基本使用方法,包括如何导航、管理记录...

    Android防止service多次执行startCommand

    在Android应用开发中,Service是四大组件之一,用于在后台长时间运行操作,比如播放音乐、网络通信等。然而,如果不加以控制,用户或者系统可能会多次启动同一个Service,导致不必要的资源消耗和服务的异常行为。本...

    Android-Service与Activity传值

    在Android应用开发中,`Service`和`Activity`是两个重要的组件。`Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如...

    android多个activity和一个service通信

    在Android应用开发中,Activity和Service是两个关键组件。Activity代表用户界面,而Service则用于在后台执行长时间运行的任务,不直接与用户交互。在实际项目中,常常需要多个Activity与一个Service进行通信,比如本...

    【Android】开机自启动Service

    在Android系统中,Service是一种可以在后台长时间运行的组件,它不提供用户界面,但可以执行各种任务,如播放音乐、网络通信等。当设备启动时,我们有时希望某些Service能够自动启动,以便立即开始执行预定的任务,...

    Android 多个service的action 相同冲突 验证demo

    在Android开发中,Service是应用程序组件之一,用于在后台执行长时间运行的操作,即使用户与应用程序交互界面不直接关联。在某些情况下,我们可能需要启动多个Service来执行不同的任务,但问题在于,如果这些Service...

    JavaService-2.0.10 32位,64位

    JavaService-2.0.10 是一个针对Java应用程序的服务包装工具,它允许开发者将Java应用程序作为Windows服务来运行。这个版本提供了32位和64位两种版本,以适应不同操作系统环境的需求。 在Windows系统中,服务是一种...

    用SQL语句解决Service Broker未启动的问题

    "解决 Service Broker 未启动的问题" Service Broker 是 SQL Server 中的一个组件,用于实现异步消息传递。它允许数据库管理员创建可靠的、可扩展的消息应用程序。但是,有时可能会遇到 Service Broker 未启动的...

    怎样区分Action, Service 和 Dao功能.

    区分Action、Service和Dao功能 在软件开发中,Action、Service和Dao都是常用的架构模式,但是很多开发者对这些概念的理解和使用却存在一定的混淆。因此,本文将对Action、Service和Dao的功能进行详细的区分和解释。...

    Android之Service实现比较大小

    在Android开发中,Service是应用程序组件之一,用于在后台执行长时间运行的操作,即使用户与应用程序交互的界面已关闭。本篇文章将深入探讨Android中的Service,分析不同类型的Service及其特性,并对比它们之间的...

    Android系统在新进程中启动自定义服务过程(startService)的原理

    "Android系统在新进程中启动自定义服务过程(startService)的原理" 在 Android 系统中,startService 函数是一个非常重要的函数,它允许开发者在新进程中启动自定义服务。这项技术可以将一些计算型逻辑从主进程中...

Global site tag (gtag.js) - Google Analytics