android service的学习笔记

android service是后台运行的服务,没有界面。比如我们后台播放音乐就可以启动一个服务,service和其他组件一样是运行在主线程的,所以不能进行耗时的操作,不过我们可以开启一个线程来支持耗时操作

服务一般分为两种:

本地服务:Localhost Serviece是应用程序内部的服务,程序通过context.startService()来启动服务,通过调用Context.stopService()来关闭服务,内部也可以通过调用Service.stopSelf或者 Service.stopSelfResult()来自己停止,无论调用的多少次的,startService()只需要调用一次stopService();

2:远程服务, 远程服务是android程序内部的,可以吧接口暴露,让其他程序调用。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。



context.startService() ->onCreate()- >onStart()->Service running--调用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() ->onDestroy()从上诉可以知道分别对应本地的,,以及远程的,也对应不同的方式启动这个服务。

下面看看第一个案例:

最基本的service案例:

启动服务来后台播放music

public class PlayMusicService extends Activity implements OnClickListener{

	private Button playBtn;
	private Button stopBtn;
	private Button pauseBtn;
	private Button closeBtn;
	private Button exitBtn;
	private Intent intent;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.music_service);
		playBtn=(Button) findViewById(R.id.play);
		stopBtn=(Button) findViewById(R.id.stop);
		pauseBtn=(Button) findViewById(R.id.pause);
		closeBtn=(Button) findViewById(R.id.close);
		exitBtn=(Button) findViewById(R.id.exit);
		playBtn.setOnClickListener(this);
		stopBtn.setOnClickListener(this);
		pauseBtn.setOnClickListener(this);
		closeBtn.setOnClickListener(this);
		exitBtn.setOnClickListener(this);
		
	}
	
	@Override
	public void onClick(View v) {
		int op=-1;
		intent=new Intent("com.musicService");
	switch (v.getId()) {
	case R.id.play:
		op=1;		
		break;
	case R.id.stop:								// stop music
		op=2;
		break;
	case R.id.pause:							// pause music
		op=3;
		break;
	case R.id.close:							// close activity
		this.finish();
		break;
	case R.id.exit:	
		op=4;
		stopService(intent);
		this.finish();
		break;

	}
	Bundle bundle=new Bundle();
	bundle.putInt("op", op);
	intent.putExtras(bundle);
	startService(intent);
		
	}
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		if(intent!=null){
			stopService(intent);
		}
	}
}

下面启动的服务:

public class MusicService extends Service{
	private static final String TAG = "MyService";
	private MediaPlayer mediaPlayer;

	@Override
	public IBinder onBind(Intent intent) {
		
		return null;
	}
	
	@Override
	public void onCreate() {
		Log.v(TAG, "onCreate");
		super.onCreate();
		if(mediaPlayer==null){
			mediaPlayer=MediaPlayer.create(this, R.raw.tmp);
			mediaPlayer.setLooping(false);
		}
		
   }
	@Override
	public void onDestroy() {
		Log.v(TAG, "onDestroy");
		Toast.makeText(this, "stop media player", Toast.LENGTH_SHORT);
		if (mediaPlayer != null) {
			mediaPlayer.stop();
			mediaPlayer.release();
		}
	}

	@Override
	public void onStart(Intent intent, int startId) {
		Log.v(TAG, "onStart");
		if(intent!=null){
			Bundle bundle=intent.getExtras();
			if(bundle!=null){
				int op=bundle.getInt("op");
				switch (op) {
				case 1:
					play();
					break;
				case 2:
					stop();
					break;
				case 3:
					pause();
					break;

				
				}
			}
			
		}
	}

	public void pause() {
		if (mediaPlayer != null && mediaPlayer.isPlaying()) {
			mediaPlayer.pause();
		}
	}

