您的位置:首页 > 移动开发 > Android开发

Android Service的使用解析

2015-10-12 20:42 411 查看
转载

特别注意:

1、你应当知道在调用 bindService 绑定到Service的时候,你就应当保证在某处调用 unbindService 解除绑定(尽管
Activity 被 finish 的时候绑定会自      动解除,并且Service会自动停止);

2、你应当注意 使用 startService 启动服务之后,一定要使用 stopService停止服务,不管你是否使用bindService;

3、同时使用 startService 与 bindService 要注意到,Service
的终止,需要unbindService与stopService同时调用,才能终止 Service,不管 startService
与 bindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService
此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如Activity 被 finish 的时候)之后服务才会自动停止;

4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的 Activity 如果会自动旋转的话,旋转其实是 Activity 的重新创建,因此旋转之前的使用 bindService 建立的连接便会断开(Context 不存在了),对应服务的生命周期与上述相同。

5、在 sdk 2.0 及其以后的版本中,对应的 onStart 已经被否决变为了 onStartCommand,不过之前的 onStart
任然有效。这意味着,如果你开发的应用程序用的 sdk 为 2.0 及其以后的版本,那么你应当使用 onStartCommand 而不是 onStart。

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,如下:
代码

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

<span style="white-space:pre">	</span>this.startService(new Intent(this, PlayService.class));
     }

     @Override
     protected void onDestroy() {
<span style="white-space:pre">	</span>super.onDestroy();
<span style="white-space:pre">	</span>this.stopService(new Intent(this,PlayService.class));
     }


在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道理是一样的。

代码如下:

代码

package com.service.su;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class ServiceActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    Button buttonOn, buttonOff;
    String TAG = "ServiceActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        buttonOn = (Button) findViewById(R.id.button_on);
        buttonOff = (Button) findViewById(R.id.button_off);

        buttonOn.setOnClickListener(this);
        buttonOff.setOnClickListener(this);
        Log.v(TAG, "ActivityonCreate");
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case (R.id.button_on):
            Log.v(TAG, "ActivitystartService");
        this.startService(new Intent(this,PlayService.class));
        // startService(new Intent(this, PlayService.class));
            
            break;
        case (R.id.button_off): {
            Log.v(TAG, "ActivitystopService");
             this.stopService(new Intent(this,PlayService.class));
             //stopService(new Intent(this, PlayService.class));
        
        }
            break;
            
         default:
             break;
        
        }

    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        Log.v(TAG, "ActivityonStop");
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        Log.v(TAG, "ActivityonDestroy");
        super.onDestroy();

    }

}


代码

package com.service.su;

import java.io.IOException;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;

public class PlayService extends Service {
    String TAG = "ServiceActivity";
    MediaPlayer mediaPlayer;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Toast.makeText(this, "Play Service Created", Toast.LENGTH_LONG).show();
        Log.v(TAG, "ServiceonCreate");

        mediaPlayer = MediaPlayer.create(this, R.raw.test);

        /*
         * 要用MediaPlayer来创建,不能用MediaPlayer的对象来创建 // 不用带后缀 mediaPlayer = new
         * MediaPlayer(); mediaPlayer.create(this, R.raw.test);
         */

        /*
         * try { mediaPlayer.setDataSource("/sdcard/music/lost times.mp3");
         * mediaPlayer.prepare();
         * 
         * 
         * //方法二,从网上的链接获取歌曲 try { mediaPlayer.setDataSource(
         * "http://www.yousss.com/uploadfile/mp3/2007-11/20071129134414713.mp3"
         * );
         */

        // mediaPlayer.setLooping(true);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);
        /*
         * //可以在OnCreate里面创建与音乐的链接,也可以在OnStart里面创建 mediaPlayer =
         * MediaPlayer.create(this, R.raw.test);
         */
        Toast.makeText(this, "Play Service onStart", Toast.LENGTH_LONG).show();
        Log.v(TAG, "ServiceonStart");
        mediaPlayer.start();
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Toast.makeText(this, "Play Service Stopped", Toast.LENGTH_LONG).show();
        Log.v(TAG, "ServiconDestroy");
        mediaPlayer.stop();
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: