Service是一个和Activity相似的组件,没有界面。因此需要在Activity方法进行开启,其中开启方式有两种,两种全是调用Context中的方法1,startService(new Intent(MusicActivity.this, MusicService.class));
2,bindService(new Intent(MusicActivity.this, MusicService.class),mServiceConnect,BIND_AUTO_CREATE);
第一种只进行开启,特点是当Activity退出时,Service并没有结束。
第二种方式,与Activity进行绑定访问者一旦退出Service也结束。
还有,使用第二种方式,可以利用ServiceConnection得到Bind
其中Bind为沟通Service与Activity的桥梁,通过Bind得到Service,从而获取Service的数据,进行Activity界面展示。相当于Activity开启Service然后通过Bind向Activity回调数据吧.
实例代码:
package com.henau.henau.examsystem.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.henau.henau.examsystem.R;
import com.henau.henau.examsystem.Service.MusicService;
public class MusicActivity extends AppCompatActivity implements View.OnClickListener {
Button music_stop;
Button music_start;
//通过此对象获取Service
private ServiceConnection mServiceConnect=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MusicService.LocalBind localBind= (MusicService.LocalBind) service;
MusicService musicService = localBind.getService();
musicService.getProgess();
Log.i("tag",String.valueOf(musicService.getProgess()));
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music);
music_start = findViewById(R.id.music_start);
music_stop = findViewById(R.id.music_stop);
music_stop.setOnClickListener(this);
music_start.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.music_start:
bindService(new Intent(MusicActivity.this, MusicService.class),mServiceConnect,BIND_AUTO_CREATE);
startService(new Intent(MusicActivity.this, MusicService.class));
break;
case R.id.music_stop:
unbindService(mServiceConnect);
stopService(new Intent(MusicActivity.this, MusicService.class));
break;
}
}
}
Service代码:
package com.henau.henau.examsystem.Service;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import com.henau.henau.examsystem.R;
public class MusicService extends Service {
MediaPlayer mediaPlayer;
private IBinder iBind=new LocalBind();
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return iBind;
}
@Override
public void onCreate() {
super.onCreate();
mediaPlayer = MediaPlayer.create(this, R.raw.libai);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mediaPlayer.start();
return START_STICKY;
}
@Override
public void onDestroy() {
mediaPlayer.stop();
super.onDestroy();
}
//Service中方法,得到Service其他数据还不容易.
public int getProgess(){
return 18;
}
//通过此类传递Service
public class LocalBind extends Binder {
public MusicService getService(){
return MusicService.this;
}
}
}