Chinaunix首页 | 论坛 | 博客
  • 博客访问: 489392
  • 博文数量: 153
  • 博客积分: 3010
  • 博客等级: 中校
  • 技术积分: 1724
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-08 11:55
文章分类

全部博文(153)

文章存档

2011年(1)

2010年(55)

2009年(88)

2008年(9)

我的朋友

分类: LINUX

2010-10-26 17:54:23



n   使用Intent启动Service

n   建立Service应用程序,以播放背景MP3歌曲

n  Service 生命周期


Android开发中,当需要创建在后台运行的程序的时候,就 要使用到Service。Service 可以分为有无限生命和有限生命两种。


启动一个Service的过程如下:

context.startService()  ->onCreate()- >onStart()->Service running

其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。

 停止一个Service的过程如下:

context.stopService() | ->onDestroy() ->Service stop


本例使用的是startService().  如果使用bindService(), 情况与startService()略有不同:

bindService() - 使 当前上下文对象(本例中就是 Activity)通过一个 ServiceConnection 对象邦定到指定的 Service 。这样,如果上下文 对象销毁了的话,那么其对应的 Service 也会被销毁。



1). 定义服务,MyService.java:
  1. package com.example;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.media.MediaPlayer;  
  6. import android.os.IBinder;  
  7. import android.util.Log;  
  8. import android.widget.Toast;  
  9.   
  10. public class MyService extends Service {  
  11.     private static final String TAG = "MyService";  
  12.     MediaPlayer player;  
  13.       
  14.     @Override  
  15.     public IBinder onBind(Intent intent) {  
  16.         return null;  
  17.     }  
  18.       
  19.     @Override  
  20.     public void onCreate() {  
  21.         Toast.makeText(this"My Service Created", Toast.LENGTH_LONG).show();  
  22.         Log.d(TAG, "onCreate");  
  23.           
  24.         player = MediaPlayer.create(this, R.raw.braincandy);//运行例子是,需要替换音乐的名称  
  25.         player.setLooping(false); // Set looping  
  26.     }  
  27.   
  28.     @Override  
  29.     public void onDestroy() {  
  30.         Toast.makeText(this"My Service Stopped", Toast.LENGTH_LONG).show();  
  31.         Log.d(TAG, "onDestroy");  
  32.         player.stop();  
  33.     }  
  34.       
  35.     @Override  
  36.     public void onStart(Intent intent, int startid) {  
  37.         Toast.makeText(this"My Service Started", Toast.LENGTH_LONG).show();  
  38.         Log.d(TAG, "onStart");  
  39.         player.start();  
  40.     }  


2). Manifest.xml
  1. xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android=""  
  3.   package="com.example" android:versionCode="1" android:versionName="1.0">  
  4.   <application android:icon="@drawable/icon" android:label="@string/app_name">  
  5.     <activity android:name=".ServicesDemo" android:label="@string/app_name">  
  6.       <intent-filter>  
  7.         <action android:name="android.intent.action.MAIN" />  
  8.         <category android:name="android.intent.category.LAUNCHER" />  
  9.       intent-filter>  
  10.     activity>  
  11.     <service android:enabled="true" android:name=".MyService" />  
  12.   application>  
  13.   <uses-sdk android:minSdkVersion="3" />  
  14. manifest>  


3). ServicesDemo.java
  1. package com.example;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10.   
  11. public class ServicesDemo extends Activity implements OnClickListener {  
  12.   private static final String TAG = "ServicesDemo";  
  13.   Button buttonStart, buttonStop;  
  14.   
  15.   @Override  
  16.   public void onCreate(Bundle savedInstanceState) {  
  17.     super.onCreate(savedInstanceState);  
  18.     setContentView(R.layout.main);  
  19.   
  20.     buttonStart = (Button) findViewById(R.id.buttonStart);  
  21.     buttonStop = (Button) findViewById(R.id.buttonStop);  
  22.   
  23.     buttonStart.setOnClickListener(this);  
  24.     buttonStop.setOnClickListener(this);  
  25.   }  
  26.   
  27.   public void onClick(View src) {  
  28.     switch (src.getId()) {  
  29.     case R.id.buttonStart:  
  30.       Log.d(TAG, "onClick: starting srvice");  
  31.       startService(new Intent(this, MyService.class));  
  32.       break;  
  33.     case R.id.buttonStop:  
  34.       Log.d(TAG, "onClick: stopping srvice");  
  35.       stopService(new Intent(this, MyService.class));  
  36.       break;  
  37.     }  
  38.   }  



Service的生命周期

Service的生命周期方法比Activity少 一些,只有onCreate, onStart, onDestroy
我们有两种方式启动一个
Service,他们对Service生 命周期的影响是不一样的。


1 通过startService

    Service会经历 onCreate -> onStart
   stopService的时候直接onDestroy

   如果是调用者(TestServiceHolder)自己直接退出而没有调用stopService的
   话,
Service会 一直在后台运行。
   下次TestServiceHolder再起来可以stopService。

 

2 通过bindService   

    Service只会运行onCreate, 这个时候 TestServiceHolder 和TestService绑定在一起

   TestServiceHolder 退出了,Srevice就会调用onUnbind->onDestroyed
   所谓绑定在一起就共存亡了。

 

要是这几个方法交织在一起的话,会出现什么情况呢?
一个 原则是
Service的 onCreate的方法只会被调用一次,就是你无论多少次的startService又 bindService,Service只 被创建一次。如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先 是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,对啊,就是stopService不好使了,只 能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。

阅读(473) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~