Service是Android的一个组件,Android组件之Service浅谈

Service是Android中的四大组件之一,和windows中的服务是类似,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序Service,手机中有的程序的更新,服务的推送。Android系统中,Service与Activity类似,都需要AndroidManifest.xml文件中配置,而且生命周期有点类似。Service不像Activity在前台运行,而是默默的在后台默默的工作,简单粗暴点理解就是男主内女主外,分工明确。

Service生命周期

service与activity一样都存在与当前进程的主线程中,所以,一些阻塞UI的操作,比如耗时操作不能放在service里进行,比如另外开启一个线程来处理类似下载这种耗时操作。如果在service里进行一些耗CPU和耗时操作,应用会弹出是强制关闭还是等待的对话框。因此service和activity是平级的,四大组件之一的地位也不是浪得虚名。先看张经典老图:

PjdcG2nKI9W7TUBn.png

这两个都是Service的生命周期,从上到到下也没有什么难懂的英文,应该比较好理解,如果有困惑,可以先参考下面的程序就懂了.

两种启动Service方式

自定义一个BookService继承自Service:

public class BookService extends Service {

private String tag="BookService";

@Override

public void onCreate() {

// TODO Auto-generated method stub

super.onCreate();

Log.i(tag, "开始onCreate启动了");

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

// TODO Auto-generated method stub

Log.i(tag, "开始执行onStartCommand启动了");

Toast.makeText(this, "BookService开始了",Toast.LENGTH_SHORT).show();

return super.onStartCommand(intent, flags, startId);

}

@Override

public void onDestroy() {

// TODO Auto-generated method stub

Log.i(tag, "销毁onDestroy启动了");

super.onDestroy();

}

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generated method stub

Log.i(tag, "绑定onBind启动了");

return null;

}

@Override

public boolean onUnbind(Intent intent) {

// TODO Auto-generated method stub

Log.i(tag, "解绑onUnbind启动了");

return super.onUnbind(intent);

}

}

看下效果图:

ufPqMrlbIgigyV3X.png

布局很简单,就不贴代码了,但是需要在AndroidManifest.xml注册一下代码:

点击第一个按钮执行的代码,Intent之前有写过,之前是startActivity,这里用的startService:

Intent service=new Intent(this,BookService.class);

startService(service);

第二个按钮执行的事件:

Intent stopservice=new Intent(this,BookService.class);

stopService(stopservice);

通过Log就很容易明白第一张图了,第一种调用Service的方式也就简单完成了;

Rc7BgFpkigPxjR0X.png

第二种调用首先定义个继承自ServiceConnection的BookConnection:

class BookServiceConnection implements ServiceConnection{

public BookServiceConnection() {

super();

// TODO Auto-generated constructor stub

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

// TODO Auto-generated method stub

}

@Override

public void onServiceDisconnected(ComponentName name) {

// TODO Auto-generated method stub

}

}

第三个按钮触发的代码:

Intent binderStartIntent=new Intent(this,BookService.class);

connection=new BookServiceConnection();

bindService(binderStartIntent, connection,Context.BIND_AUTO_CREATE);

第四种按钮触发的事件:

unbindService(connection);

看下Log对比之后也就明白了第二张图:

XrXmHPf5AbVdskh2.png

这两种都很简单,不过有的时候Activity和Service之间是要通信的:

这个时候你可以在BookService中定义一个内部类:

class BookBinder extends Binder {

public BookService getCurrentService() {

return BookService.this;

}

}

这个时候在Activity中的BookServiceConnection中onServicedConnected中改动一下:

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

// TODO Auto-generated method stub

//获取实例

BookService bookService=((BookService.BookBinder)service).getCurrentService();

//just do wo you want to do

}

Service一直在后台工作,可以通过Notification将消息传递到前台,修改一下BookService的onCreate()方法:

@Override

public void onCreate() {

// TODO Auto-generated method stub

super.onCreate();

NotificationManager mNotificationManager = (NotificationManager)

getSystemService(NOTIFICATION_SERVICE);

NotificationCompat.Builder mBuilder =

new NotificationCompat.Builder(this)

.setSmallIcon(R.drawable.ic_launcher)

.setContentTitle("QQ空间")

.setContentText("北京真坑,开个会房子都被拆");

mNotificationManager.notify(0, mBuilder.build());

Log.i(tag, "开始onCreate启动了");

}

通知栏如下:

4A8DnppZ1D8HcjFl.png

各位晚安,好梦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值