Service:服务是一个在后台运行的组件,执行长时间且不需要用户交互的运动
服务基本上包含两种状态:
Started | android的程序组件,通过startService()启动了service,则服务是Started状态,一旦启动,服务可以在后台无限制运行,即使启动它的组件已销毁 |
---|---|
Bound | android 的程序组件,通过bindService()绑定了服务,则服务是Bound状态,Bound状态的服务提供了一个客户服务器接口来允许组件与服务进行交互,如发送请求,获取结果,甚至通过IPC来进行跨进程通信。 |
下图是startservice和bindservice运作周期的比较
创建服务,你需要创建一个继承于service基类的java类:并实现以下方法
更多详细请看添加链接描述
如果service与访问者之间需要进行通信和数据交换时,应使用bindservice和unbindserivce来启动关闭service
先来看startService方法:
service实现:这里是相当于用按钮实现音乐的停放:
public class MusicService extends Service {
static Boolean isplay;//记录播放状态
MediaPlayer mediaPlayer; //用来播放的组件
public MusicService() {
}
@Override
public void onCreate() {
mediaPlayer=MediaPlayer.create(this,R.raw.tellme);//连接确定
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if(!mediaPlayer.isPlaying()){
mediaPlayer.start();
isplay=mediaPlayer.isPlaying();
}//当开始调用时启动service
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
mediaPlayer.stop();
isplay=mediaPlayer.isPlaying();
mediaPlayer.release();
//结束时,结束service
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}//这里先不管他
}
主Activity:
public class musicActivity extends AppCompatActivity {
private Button musicbut;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
final Intent intent=new Intent();//这里确保intent时唯一的
intent.setClass(musicActivity.this,MusicService.class);
musicbut=(Button)findViewById(R.id.butmusic);
MusicService.isplay=false;
musicbut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(MusicService.isplay==false) {
startService(intent);}
else{
stopService(intent);
}
}
});
}
// @Override
// protected void onStart() {
// startService(new Intent(musicActivity.this,MusicService.class));
// super.onStart();
// }
}
bindService:这里实现用按钮来实现随机数生成:
bindService具体可以在这里看添加链接描述
public class BInderService extends Service {
public BInderService() {
}
public class MyBinder extends Binder{
public BInderService getservice(){
return BInderService.this;
}
}
@Override
public IBinder onBind(Intent intent) {//这就是用来进行实时通信的
// TODO: Return the communication channel to the service.
return new MyBinder();
}//如果想要自己的Service支持bindService启动方式,就必须在Service的onBind中返回一个IBinder类型的实例。
public List getRandom(){
List list=new ArrayList();
String RandomNumber="";
for (int i=0;i<2;i++){
int num=new Random().nextInt(30)+1;
if(num<10){
RandomNumber="0"+String.valueOf(num);
}
else{
RandomNumber=String.valueOf(num);
}
list.add(RandomNumber);
}
return list;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
Activity部分:
public class doubleballActivity extends AppCompatActivity {
BInderService bInderService;
TextView t1;
TextView t2;
Button br;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_doubleball);
t1=(TextView)findViewById(R.id.textView);
t2=(TextView)findViewById(R.id.textView2);
br=(Button)findViewById(R.id.butgetrandom);
br.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List number=bInderService.getRandom();
t1.setText(number.get(0).toString());
t2.setText(number.get(1).toString());
}
});
}
private ServiceConnection serviceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
bInderService=((BInderService.MyBinder)service).getservice();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onStart() {
Intent intent=new Intent(this,BInderService.class);
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
super.onStart();
}
@Override
protected void onStop() {
unbindService(serviceConnection);
super.onStop();
}
}
这里我对BinderService的理解还不够,还需要深入…………