实验要求:一个Activity上有两个按钮分别是启动服务和绑定服务代表两种不同的方法开启服务。实现这两种功能并打日志观察它们的生命周期。同时要求在采用绑定服务的方式中需要Activity与绑定的Service进行通信Service中有个方法serviceFunc它的功能是Toast弹出内容:Service正在运行~。在Activity中再添加一个按钮点击该按钮调用Service中的serviceF
实现步骤:
- 创建一个Service,命名为MyService,重写onCreate()和onDestroy()方法,在onCreate()中打印出"Service onCreate"的日志,在onDestroy()中打印出"Service onDestroy"的日志。同时实现一个serviceFunc()方法,用于接收Activity传递过来的消息并弹出Toast提示。
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
Log.d("MyService", "Service onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("MyService", "Service onDestroy");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void serviceFunc() {
Toast.makeText(this, "Service正在运行~", Toast.LENGTH_SHORT).show();
}
}
- 在Activity中添加布局文件,包含三个按钮,分别为"启动服务"、"绑定服务"和"调用服务方法"。同时实现点击事件的监听器。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btnStartService;
private Button btnBindService;
private Button btnCallService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStartService = findViewById(R.id.btn_start_service);
btnBindService = findViewById(R.id.btn_bind_service);
btnCallService = findViewById(R.id.btn_call_service);
btnStartService.setOnClickListener(this);
btnBindService.setOnClickListener(this);
btnCallService.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_start_service:
startService();
break;
case R.id.btn_bind_service:
bindService();
break;
case R.id.btn_call_service:
callServiceFunc();
break;
}
}
private void startService() {
Intent intent = new Intent(this, MyService.class);
startService(intent);
Log.d("MainActivity", "启动服务");
}
private void bindService() {
Intent intent = new Intent(this, MyService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
Log.d("MainActivity", "绑定服务");
}
private void callServiceFunc() {
if (myService != null) {
myService.serviceFunc();
Log.d("MainActivity", "调用服务方法");
}
}
private MyService myService;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService = ((MyService.LocalBinder) service).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
myService = null;
}
};
}
-
在Activity中实现启动服务的方法startService(),并在其中创建一个Intent对象,将MyService.class作为参数传递给Intent。然后调用startService()方法启动服务,并打印出"启动服务"的日志。
-
在Activity中实现绑定服务的方法bindService(),同样创建一个Intent对象,将MyService.class作为参数传递给Intent。然后调用bindService()方法绑定服务,并添加一个ServiceConnection对象,用于监听服务的连接和断开,其中onServiceConnected()方法中取得MyService实例,onServiceDisconnected()方法中将MyService实例置为null。最后打印出"绑定服务"的日志。
-
在Activity中实现调用服务方法的方法callServiceFunc(),首先判断myService是否为null,如果不为null,调用myService实例的serviceFunc()方法,然后打印出"调用服务方法"的日志。
-
将MyService绑定到Activity中,在MyService中重写onBind()方法,返回一个LocalBinder实例。在LocalBinder中实现getService()方法,返回MyService实例。
public class MyService extends Service {
private LocalBinder localBinder = new LocalBinder();
@Override
public void onCreate() {
super.onCreate();
Log.d("MyService", "Service onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d("MyService", "Service onDestroy");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return localBinder;
}
public void serviceFunc() {
Toast.makeText(this, "Service正在运行~", Toast.LENGTH_SHORT).show();
}
public class LocalBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
}
- 运行程序,并点击不同的按钮测试服务的启动、绑定和调用服务方法的功能。在LogCat中观察服务的生命周期,以及调用服务方法的日志。在服务启动和绑定时,可以看到"MyService Service onCreate"的日志;在服务销毁时,可以看到"MyService Service onDestroy"的日志。在调用服务方法时,可以看到"Service正在运行~"的Toast提示。
原文地址: http://www.cveoy.top/t/topic/bfwV 著作权归作者所有。请勿转载和采集!