android动态service,安卓四大组件之二#1-Service的创建,生命周期以及动态调用Service里的方法...

上次我为大家介绍了intent的隐式意图,也基本介绍完了Activity的使用方法。现在我为大家介绍安卓第二大组件-Service

1:Service的创建

Service就是服务的意思,它的特点就是当你开启服务以后即使你关闭app它也在运行,直到调用停止服务的方法。典型的用法就是音乐播放器。

Service的创建同Activity一样最好不要自己继承写类。创建方法为自己项目右键->new->other->Android Object->然后一直下一步就可以了(中间有取类名可以自行更改)

2:Service的生命周期

1ae954e4738980d3811b0a8d3abb57e2.png

Service的生命周期有2种一种是开启服务和绑定服务。大家看上图就可以一目了然。

3:启动和绑定服务以及关闭服务

首先是第一种启动服务,使用一个按钮并在其监听事件里启动服务,代码如下//第一个按键启动服务

findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

service = new Intent();

//设置跳转到的服务

service.setClass(MainActivity.this, MyService.class);

//启动服务

startService(service );

}

});

//第二个按键关闭服务

findViewById(R.id.button2).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

stopService(service);

}

});

当启动服务以后如果在启动只会调用onStartCommand方法,不会再新建一个服务对象(构造方法只执行一次)。如下图所示

a658d77ad470e560f2ddcec9478e8614.png正常的启动结束服务打的日志图如下(被水印遮住了蛋疼。。我源代码会上传大家可以自己验证)

64feb7de2918cf441bd9122b8cfa98f2.png

然后是第二种绑定服务,方法跟上面类似,代码如下//第三个按键绑定服务

findViewById(R.id.button3).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

service = new Intent();

//设置跳转到的服务

service.setClass(MainActivity.this, MyService.class);

//启动服务

bindService(service, null, Context.BIND_AUTO_CREATE);

}

});

//第四个按键解绑服务

findViewById(R.id.button4).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

unbindService(null);

}

});

绑定服务方法的运行顺序如下(如生命周期所示)

f5c66fc2f48a1cdafdbd35350cc9af37.png

4:动态的访问Service的方法

刚才我启动绑定服务方法时候中间那个参数为null,现在我们来为它传入一个参数(由于要传入的对象是一个接口所以必须重写它的方法)

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

}

};

findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Intent service = new Intent(MainActivity.this, MyService.class);

bindService(service , conn , Context.BIND_AUTO_CREATE);

}

});

回到Service的代码页面,在Service中写一个play方法并打日志以便我们观看结果,然后写一个内部类继承binder并写一个方法来调用Service的play()方法,最后在onbind方法返回一个binder对象

@Override

public IBinder onBind(Intent intent) {

return new MyBinder();

}

class MyBinder extends Binder

{

public void start()

{

play();

}

}

public void play()

{

Log.e("MyService", "play()");

}

在回到Activity代码,在conn接口中的onServiceConnected()方法中获取Mybinder对象,在调用对象的start()方法,代码如下private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceDisconnected(ComponentName name) {

}

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

//获取Service中的Mybinder的对象

MyBinder binder = (MyBinder) service;

//调用Mybinder中的方法,里面就包含了Service中的方法

binder.start();

};

大功告成。日志打印结果如下

0e857792fb55846c8bac70fda72d8085.png

这样就可以动态调用Service的方法了,大家可以自己写代码试试或者去我的下载下载我的源代码,源代码名字为博客名。这次介绍的是访问app本身的服务,下次我将为大家介绍使用AIDL技术来访问另一个app中的服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值