【Android】service入门讲解

转载请注明出处:http://blog.csdn.net/h28496/article/details/44302053


Service是什么

安卓的四大组件之一。实际效果和Activity差不多。在实际的使用中来看,Service如同是一个没有界面的Activity。


什么时候使用Service

需要做和Activity差不多的事,但是又没必要占用一个界面时就可以使用Service。


初学者关于Service的常见认知错误

有初学者误以为Service是一个线程,实际上Service不是一个线程,它工作在主线程中。

和上面类似,有的初学者误以为Service是和进程分开的,实际上,一般情况下Service是作为启动它的进程的一部分。


启动Service的两种方式

Context.startService(Intent intent)

调用服务者与服务没有关联,即使调用者不存在了,服务依然运行。


Context.bindService(Intent intent)

调用服务者与服务绑定,调用者退出,服务也退出。


Service的生命周期

相比Activity简单得多


第一次启动Service之后,依次调用onCreate()、onStart(),之后运行。

当Service停止运行时,将会调用onDestroy()。

注意:

① 如果Service没有Destroy,无论启动多少次都只有第一次才会执行onCreate()。除了第一次以外的都只会执行onStart()。

② 在API5之后 onStart()就被废弃了,我们可以用onStartCommand()代替。


代码示例

MyService.java

package zhp.app.servicetest;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.IBinder;

public class MyService extends Service {

	private MediaPlayer mediaPlayer;

	// ==============================
	// 继承或重写的方法
	// ==============================
	@Override
	public IBinder onBind(Intent arg0) {
		return null;
	}

	@Override
	public void onCreate() {
		// 在创建Service的时候初始化MediaPlayer
		initMediaPlayer();
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		// 在服务结束的时候停止播放音乐
		musicStop();
		super.onDestroy();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// 接收数据指令,并按指令执行
		if (intent != null) {
			Bundle bundle = intent.getExtras();
			if (bundle != null) {
				String command = bundle.getString("message");
				switch (command) {
				case "play":
					musicPlay();
					break;

				case "pause":
					musicPause();
					break;
				}
			}
		}
		return super.onStartCommand(intent, flags, startId);
	}

	// ==============================
	// 方法
	// ==============================
	/**
	 * 初始化MediaPlayer
	 */
	private void initMediaPlayer() {
		if (mediaPlayer == null) {
			mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.bgm);
		}
		mediaPlayer.seekTo(0);
	}

	/**
	 * 音乐播放
	 */
	public void musicPlay() {
		if (mediaPlayer == null) {
			initMediaPlayer();
		}
		mediaPlayer.start();
	}

	/**
	 * 音乐暂停
	 */
	public void musicPause() {
		if (mediaPlayer != null) {
			mediaPlayer.pause();
		}
	}

	/**
	 * 音乐结束
	 */
	public void musicStop() {
		if (mediaPlayer != null) {
			mediaPlayer.stop();
			mediaPlayer.release();
			mediaPlayer = null;
		}

	}
}

MainActivity.java

package zhp.app.servicetest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnClickListener {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	public void onClick(View v) {
		// 和Activity的启动一样
		Intent intent = new Intent(this, MyService.class);
		Bundle bundle = new Bundle();

		switch (v.getId()) {
		case R.id.main_play:
			bundle.putString("message", "play");
			break;
		case R.id.main_pause:
			bundle.putString("message", "pause");
			break;
		case R.id.main_stop:
			stopService(intent);
			return;
		}
		// 在这里传送数据,Service在onStartCommand()中接收数据
		intent.putExtras(bundle);

		// Activity是startActivity(), Service是startService()
		// 也可以改为Service的另外一种启动方式: bindService()
		startService(intent);
	}
}

Service和Activity都需要在manifest中注册:

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
        <activity
            android:name=".MainActivity"
            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=".MyService" >
	    </service>  
        
    </application>


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值