ServiceDisconnected(ComponentName name) {
}
?
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.startDownload();
}
};
?
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService = (Button) findViewById(R.id.bind_service);
unbindService = (Button) findViewById(R.id.unbind_service);
bindService.setOnClickListener(this);
unbindService.setOnClickListener(this);
}
?
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bind_service:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
break;
case R.id.unbind_service:
unbindService(connection);
break;
default:
break;
}
}
?
}
可以看到,这里我们首先创建了一个ServiceConnection 的匿名类,在里面重写了onServiceConnected() 方法和onServiceDisconnected() 方法,这两个方法分别会在Activity 与Service 建立关联和解除关联的时候调用。在onServiceConnected() 方法中,我们又通过 向下转型 得到了MyBinder 的实例,有了这个实例,Activity 和Service 之间的关系就变得非常紧密了。现在我们可以在Activity 中根据具体的场景来调用MyBinder 中的任何public 方法,即实现了Activity 指挥Service 干什么Service 就去干什么的功能。
当然,现在Activity 和Service 其实还没关联起来了呢,这个功能是在Bind Service按钮的点击事件里完成的。可以看到,这里我们仍然是构建出了一个Intent 对象,然后调用bindService() 方法将Activity 和Service 进行绑定。bindService() 方法接收三个参数,第一个参数就是刚刚构建出的Intent 对象,第二个参数是前面创建出的ServiceConnection 的实例,第三个参数是一个标志位,这里传入BIND_AUTO_CREATE 表示在Activity 和Service 建立关联后自动创建Service ,这会使得MyService 中的onCreate() 方法得到执行,但onStartCommand() 方法不会执行(只有当我们通过 startService() 方法请求启动服务时,调用此方法)。
解除Activity和Service之间的关联,调用
unbindService(connection);
关于销毁Service说明
-
在MyService 的内部通过stopSelf() 方法来销毁的;
-
一个Service必须要在既没有和任何Activity关联又处理停止状态的时候才会被销毁;
-
在Service的onDestroy()方法里去清理掉那些不再使用的资源,防止在Service被销毁后还会有一些不再使用的对象仍占用着内存;
7.IntentService
IntentService 是Service的子类,在介绍IntentService之前,先来了解使用Service时需要注意的两个问题
-
Service 不会专门启动一个线程执行耗时操作,所有的操作都是在主线程中进行的,以至于容易出现ANR,所以需要手动开启一个子线程;
-
Service 不会自动停止,需要调用stopSelf() 方法 或者 是stopService() 方法停止;
使用IntentService 不会出现这两个问题,因为IntentService 在开启Service 时,会自动开启一个新的线程来执行它,另外,当Service 运行结束后,会自动停止。
8.如何保证服务不会被杀死
第一种方式,返回 START_STICKY 或 START_REDELIVER_INTENT
当Service 因内存不足而被系统kill后,一段时间后内存再次空闲时,系统将会尝试重新创建此Service ,一旦创建成功后将回调onStartCommand 方法,但其中的Intent 将是null ,除非有挂起的Intent ,如pendingintent ,这个状态下比较适用于不执行命令、但无限期运行并等待作业的媒体播放器或类似的服务。
/**
* 返回 START_STICKY 或 START_REDELIVER_INTENT
* @param intent
* @param flags
* @param startId
* @return
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//return super.onStartCommand(intent, flags, startId);
return START_STICKY;
}
第二种方式,提高service的优先权
<service
android:name="com.demo.UploadService"
android:enabled="true" >
<intent-filter android:priority="1000" >
<action android:name="com.demo.MyService" />
</intent-filter>
</service>
结语
Service作为Android的四大组件之一,并且项目开发过程中一些场景下经常被使用到,小伙伴们赶紧上手实操,把它灵活的运用到项目中,结合上两期的Activity和BroadcastReceiver实现有趣的交互吧。
PS:如果还有未看懂的小伙伴,欢迎关注我们的WXGZH:下码看花,里面有各种大神回答小伙伴们遇到的问题哦~
|