代码是最为耐心、最能忍耐和最令人愉快的伙伴,在任何艰难困苦的时刻,它都不会抛弃你。
一、概述
这段时间欠的东西太多了,四大组件之前都没有整理过,这次有时间统一整理一下,知识都整理的差不多了,知识差把它们分享出来,那今天就来分享一篇关于 Service 的文章,Service 的意思为服务,那这个服务也是由 ContextWrapper 派生出来的,那么他也会有 ContextWrapper 特性,也就是说,他和 Activity 有些地方是相似的,在我的理解,Service 和 Activity 的不同就是一个与用户交互,一个不与用户交互,也就是说 Service 是一个没有界面的 Activity 。那么我们也可以在 Service 也可以去调用 Context 的一些方法。
二、启动 Service
Service 的启动分为两种,一种是 startService 一种是 bindService,那接下来我们一个一个的说。
1、startService
Intent intent = new Intent(this,BackService.class);
startService(intent);
stopService(intent);
2、bindService
@Override
public void onClick(View view) {
final Intent intent1 = new Intent(this,BindBackService.class);
switch (view.getId()) {
case R.id.btn_bind_service:
//TODO implement
bindService(intent1,connection,BIND_AUTO_CREATE);
break;
case R.id.btn_unbind_service:
//TODO implement
unbindService(connection);
break;
}
}
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
BindBackService.MyBind myBind = (BindBackService.MyBind)service;
myBind.showTest();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
这个是启动 Service 的代码片段,下面看一下 Service 的代码片段:
public class BindBackService extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e("service","onBind");
return new MyBind();
}
public class MyBind extends Binder{
public void showTest(){
Log.e("service","showTest");
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.e("service","onDestory");
super.onDestroy();
}
@Override
public void onCreate() {
Log.e("service","onCreate");
super.onCreate();
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
}
}
三、Service 的生命周期
通过这个图片我们可以很直观的看到 Service 的声明周期,我们可以看到 Service 的声明周期根据启动情况去执行的,所 以我们如果要是打 log 的话需要根据不同情况去打。
四、使用中遇到的问题
我们知道 Service 是运行在 UI 线程中的,如果在 UI 线程中运行一个耗时的操作,会出现 ANR ,在 Service 中也不例 外,那么我们如何在 Service 中运行耗时操作,而不 ANR 呢,方法有几种,我先说一种最简单的,下面看代码:
<service android:name=".service.BindBackService"
android:process=":remote"/>
五、IntentService
public class TestIntentService extends IntentService{
/**
* Creates an IntentService. Invoked by your subclass's constructor.
*
* @param name Used to name the worker thread, important only for debugging.
*/
public TestIntentService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
try {
wait(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
七、前台 Service
/**
* Created by andya on 2017/6/13.
*/
public class ForegroundService extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
showNotifition();
}
public void showNotifition(){
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.actual_time)
.setContentTitle("启动前台服务了")
.setContentText("好开心哟");
Intent intent = new Intent(this, MainActivity.class);
TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this);
taskStackBuilder.addParentStack(MainActivity.class);
taskStackBuilder.addNextIntent(intent);
PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = builder.build();
nm.notify(0,notification);
startForeground(0,notification);
}
}
六、系统的一些 Service
这里面只是列举了几个常用的,其实还有很多,读者可以自行百度。