Android Service 的使用

  1、要使用Service,首先就是在配置文件里吗添加Service,如果不填加,你的Service是不能够使用的。目前学到的方法有两种

    方法一:<service android:enabled="true" android:name=".PlayService" />

    方法二:<service android:name=".PlayService" />

    点后面是Service类的名字。

  2、工程包括两个类:

    ServiceActivity.java

    PlayService.java

    其中:ServiceActivity.java定义了两个按钮,分别控制音乐的播放与停止。

    用startService和stopService完成Activity与Service之间的切换,启动Service以及取消Service,

    如果不用按钮,可以在Activity的OnCreate和OnDestrpy里面启动和取消Service,如下:

 1 @Override
 2 public void onCreate(Bundle savedInstanceState) {
 3     super.onCreate(savedInstanceState);
 4     setContentView(R.layout.main);
 5     this.startService(new Intent(this, PlayService.class));
 6 }
 7 
 8 @Override
 9 protected void onDestroy() {
10     super.onDestroy();
11     this.stopService(new Intent(this,PlayService.class));
12 }

  在activity里面,如果需要使用Service的话,需要调用startService(),从而利用startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。

  启动一个Service的过程如下:context.startService() ->onCreate()->onStart()->Servicerunning其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务。

  停止一个Service的过程如下:context.stopService() |->onDestroy() ->Service stop 

  创建Service需要继承自 android.app.Service 的类,然后重新实现在Service各个状态要回调的方法,Service的回调方法有三个,分别是:

    • onCreate()
      创建
    • onStart()
      开始
    • onDestry()
      释放

  注意:Service是不能自己启动的,只有通过 Context 对象 调用startService和bindService方法来启动。也就是说Service不能自己调用的,所以我们看见很多Service都是用Activity调用的。

  (1)Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次);stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。 注意,多次调用Context.startservice()不会嵌套(即使会有相应的onStart()方法被调用),所以无论同一个服务被启动了多少次,一旦调用Context.stopService()或者stopSelf(),他都会被停止。补充说明:传递给startService()的Intent对象会传递给onStart()方法。调用顺序为:onCreate --> onStart(可多次调用) --> onDestroy。
  (2)Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一起就共存亡了
补充说明:传递给bindService()的Intent对象会传递给onBind(),传递给unbindService()的Intent对象会传递给onUnbind()方法调用顺序为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。
  (3)注意事项:在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。还有一点,目前我没有遇到过需要startService和bindService交互使用的情况(我认为不会有这种需求),所以不必去考虑交互的问题,待遇到时再考虑不迟。
  (4)BroadcastReceiver只能通过startService启动Service,因为广播本身生命周期很短,bind的话没有意义

  PlayService.java是Service类,

  包括OnCreate,OnStart,OnDestroy三种方法,

  其中OnCreate可有可无,如果有,可以在这里创建与MediaPlayerd的链接。如果无,可以在Onstart里面创建这个链接。

    OnCreate在音乐播放周期里面(未OnDestroy)之前,只创建一次,而每按一次播放,OnStart就会被调用一次。

    OnStart,里面可以启动播放音乐,

    OnDestroy,里面调用停止播放音乐。

  如果按了停止按钮,会调用(或者打印Log更直观)“ServiconDestroy“,但是Activity不会退出。

  当退出Activity的时候,会相继调用(或者打印Log更直观)"ActivityonStop",和"ActivityOnDestroy"此时,音乐播放是不会停止的,

  可以知道,如果想让Service一启动就执行的代码,可以写在Service的OnCreate或OnStart,里面,会在启动Service的时候自动调用,与Activity自动调用OnCreate道理是一样的。

 1 package com.service.su;
 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 ServiceActivity extends Activity implements OnClickListener {
12     /** Called when the activity is first created. */
13     Button buttonOn, buttonOff;
14     String TAG = "ServiceActivity";
15 
16     @Override
17     public void onCreate(Bundle savedInstanceState) {
18         super.onCreate(savedInstanceState);
19         setContentView(R.layout.main);
20 
21         buttonOn = (Button) findViewById(R.id.button_on);
22         buttonOff = (Button) findViewById(R.id.button_off);
23 
24         buttonOn.setOnClickListener(this);
25         buttonOff.setOnClickListener(this);
26         Log.v(TAG, "ActivityonCreate");
27     }
28 
29     @Override
30     public void onClick(View v) {
31         // TODO Auto-generated method stub
32         switch (v.getId()) {
33         case (R.id.button_on):
34             Log.v(TAG, "ActivitystartService");
35         this.startService(new Intent(this,PlayService.class));
36         // startService(new Intent(this, PlayService.class));
37             
38             break;
39         case (R.id.button_off): {
40             Log.v(TAG, "ActivitystopService");
41              this.stopService(new Intent(this,PlayService.class));
42              //stopService(new Intent(this, PlayService.class));
43         
44         }
45             break;
46             
47          default:
48              break;
49         
50         }
51 
52     }
53 
54     @Override
55     protected void onStop() {
56         // TODO Auto-generated method stub
57         super.onStop();
58         Log.v(TAG, "ActivityonStop");
59     }
60 
61     @Override
62     protected void onDestroy() {
63         // TODO Auto-generated method stub
64         Log.v(TAG, "ActivityonDestroy");
65         super.onDestroy();
66 
67     }
68 
69 }
 1 package com.service.su;
 2 
 3 import java.io.IOException;
 4 
 5 import android.app.Service;
 6 import android.content.Intent;
 7 import android.media.MediaPlayer;
 8 import android.os.IBinder;
 9 import android.util.Log;