	private void stop() {
		// TODO Auto-generated method stub
		if(mediaPlayer!=null){
			mediaPlayer.stop();
			try {
				mediaPlayer.prepare();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

	private void play() {
		// TODO Auto-generated method stub
		if(!mediaPlayer.isPlaying()){
			mediaPlayer.start();
		}
	}
     
	
	

}

必须在androidMainfast.xml进行注册

<activity
            android:name="com.example.myservicetest.service.PlayMusicService"
            android:label="@string/app_name" />
 <service
            android:name=".service.MusicService"
            android:enabled="true" >
            <intent-filter>
                <action android:name="com.musicService" />
            </intent-filter>
        </service>

上面是基本的,下面让activity将信息发送给一个广播,让接收到广播来启动一个service,首先注册广播

 <activity
            android:name="com.example.myservicetest.receiver.PlayMusicRecevicer"
            android:label="@string/app_name" />
<receiver android:name=".receiver.MusicReceiver" >
            <intent-filter>
                <action android:name="com.musicReceiver" />
            </intent-filter>
        </receiver>

发送广播的代码

public class PlayMusicRecevicer extends Activity implements OnClickListener {
	private Button playBtn;
	private Button stopBtn;
	private Button pauseBtn;
	private Button exitBtn;
	private Button closeBtn;
	private Intent intent;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.music_receiver);

		playBtn = (Button) findViewById(R.id.play);
		stopBtn = (Button) findViewById(R.id.stop);
		pauseBtn = (Button) findViewById(R.id.pause);
		exitBtn = (Button) findViewById(R.id.exit);
		closeBtn = (Button) findViewById(R.id.close);
		playBtn.setOnClickListener(this);
		stopBtn.setOnClickListener(this);
		pauseBtn.setOnClickListener(this);
		exitBtn.setOnClickListener(this);
		closeBtn.setOnClickListener(this);

	}

	@Override
	public void onClick(View v) {
		int op = -1;
		intent = new Intent("com.musicReceiver");
		switch (v.getId()) {
		case R.id.play:
			op = 1;
			break;

		case R.id.stop: // stop music
			op = 2;
			break;
		case R.id.pause:
			op = 3;
			break;
		case R.id.close:
			this.finish();
			break;
		case R.id.exit:								// process by MusicReceiver
			op = 4;
			this.finish();
			break;

		}
		Bundle bundle = new Bundle();
		bundle.putInt("op", op);
		intent.putExtras(bundle);
		sendBroadcast(intent);

	}

	@Override
	public void onDestroy() {
		super.onDestroy();

		if (intent != null) {
			stopService(intent);
		}
	}

}

接收到广播,启动service

public class MusicReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Bundle bundle = intent.getExtras();
		Intent it = new Intent(context,MusicService.class);
		it.putExtras(bundle);
		
		if(bundle!=null){
			int op = bundle.getInt("op");
			if (op == 4) {
				context.stopService(it);

			}else{
				context.startService(it);
			}
		}
		
	}

}


第三种是bindService(intent, sc, BIND_AUTO_CREATE);来启动service

public class PlayBindMusic extends Activity implements OnClickListener{
	private Button playBtn;
	private Button stopBtn;
	private Button pauseBtn;
	private Button exitBtn;
	private BindMusicService musicService;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.bind_music_service);
		playBtn = (Button) findViewById(R.id.play);
		stopBtn = (Button) findViewById(R.id.stop);
		pauseBtn = (Button) findViewById(R.id.pause);
		exitBtn = (Button) findViewById(R.id.exit);

		playBtn.setOnClickListener(this);
		stopBtn.setOnClickListener(this);
		pauseBtn.setOnClickListener(this);
		exitBtn.setOnClickListener(this);
		connect();
	}
	private void connect() {
		Intent intent=new Intent("com.bindService");
		bindService(intent, sc, BIND_AUTO_CREATE);
	}
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.play:
			musicService.play();
			break;
		case R.id.stop:
			if (musicService != null) {
				musicService.stop();
			}
			break;
		case R.id.pause:
			if (musicService != null) {
				musicService.pause();
			}
			break;
		case R.id.exit:
			this.finish();
			break;
		}
	}
	ServiceConnection sc=new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			
			musicService=null;
		}
		
		@Override
		public void onServiceConnected(ComponentName arg0, IBinder bind) {
		          	
			musicService= ((BindMusicService.MyBind) bind).getService();
			musicService.play();	
		}
	};
	
	@Override
	public void onDestroy(){
		super.onDestroy();
		
		if(sc != null){
			unbindService(sc);
		}
	}


}

public class BindMusicService extends Service{
	
