Android-Service (基本知识,生命周期,实例-startService 启动的服务音乐播放器后台服务播放)

1.回顾

   上篇 学习了 Android的四大组件之一 BroadCastReceiver 的 相关知识

2.重点

  (1)Service 分类

  (2)Service 的生命周期

  (3)Service 标签 下的属性

  (4)什么时候使用BindService 和 startService ?

  (5)实例 - 通过Service 服务 实现 音乐播放器 后台播放

3.Service 分类

   3.1 按照地点分

   (1)本地服务 

       服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。

     缺点:主进程被Kill后,服务便会终止。

   (2)远程服务 (一般为系统服务)

      服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。

    缺点:该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。


  3.2 按 运行分类

    (1)前台服务

           会在通知一栏显示 ONGOING 的 Notification,当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用。常见的如音乐播放服务。

    (2)后台服务

           默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification。当服务被终止的时候,用户是看不到效果的。某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。

 

  3.3 按 使用 分类

    (1)startService 启动的服务

          主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService!

   (2)bindService 启动的服务

          该方法启动的服务要进行通信。停止服务使用unbindService ;

    (3)startService 同时也 bindService 启动的服务

         停止服务应同时使用stepService与unbindService

4.Service 生命周期

    4.1 Start方式

      startService() : onCreate()   ->  onStart()   ->  onDestroy() 


 

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


    4.2 bind方式

      onBindService(): onCreate()  -> onBind()  -> onUnbind()  -> onDestroy()



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


5. Service 标签下的属性

(1)android:name : 服务类名

(2)android:label : 服务的名字,如果此项不设置,那么默认显示的服务名则为类名

(3)android:icon  :服务的图标

(4)android:permission  : 申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务

(5)android:process  :表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字

(6)android:enabled  : 如果此项设置为 true,那么 Service 将会默认被系统启动,不设置默认此项为 false

(7)android:exported : 表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false

