Android四大组件之Service

Android四大组件之Service


Service是Android系统中的一种组件,它跟Activity的级别差不多,但是它不能自己运行,只能后台运行,并且可以和其它组件进行交互。Service是没有界面的长生命周期的代码。Service是一种程序,它可以运行很长时间,但是它却没有用户界面。这么说有点枯燥,来看个例子,打开一个因为播放器的程序,这个时候若想要上网了,那么,我们打开Android浏览器,这个时候虽然我们已经进入了浏览器程序,但是,歌曲播放并没有停止,而是在后台继续一首接一首地播放着。其实这个播放器就是由播放音乐的Service进行控制的。
当然这个播放音乐的Service也可以停止,例如,当播放列表里边的歌曲都结束了或者用户按下了停止音乐播放器的快捷键等。Service可以在很多场合的应用中使用,比如播放多媒体的时候用户启动了其它Activity,这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录用户地理位置的改变等等。总之服务嘛,总是隐藏在后台的。

开启Service有两种方式。
  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退出了,Service就会调用onUnbind->onDestroy相应退出。所谓绑定在一起就共存亡了。
下面我们就以实例论英雄来学习一下Service的用户。在这个例子中,我们在一个Activity中设置两个按钮,一个按钮用来启动Service,一个按钮用来停止Service。在Service中使用相应的函数实现音乐的播放和停止,项目的目录结构如下图所示。


如下是PlayMusicActivity.java的代码,在代码中定义了两个按钮,并分别为这两个按钮绑定了监听器,在这两个监听器中分别打开和关闭指定的Service。
public class PlayMusicActivity extends Activity{
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//开始按钮
		Button btnStart=(Button)findViewById(R.id.btnStart);
		//停止按钮
		Button btnStop=(Button)findViewById(R.id.btnStop);
		//用于启动和停止Service的Intent
		final Intent serviceIntent=new Intent("android.veione.service.playmusic");
		//为"开始"按钮绑定监听器
		btnStart.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//启动服务
				startService(serviceIntent);
			}
		});
		//为"停止"按钮绑定监听器
		btnStop.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//停止服务
				stopService(serviceIntent);
			}
		});
	}
}
如下就是PlayMusicService.java的代码,在服务启动的时候将会执行onStart(),在关闭的时候将会执行onDestroy(),因此,我们在onStart()函数中开始播放音乐,在OnDestroy()中停止音乐。程序用到的音乐我们已经预先放到了res/raw/目录下。
public class PlayMusicService extends Service {
	//定义音乐播放器
	private MediaPlayer mMediaPlayer;
	
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		//装载音乐
		mMediaPlayer=MediaPlayer.create(this, R.raw.circulation);
		//开始播放音乐
		mMediaPlayer.start();
		return super.onStartCommand(intent, flags, startId);
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		//停止播放音乐
		mMediaPlayer.stop();
	}
}
在布局文件中,定义了两个按钮,一个ID为btnStart,另一个ID为btnStop,分别用于播放音乐和停止音乐,如下所示。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/title" />

    <Button
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnStart" />

    <Button
        android:id="@+id/btnStop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnStop" />

</LinearLayout>
然后再在Androidmanifest.xml中增加对这个Service的定义,此处的<intent-filter>中的action名字可以任意。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.playmusic"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.veione.ui.PlayMusicActivity"
            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:name="com.veione.ui.PlayMusicService" >
            <intent-filter>
                <action android:name="android.veione.service.playmusic" />
            </intent-filter>
        </service>
    </application>

</manifest>
最后我们运行该程序,单击“开始”按钮,可以听到音乐,这时候我们退出了这个程序,音乐也不会停止,表明播放音乐这个动作一直在后台执行者。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值