`
zgymm2008
  • 浏览: 11995 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Android Service生命周期及用法

阅读更多
Android Service生命周期及用法
Service概念及用途:
Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行,那 我们什么时候会用到Service呢?比如我们播放音乐的时候,有可能想边听音乐边干些其他事情,当我们退出播放音乐的应用,如果不用Service,我 们就听不到歌了,所以这时候就得用到Service了,又比如当我们一个应用的数据是通过网络获取的,不同时间(一段时间)的数据是不同的这时候我们可以 用Service在后台定时更新,而不用每打开应用的时候在去获取。
Service生命周期 :
Android Service的生命周期并不像Activity那么复杂,它只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法,具体的可以看下面的实例。
Service与Activity通信:
Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)这一节我不作过多描述,当我们想获取启动的Service实例时,我们可以用到bindService和onBindService方法,它们分别执行了Service中IBinder()和onUnbind()方法。
为了让大家 更容易理解,我写了一个简单的Demo,大家可以模仿着我,一步一步的来。
第一步:新建一个Android工程,我这里命名为ServiceDemo.
第二步:修改main.xml代码,我这里增加了四个按钮,代码如下:
view plain§copy to clipboard§print§?§
1<?xml version="1.0" encoding="utf-8"?> 
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
3    android:orientation="vertical" 
4    android:layout_width="fill_parent" 
5    android:layout_height="fill_parent" 
6    > 
7    <TextView 
8        android:id="@+id/text"   
9        android:layout_width="fill_parent"  
10        android:layout_height="wrap_content"  
11        android:text="@string/hello" 
12        /> 
13    <Button 
14        android:id="@+id/startservice" 
15        android:layout_width="fill_parent" 
16        android:layout_height="wrap_content" 
17        android:text="startService" 
18    /> 
19    <Button 
20        android:id="@+id/stopservice" 
21        android:layout_width="fill_parent" 
22        android:layout_height="wrap_content" 
23        android:text="stopService" 
24    /> 
25    <Button 
26        android:id="@+id/bindservice" 
27        android:layout_width="fill_parent" 
28        android:layout_height="wrap_content" 
29        android:text="bindService" 
30    /> 
31    <Button 
32        android:id="@+id/unbindservice" 
33        android:layout_width="fill_parent" 
34        android:layout_height="wrap_content" 
35        android:text="unbindService" 
36    /> 
37</LinearLayout> 


第三步:新建一个Service,命名为MyService.java代码如下:
view plain§copy to clipboard§print§?§
38package com.tutor.servicedemo; 
39import android.app.Service; 
40import android.content.Intent; 
41import android.os.Binder; 
42import android.os.IBinder; 
43import android.text.format.Time; 
44import android.util.Log; 
45public class MyService extends Service { 
46    //定义个一个Tag标签 
47    private static final String TAG = "MyService"; 
48    //这里定义吧一个Binder类,用在onBind()有方法里,这样Activity那边可以获取到 
49    private MyBinder mBinder = new MyBinder(); 
50    @Override 
51    public IBinder onBind(Intent intent) { 
52        Log.e(TAG, "start IBinder~~~"); 
53        return mBinder; 
54    } 
55    @Override 
56    public void onCreate() { 
57        Log.e(TAG, "start onCreate~~~"); 
58        super.onCreate(); 
59    } 
60     
61    @Override 
62    public void onStart(Intent intent, int startId) { 
63        Log.e(TAG, "start onStart~~~"); 
64        super.onStart(intent, startId);  
65    } 
66     
67    @Override 
68    public void onDestroy() { 
69        Log.e(TAG, "start onDestroy~~~"); 
70        super.onDestroy(); 
71    } 
72     
73     
74    @Override 
75    public boolean onUnbind(Intent intent) { 
76        Log.e(TAG, "start onUnbind~~~"); 
77        return super.onUnbind(intent); 
78    } 
79     
80    //这里我写了一个获取当前时间的函数,不过没有格式化就先这么着吧 
81    public String getSystemTime(){ 
82         
83        Time t = new Time(); 
84        t.setToNow(); 
85        return t.toString(); 
86    } 
87     
88    public class MyBinder extends Binder{ 
89        MyService getService() 
90        { 
91            return MyService.this; 
92        } 
93    } 
94} 


第四步:修改ServiceDemo.java,代码如下:
view plain§copy to clipboard§print§?§
95package com.tutor.servicedemo; 
96import android.app.Activity; 
97import android.content.ComponentName; 
98import android.content.Context; 
99import android.content.Intent; 
100import android.content.ServiceConnection; 
101import android.os.Bundle; 
102import android.os.IBinder; 
103import android.view.View; 
104import android.view.View.OnClickListener; 
105import android.widget.Button; 
106import android.widget.TextView; 
107public class ServiceDemo extends Activity implements OnClickListener{ 
108    
109    private MyService  mMyService; 
110    private TextView mTextView; 
111    private Button startServiceButton; 
112    private Button stopServiceButton; 
113    private Button bindServiceButton; 
114    private Button unbindServiceButton; 
115    private Context mContext; 
116     
117    //这里需要用到ServiceConnection在Context.bindService和context.unBindService()里用到 
118    private ServiceConnection mServiceConnection = new ServiceConnection() { 
119        //当我bindService时,让TextView显示MyService里getSystemTime()方法的返回值  
120        public void onServiceConnected(ComponentName name, IBinder service) { 
121            // TODO Auto-generated method stub 
122            mMyService = ((MyService.MyBinder)service).getService(); 
123            mTextView.setText("I am frome Service :" + mMyService.getSystemTime()); 
124        } 
125         
126        public void onServiceDisconnected(ComponentName name) { 
127            // TODO Auto-generated method stub 
128             
129        } 
130    }; 
131    public void onCreate(Bundle savedInstanceState) { 
132        super.onCreate(savedInstanceState); 
133        setContentView(R.layout.main); 
134        setupViews(); 
135    } 
136     
137    public void setupViews(){ 
138     
139        mContext = ServiceDemo.this; 
140        mTextView = (TextView)findViewById(R.id.text); 
141         
142         
143         
144        startServiceButton = (Button)findViewById(R.id.startservice); 
145        stopServiceButton = (Button)findViewById(R.id.stopservice); 
146        bindServiceButton = (Button)findViewById(R.id.bindservice); 
147        unbindServiceButton = (Button)findViewById(R.id.unbindservice); 
148         
149        startServiceButton.setOnClickListener(this); 
150        stopServiceButton.setOnClickListener(this); 
151        bindServiceButton.setOnClickListener(this); 
152        unbindServiceButton.setOnClickListener(this); 
153    } 
154    
155    public void onClick(View v) { 
156        // TODO Auto-generated method stub 
157        if(v == startServiceButton){ 
158            Intent i  = new Intent(); 
159            i.setClass(ServiceDemo.this, MyService.class); 
160            mContext.startService(i); 
161        }else if(v == stopServiceButton){ 
162            Intent i  = new Intent(); 
163            i.setClass(ServiceDemo.this, MyService.class); 
164            mContext.stopService(i); 
165        }else if(v == bindServiceButton){ 
166            Intent i  = new Intent(); 
167            i.setClass(ServiceDemo.this, MyService.class); 
168            mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE); 
169        }else{ 
170            mContext.unbindService(mServiceConnection); 
171        } 
172    } 
173     
174     
175     
176} 


第五步:修改AndroidManifest.xml代码(将我们新建的MyService注册进去如下代码第14行:)

view plain§copy to clipboard§print§?§
177<?xml version="1.0" encoding="utf-8"?> 
178<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
179      package="com.tutor.servicedemo" 
180      android:versionCode="1" 
181      android:versionName="1.0"> 
182    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
183        <activity android:name=".ServiceDemo" 
184                  android:label="@string/app_name"> 
185            <intent-filter> 
186                <action android:name="android.intent.action.MAIN" /> 
187                <category android:name="android.intent.category.LAUNCHER" /> 
188            </intent-filter> 
189        </activity> 
190        <service android:name=".MyService" android:exported="true"></service> 
191    </application> 
192    <uses-sdk android:minSdkVersion="7" /> 
193</manifest>  


第六步:执行上述工程

点击startServie按钮时先后执行了Service中onCreate()->onStart()这两个方法,打开Logcat视窗效果如下图:

我们这时可以按HOME键进入Settings(设置)->Applications(应用)->Running Services(正在运行的服务)看一下我们新启动了一个服务

点击stopService按钮时,Service则执行了onDestroy()方法

这时候我们再次点击startService按钮,然后点击bindService按钮(通常bindService都是bind已经启动的Service),我们看一下Service执行了IBinder()方法,以及TextView的值也有所变化了

最后点击unbindService按钮,则Service执行了onUnbind()方法

分享到:
评论

相关推荐

    AndroidService生命周期及用法[收集].pdf

    AndroidService生命周期及用法[收集].pdf

    Android Service生命周期及用法!

    非常简单明了的 android java 层的 service分析。

    Android中service基本用法,生命周期1

    startService启动方式,只在activity中启动和销毁,和activity关系不大,即使antivity退出,服务任然运行,比如后台放音乐,对应生命周期: bindService启动方式,和activity绑定后,和activity共存亡,activity...

    Android中service基本用法,生命周期2

    startService启动方式,只在activity中启动和销毁,和activity关系不大,即使antivity退出,服务任然运行,比如后台放音乐,对应生命周期: bindService启动方式,和activity绑定后,和activity共存亡,activity...

    Android课程第一次实验报告_Andorid应用程序Activity生命周期.docx

     对于应用开发者来说,理解不同的应用组件(特别是Activity、Service、Intent Receiver)对应用进程的生命周期的影响,这是非常重要的。如果没有正确地使用这些组件,将会导致当应用正在处理重要的工作时,进程却被...

    Android service类的应用及源码例子.rar

    Android service类的应用及源码例子,通过Android service类创建一个音乐服务模块,演示service类的创建、启动和方法使用,以及Service生命周期的说明,该例子继承service 然后重写onStart播放音乐 重写onDestry停止...

    疯狂Android讲义第10章源码(Android服务Service_详解)

     10.1.4 Service的生命周期 381  10.2 跨进程调用Service  (AIDL服务) 382  10.2.1 AIDL服务简介 382  10.2.2 创建AIDL文件 383  10.2.3 将接口暴露给客户端 383  10.2.4 客户端访问AIDLService 385  10.3...

    使用startservice方法启动服务,并检测服务的生命周期

    使用startservice方法启动服务,并检测服务的生命周期

    Android Service控件用法实例分析

    本文实例讲述了Android...定义一个Service比较简单,只要继承Service类,实现其生命周期的方法即可。一个定义好的Service必须在AndroidManifest.xml文件中通过&lt;service&gt;声明才能使用 &lt;service android:name=MyService&gt;

    Android应用开发详解

    Android 基本程序单元Activity,讲述了Android中重要组件Activity的创建、启动和生命周期等内容 第6章 Android组件之间的信使Intent Android 组件之间的信使Intent,讲述了Intent对象及其属性、Intent的实现策略和...

    Android中startService基本使用方法概述

    主要介绍了Android中startService基本使用方法,详细解释了startService的基本使用概述及其生命周期,需要的朋友可以参考下

    android 开发技巧合集

    0、ANDROID常用类库说明 6 1、ANDROID文件系统与应用程序架构 7 1.1、ANDROID 文件系统 7 ...2.3.3、Service的生命周期 32 2.3.4、判断服务开启状态 33 2.3.5、获取启动的服务 34 2.4、CONTENT PROVIDER 35

    Android开发之Service用法实例

    Service是一个生命周期较长而且没有界面的程序。 下面通过一个播放mp3的例子来学习。 先看MainActivity.java package com.example.servicetest; import android.app.Activity; import android.content.Intent; ...

    Android开发案例驱动教程 配套代码

    13.1.1 本地Service生命周期 317 13.1.2 远程Service生命周期 318 13.2 本地Service 319 13.2.1 本地Service案例 319 13.2.2 编写AudioService 320 13.2.3 调用Service 322 13.2.4 重构案例 323 13.3 远程...

    Android实验五.doc

    掌握 Service 的启动和停止方法,熟悉 Service 的生命周期,掌握 NotificationManager的使用方法。 【实验要求】 1、 练习使用两种方式启动 Service,并通过 Logcat 观察 Service 的生命周期 2、 练习使用 ...

    Android通过startService实现文件批量下载

    关于startService的基本使用概述及其生命周期可参见《Android中startService基本使用方法概述》。 本文通过批量下载文件的简单示例,演示startService以及stopService(startId)的使用流程,具体内容如下 系统界面...

    《Android系统源代码情景分析》

    2.5 开发Android应用程序来使用硬件访问服务 第3章 智能指针 3.1 轻量级指针 3.1.1 实现原理分析 3.1.2 应用实例分析 3.2 强指针和弱指针 3.2.1 强指针的实现原理分析 3.2.2 弱指针的实现原理分析 ...

    android的服务

    Service在Android中是一种长生命周期的组件,它不实现任何用户界面。最常见的例子如:媒体播放器程序,它可以在转到后台运行的时候仍然能保持播放歌曲;或者如文件下载程序,它可以在后台执行文件的下载。 让我们来...

    Android项目设计与开发:服务的概念.ppt

    嵌入式Android项目设计与开发 第八章 服务 —— 服务的概念 服务的概念 服务(Service)是Android中的四大组件之一,它能够长期在后台运行...使用不同的方法启动服务,服务的生命周期也会不同。 谢谢 请专家批评指正!

Global site tag (gtag.js) - Google Analytics