6. 什么时候使用BindService 和 startService ?

   (1启动一个后台服务长期进行某项任务那么使用 startService

   (2)想要与正在运行的 Service 取得联系,使用 bindService

   (3)等等

7.Service实例—— 音乐播放器后台运行

  7.1 需求

     (1)startService() 实现 

     (2)onbindService() 实现

     (3)一些优化:显示当前播放状态,存储播放状态配置(SharedPreference实现)

  7.2 效果图

       startService() 效果图:                                                       onbindService() 效果图:

                                


    7.3 MusicService 实现

package com.example.service;


import com.example.servicedemo.R;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.provider.MediaStore.Audio.Media;
import android.util.Log;

public class MusicService extends Service {

	
	private String TAG="MusicService";
	
	private MediaPlayer player;
	
	@Override
	public void onCreate() {
		// 服务创建:可以做初始化 操作
		
		Log.i(TAG, "onCreate");
		
		//初始化 音乐播放
		player=MediaPlayer.create(getApplicationContext(),R.raw.m123);
		//设置 无限循环
		player.setLooping(true);
		
		
		super.onCreate();
	}
	
	
	@Override
	public void onStart(Intent intent, int startId) {
		// 开启服务
		Log.i(TAG, "onStart");
		
		//播放
		player.start();
		super.onStart(intent, startId);
	}
	
	
	
	
	@Override
	public IBinder onBind(Intent intent) {
		//开启服务
		//其他对象通过bindService 方法通知该Service时该方法被调用
		Log.i(TAG, "onBind");
		
		//返回 对象
		return new mBind();
	}
	
	@Override
	public void onDestroy() {
		//销毁时
		Log.i(TAG, "onDestroy");
		//停止
		player.stop();
		super.onDestroy();
	}
	
	@Override
	public boolean onUnbind(Intent intent) {
		//其它对象通过unbindService方法通知该Service时该方法被调用
		//解绑定操作
		
		Log.i(TAG, "onUnbind");
		//停止
		return super.onUnbind(intent);
	}

	
	//用来返回 musicservice 对象 
	//start() 是没办法 返回 服务对象的
	//binder 可以返回 bind对象
	
	public class mBind extends Binder{
		
		public MusicService getService(){
			return MusicService.this;
		}
	}
	
	//binder 播放音乐
	public void playMusic(){
		player.start();
	}
	
	
	//binder 停止音乐
	public void stopMusic(){
		player.stop();
	}
	
	//当然 还可以添加 其余操作
}

  7.4 AndroidMianfest.xml 配置

  <service 
            android:name="com.example.service.MusicService"
            ></service>

   7.5 业务实现

package com.example.servicedemo;

import android.app.Activity;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Color;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

import com.example.service.MusicService;
import com.example.service.MusicService.mBind;

public class MainActivity extends Activity implements OnClickListener {

	// 音乐播放服务
	private MusicService musicService;

	/**
	 * 通过SerciceConnection 对象 的相关 方法可以得到 更多的Service对象
	 */
	private ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// 当启动源跟 Service 的 连接 以外的丢失的时候,会调用这个方法:比如Service被杀死了

		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// 当启动源跟 Service 成功 连接之后会 自动调用这个方法
			musicService = ((mBind) service).getService();
		}

	};

	private TextView textview1;
	private Button button1, button2, button3, button4, button5, button6;

	private SharedPreferences shared;
	private final String PLAYMUSIC = "音乐状态:音乐播放中。。。。。。。。";
	private final String STOPMUSIC = "音乐状态:播放停止";

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

		// 使用SharedPreferences 保存 音乐的状态
		shared = this.getSharedPreferences("music", 10);

		// 显示 当前 音乐状态
		textview1 = (TextView) findViewById(R.id.textView1);
		button1 = (Button) findViewById(R.id.button1);
		button2 = (Button) findViewById(R.id.button2);
		button3 = (Button) findViewById(R.id.button3);
		button4 = (Button) findViewById(R.id.button4);
		button5 = (Button) findViewById(R.id.button5);
		button6 = (Button) findViewById(R.id.button6);
		button1.setOnClickListener(this);
		button2.setOnClickListener(this);
		button3.setOnClickListener(this);
		button4.setOnClickListener(this);
		button5.setOnClickListener(this);
		button6.setOnClickListener(this);

		// 加载状态 文件 配置
		String mState = shared.getString("mState", null);
		int mColor = shared.getInt("mColor", 0);
		if (mState != null) {
			if (mColor > 0) {
				textview1.setTextColor(Color.RED);
			} else {
				textview1.setTextColor(Color.BLUE);
			}
			textview1.setText(mState);
		}

	}

	/**
	 * 按钮点击事件
	 */
	@Override
	public void onClick(View v) {
		// 根据id 点击
		// 根据Intent 来开启 Service
		Intent intent = new Intent(MainActivity.this, MusicService.class);
		switch (v.getId()) {
		case R.id.button1:
			// onStart 方式 开启 音乐服务:播放音乐
			startService(intent);

			// 音乐状态
			playMusicState();
			break;
		case R.id.button2:
			// onStart 方式 关闭 音乐服务:关闭音乐播放
			stopService(intent);

			// 音乐状态
			stopMusicState();
			break;
		case R.id.button3:
			// onBind 方式 开启 音乐服务:播放音乐
			bindService(intent, conn, Service.BIND_AUTO_CREATE);

			textview1.setText("onBind() 成功");
			break;
		case R.id.button4:
			// onBind 方式 关闭 音乐服务:关闭音乐播放
			 unbindService(conn);
			 textview1.setText("unBind() 成功");
			break;

		case R.id.button5:
			
			//播放音乐
			musicService.playMusic();
			
			// 音乐状态
			playMusicState();
			break;
		case R.id.button6:
			
			//停止
			musicService.stopMusic();

			// 音乐状态
			stopMusicState();
			break;
		}

	}

	/**
	 * 存入本地,状态配置
	 * 
	 * @param content
	 * @param color
	 */
	private void EditMusicState(String content, int color) {
		Editor editor = shared.edit();
		// 状态
		editor.putString("mState", content);
		// 文字颜色 0 蓝色 ; 1 红色;
		editor.putInt("mColor", color);
		// 提交
		editor.commit();
	}

	/**
	 * 音乐播放状态
	 */
	private void playMusicState() {
		textview1.setTextColor(Color.BLUE);
		textview1.setText(PLAYMUSIC);
		EditMusicState(PLAYMUSIC, 0);
	}

	/**
	 * 音乐停止状态
	 */
	private void stopMusicState() {
		textview1.setTextColor(Color.RED);
		textview1.setText(STOPMUSIC);
		EditMusicState(STOPMUSIC, 1);
	}

}


8.demo 下载

  http://download.csdn.net/detail/lablenet/9059911


  不知不觉已经很晚了,也该睡觉了,Service 晚安!睡觉


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值