例如UI向service发通知:(intent)
1.使用startService实现单向指令:UI----->Service:
这种方法适用于UI频繁向service发送命令。startService的调用次数在service里不会累积,可以放心大胆的多用,因此结束service只需一个stopService即可。
UI线程:
startService(new Intent("com.qylk.service.command").putExtra("key",value));//"com.qylk.service.command"需要在menifest.xml的service里公开声明。
Service线程:
在重写onStartCommand方法里,判断command,再做出相应的操作
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Bundle bundle = intent.getExtras();
if (bundle == null) return START_NOT_STICKY; //service非粘滞
COMMAND command = (COMMAND) bundle.getSerializable("com"); //COMMAND 是个自定义的enum
switch (command) {
case COMMAND1:
//TODO
break;
case COMMAND2:
//TODO
break;
default:
break;
}
}
2.使用bindservice将service绑定到UI
这样UI就可以随便调用service里的public函数了,当activity销毁时,自动结束service,当然混合使用startservice和bindservice情况复杂一些,需见另一篇日志:
http://www.qylk.blog.163.com/blog/static/134687356201232375823/代码不写了,google吧。
3。使用广播实现双向交流:UI<----->Service:
UI线程:
Intent intent=new Intent();
intent.putExtra("cn.itcast.audio.action",action);//“cn.itcast.audio.action”为键值名,自己定义即可,action为键值
intent.putExtra("cn.itcast.audio.value",index);
intent.setAction("android.intent.qylk.service");//服务的过滤地址,指明它发往哪儿
sendBroadcast(intent);//开始广播
Service线程:
在oncreate()里先注册接收器:
receiver=new MyReceiver();//新建接收器
IntentFilter filter=new IntentFilter("android.intent.qylk.service");
registerReceiver(receiver,filter);//注册这个接收器
接收器的类:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle=intent.getExtras();
byte action=bundle.getByte("cn.itcast.audio.action");//根据键名,取出键值
int value=bundle.getInt("cn.itcast.audio.value");
//TODO
}}}
别忘了,在service结束时注销这个接收器:
unregisterReceiver(receiver);