我们在Service(Ⅰ)中了解了Service最基本的知识点,今天我们继续学习Service这个组件(神器)。
先来说一下Service的生命周期:跟Activity相比,Service的生命周期就太简单了:onCreate()->onStart()->onDestroy()
----------------------------------------------------------------------------------------------------------------------------------------
【主题】:Activity与Service之间的Communication
【问题】:由上贴我们知道,当我们点击START SERVICE按钮后,服务的onCreate()和onStartCommand()方法会得到执行,此后Service是一直存在于后台运行的,Activity无法控制Service中具体的逻辑运行,那么这样Activity只相当于起到一个通知的作用,除了告诉Service你可以开始工作了。那么这样显然会分离两者之间的关联性,这也不是我们需要的结果!
【后果】:如果出现以上的问题,那么在我们平时的项目开发过程中(拿小编做手机开发项目而言),一直存在的Service很有可能会引起功耗的问题,这将严重影响手机的运行效率!
【要求】:我们能否将Activity与Service建立一种联系,当Activity终结之时,Service也销毁,也就是有没有办法让Activity和Service能够“不求同生,但求共死”?
答案是肯定的!这就涉及到Service的另一个重要知识点:绑定与解绑!
直接代码走起,看过来:
(1)MyService.java
public class MyService extends Service{
private static final String TAG = "MyService";
private DownloadBinder mBinder = new DownloadBinder(); // 定义一个DownloadBinder类
class DownloadBinder extends Binder { // 让DownloadBinder成为Binder的子类
public void startDownload() { // 定义开始下载的方法
Log.d(TAG, "startDownload executed");
}
public int getProgress() { // 定义一个查看下载进度的方法
Log.d(TAG, "getProgress executed");
return 0;
}
}
@Nullable @Override
public IBinder onBind(Intent intent) { // onBind()方法,这个方法将在绑定后调用
return mBinder; // 返回IBinder的实例 --> DownloadBinder类的实例
}
... // 这边就是之前定义好的onStart()、onStartCommand()、onDestroy()三个方法
}
(2)接下来,我们在Layout中添加两个按钮 BIND SERVICE 和 UNBIND SERVICE:
(3)MainActivity.java
public class MainActivity extends Activity implements View.OnClickListener{
private ServiceConnection connection = new ServiceConnection() { // 创建一个ServiceConnection的匿名内部类
@Override
public void onServiceConnected(ComponentName name, IBinder service) { // 重写onServiceConnected()方法
MyService.DownloadBinder downloadBinder = (MyService.DownloadBinder) service; // 向下转型取得downloadBinder实例
downloadBinder.startDownload(); // 在Activity中调用Service的方法
downloadBinder.getProgress(); // 在Activity中调用Service的方法
}
@Override
public void onServiceDisconnected(ComponentName name) { // 重写onServiceDisconnected()方法
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startService = (Button) super.findViewById(R.id.start_service);
Button stopService = (Button) super.findViewById(R.id.stop_service);
Button bindService = (Button) super.findViewById(R.id.bind_service); Button unbindService = (Button) super.findViewById(R.id.unbind_service); // 不解释!!!
startService.setOnClickListener(this);
stopService.setOnClickListener(this);
bindService.setOnClickListener(this); unbindService.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.start_service:
Intent startIntent = new Intent(this, MyService.class); // START 服务 --> onCreate() --> onStartCommand()
startService(startIntent);
break;
case R.id.stop_service:
Intent stopIntent = n