10 import android.widget.Toast;
11 
12 public class PlayService extends Service {
13     String TAG = "ServiceActivity";
14     MediaPlayer mediaPlayer;
15 
16     @Override
17     public IBinder onBind(Intent intent) {
18         // TODO Auto-generated method stub
19         return null;
20     }
21 
22     @Override
23     public void onCreate() {
24         // TODO Auto-generated method stub
25         super.onCreate();
26         Toast.makeText(this, "Play Service Created", Toast.LENGTH_LONG).show();
27         Log.v(TAG, "ServiceonCreate");
28 
29         mediaPlayer = MediaPlayer.create(this, R.raw.test);
30 
31         /*
32          * 要用MediaPlayer来创建,不能用MediaPlayer的对象来创建 // 不用带后缀 mediaPlayer = new
33          * MediaPlayer(); mediaPlayer.create(this, R.raw.test);
34          */
35 
36         /*
37          * try { mediaPlayer.setDataSource("/sdcard/music/lost times.mp3");
38          * mediaPlayer.prepare();
39          * 
40          * 
41          * //方法二,从网上的链接获取歌曲 try { mediaPlayer.setDataSource(
42          * "http://www.yousss.com/uploadfile/mp3/2007-11/20071129134414713.mp3"
43          * );
44          */
45 
46         // mediaPlayer.setLooping(true);
47     }
48 
49     @Override
50     public void onStart(Intent intent, int startId) {
51         // TODO Auto-generated method stub
52         super.onStart(intent, startId);
53         /*
54          * //可以在OnCreate里面创建与音乐的链接,也可以在OnStart里面创建 mediaPlayer =
55          * MediaPlayer.create(this, R.raw.test);
56          */
57         Toast.makeText(this, "Play Service onStart", Toast.LENGTH_LONG).show();
58         Log.v(TAG, "ServiceonStart");
59         mediaPlayer.start();
60     }
61 
62     @Override
63     public void onDestroy() {
64         // TODO Auto-generated method stub
65         super.onDestroy();
66         Toast.makeText(this, "Play Service Stopped", Toast.LENGTH_LONG).show();
67         Log.v(TAG, "ServiconDestroy");
68         mediaPlayer.stop();
69     }
70 
71 }

转载于:https://www.cnblogs.com/myxiaoQ/articles/3650147.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值