安卓学习之Service
2018-07-07 本文已影响15人
于无声处写写写
定义一个服务
新建一个类,继承自Service。重写父类的方法。
- public IBinder onBind(Intent) 这是Service中唯一的一个抽象方法,必须在子类中实现。
- public void onCreate() 服务创建的时候调用
- public int onStartCommand(Intent intent,int flags,int startId) 服务启动的时候调用,如果希望服务一旦启动就立即执行某个动作,则逻辑写在这里面
- public void onDestroy() 服务销毁的时候调用,回收资源
服务需要在Manifest文件中进行注册
<application <Service android:name=".MyService" /Service>/application>
经过以上步骤,一个服务就定义完成了
启动和停止服务
服务在活动里面启动和停止
- 启动服务
Intent intent=new Intent(this,MyService.class);
startService(intent); - 停止服务
Intent intent=new Intent(this,MyService.class);
stopService(intent);
onCreate()方法是只有在服务第一次启动的时候才调用。
onStartCommand()方法是每次启动服务都会调用。
活动和服务通信
假设此处要实现下载功能和查看下载进度功能
要通过服务中的onBind()方法实现两者的通信
-
首先要创建一个Binder对象
- 在MyService类中实例化DownloadBinder对象
- 在MyService类中的onBind()方法中返回这个Binder对象
-
在MainActivity中实例化一个ServiceConnection匿名类
image.png
-
在onServiceConnected()方法中,对service进行强转
image.png
- 在MainActivity中需要将活动和服务进行绑定
Intent bindIntent=new Intent(this,MyService.class);
bindService(bindIntent,connection,BIND_AUTO_CREATE); - bindService这个方法中,三个参数分别是: 自定义服务的intent,ServiceConnection的实例,最后一个是标志位,BIND_AUTO_CREATE表示在活动和服务绑定后自动创建服务。这个标志位会导致service中的onCreate()方法得到执行,但是onStartCommand()方法却不会执行。
- 如果想解绑活动和服务,调用unbindService()方法就可以了
服务的生命周期
- 每个服务都只会存在一个实例,不管调用了多少次startService()方法,只需调用一次stopService()或者stopSelf()方法