	private MediaPlayer mediaPlayer;
    private final IBinder binder=new MyBind();
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return binder;
	}
	class MyBind extends Binder{
		
		BindMusicService getService(){
			return BindMusicService.this;
		}
	}
	@Override
	public void onCreate() {
		super.onCreate();
		
		Toast.makeText(this, "show media player", Toast.LENGTH_SHORT).show();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		
		Toast.makeText(this, "stop media player", Toast.LENGTH_SHORT).show();
		if(mediaPlayer != null){
			mediaPlayer.stop();
			mediaPlayer.release();
		}
	}

	
	public void play() {
		if (mediaPlayer == null) {
			mediaPlayer = MediaPlayer.create(this, R.raw.tmp);
			mediaPlayer.setLooping(false);
		}
		if (!mediaPlayer.isPlaying()) {
			mediaPlayer.start();
		}
	}

	public void pause() {
		if (mediaPlayer != null && mediaPlayer.isPlaying()) {
			mediaPlayer.pause();
		}
	}

	public void stop() {
		if (mediaPlayer != null) {
			mediaPlayer.stop();
			try {
				mediaPlayer.prepare();		// 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	}

}

最后一种是远程方式绑定service

先定义一个aidl文件

package com.example.myservicetest.remote;

interface IMusicControlService{
        void play(); 
        void stop(); 
        void pause();
}

public class PlayRemoteMusic extends Activity implements OnClickListener {
	private Button playBtn;
	private Button stopBtn;
	private Button pauseBtn;
	private Button exitBtn;

	private IMusicControlService musicService;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.remote_music_service);

		playBtn = (Button) findViewById(R.id.play);
		stopBtn = (Button) findViewById(R.id.stop);
		pauseBtn = (Button) findViewById(R.id.pause);
		exitBtn = (Button) findViewById(R.id.exit);

		playBtn.setOnClickListener(this);
		stopBtn.setOnClickListener(this);
		pauseBtn.setOnClickListener(this);
		exitBtn.setOnClickListener(this);
		connection();

	}

	private void connection() {
		Intent intent = new Intent("com.remoteMusicReceiver");
		bindService(intent, sc, Context.BIND_AUTO_CREATE);

	}

	@Override
	public void onClick(View v) {
		try {
			switch (v.getId()) {
			case R.id.play:
				musicService.play();
				break;
			case R.id.stop:
				if (musicService != null) {
					musicService.stop();
				}
				break;
			case R.id.pause:
				if (musicService != null) {
					musicService.pause();
				}
				break;
			case R.id.exit:
				this.finish();
				break;
			}
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	}

	ServiceConnection sc = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {

		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			musicService = IMusicControlService.Stub.asInterface(service);

		}
	};

	@Override
	public void onDestroy() {
		super.onDestroy();

		if (sc != null) {
			unbindService(sc); // unBindService
		}
	}
}

public class RemoteMusicService extends Service {

	private MediaPlayer mediaPlayer;

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

	private final IMusicControlService.Stub binder = new IMusicControlService.Stub() {

		@Override
		public void play() throws RemoteException {
			if (mediaPlayer == null) {
				mediaPlayer = MediaPlayer.create(RemoteMusicService.this,
						R.raw.tmp);
				mediaPlayer.setLooping(false);
			}
			if (!mediaPlayer.isPlaying()) {
				mediaPlayer.start();
			}
		}

		@Override
		public void pause() throws RemoteException {
			if (mediaPlayer != null && mediaPlayer.isPlaying()) {
				mediaPlayer.pause();
			}
		}

		@Override
		public void stop() throws RemoteException {
			if (mediaPlayer != null) {
				mediaPlayer.stop();
				try {
					mediaPlayer.prepare(); // 在调用stop后如果需要再次通过start进行播放,需要之前调用prepare函数
				} catch (IOException ex) {
					ex.printStackTrace();
				}
			}
		}
	};

	@Override
	public void onDestroy() {
		super.onDestroy();

		if (mediaPlayer != null) {
			mediaPlayer.stop();
			mediaPlayer.release();
		}
	}
}

只是通过远程的方式来绑定service

源码下载 http://download.csdn.net/detail/a79412906/5891027


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值