service相关内容补充!
和Activity一样都是Context的子类,只不过它没有UI界面,是在后台运行的组件。非常适用于去执行那些不需要和用户交互而且还要长期运行的任务。Service同样执行在UI线程中,因此,不要再service中执行耗时操作,除非在Service中创建了子线程来完成耗时操作。
service的分类:(按使用类型)
1)startService启动的服务:主要启动一个服务区执行后台任务,不进行通信,停止服务使用stopService;
2)bindService启动的服务:该方法启动的服务要进行通信,停止服务使用unbindService;
3 ) 同时使用startService,bindService启动的服务:停止服务应该通知使用stopService与unbindService;
service的生命周期:
onCreate:系统在Service第一次创建时执行此方法,来执行只运行一次的初始化工作;
onStartCommand:每次客户端调用startService方法该Service会回调该方法(多次调用),通过·stopSelf或stopService来停止服务;
onBind:当组件调用bindService想要绑定Service时,系统调用此方法。(一次调用),一旦绑定后,下次再调用bindService()不会回调该方法)。return IBinder
onUnbind:当前组件调用unbindService,解除绑定;(一次调用)
onDestroy:在此方法中释放资源;
不同情况下,Service的生命周期:
1)startService/stopService:
生命周期顺序:onCreate->onStartCommand->onDestroy
PS:
①第一次 startService 会触发 onCreate 和 onStartCommand,以后在服务运行过程中,每次 startService 都只会触发 onStartCommand;
②不论 startService 多少次,stopService 一次就会停止服务
2)bindService/unbindService:
生命周期顺序:onCreate->onBind->onUnBind->onDestroy
ps:
1)通过bindService启动的Service的生命周期依附于启动它的Context;
2)第一次 bindService 会触发 onCreate 和 onBind,以后在服务运行过程中,每次 bindService 都不会触发任何回调;
前台服务
通过一定的方式将服务所在的进程级别提升(前台会一直有一个正在运行的图标在系统的状态栏显示,非常类似于通知的效果)
//创建前台服务
public class ForeService extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
beginForeService();
}
private void beginForeService() {
//创建通知
Notification.Builder mBuilder = new Notification.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentText("2017-2-27")
.setContentText("您有一条未读短信...");
//创建点跳转的Intent(这个跳转是跳转到通知详情页)
Intent intent = new Intent(this,NotificationShow.class);
//创建通知详情页的栈
TaskStackBuilder stackBulider = TaskStackBuilder.create(this);
//为其添加父栈 当从通知详情页回退时,将退到添加的父栈中
stackBulider.addParentStack(NotificationShow.class);
PendingIntent pendingIntent = stackBulider.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
//设置跳转Intent到通知中
mBuilder.setContentIntent(pendingIntent);
//获取通知服务
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//构建通知
Notification notification = mBuilder.build();
//显示通知
nm.notify(0,notification);
//启动前台服务
startForeground(0,notification);
}
}
<activity
android:name="com.lvr.service.NotificationShow"
android:parentActivityName=".MainActivity" >
</activity>
以上代码会使NotificationShow这个界面点击回退时,会跳转到MainActivity这个界面,而不是直接回到了home菜单。
PS:通过 stopForeground()方法可以取消通知,即将前台服务降为后台服务。此时服务依然没有停止。通过stopService()可以把前台服务停止。