Android应用:Service开发实例(三)之Service的具体应用方法
来源:互联网 发布:c语言变量名 编辑:程序博客网 时间:2024/05/03 22:09
Service开发实例(二)中我们了解了service的生命周期,并通过实例看到了service运行的情况。但这个实例中的service什么都没干。
下面我们对其进行修改,让它完成一些指定的工作吧。
一、bindservice
bindservice时一般都会在onbind接口中返回一个IBinder对象,这个对象中包含了service实例。我们在上节的实例上进行修改。
1、修改service类
(1)新建一个内部类MyBinder,并实例化一个对象。
public class MyBinder extends Binder { public MyService getService(){ return MyService.this; } }private MyBinder myBinder = new MyBinder();(2)在onBind中返回这个binder
@Override public IBinder onBind(Intent intent) { Log.d(TAG, "MyService onBind"); return myBinder; }(3)新建一个接口MyMethod
public void MyMethod() { Log.d(TAG, "MyService MyMethod"); }
2、修改Activity
在onServiceConnected中获取service实例,并调用接口MyMethod
public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG, "MyService onServiceConnected"); MyService.MyBinder binder = (MyService.MyBinder)service; MyService bindService = binder.getService(); bindService.MyMethod(); }3.运行效果
08-15 00:17:46.882 8502-8502/com.dlq.servicetest D/MyService﹕ MyService08-15 00:17:46.883 8502-8502/com.dlq.servicetest D/MyService﹕ MyService onCreate08-15 00:17:46.884 8502-8502/com.dlq.servicetest D/MyService﹕ MyService onBind08-15 00:17:46.898 8502-8502/com.dlq.servicetest D/MyService﹕ MyService onServiceConnected08-15 00:17:46.898 8502-8502/com.dlq.servicetest D/MyService﹕ MyService MyMethod
注:上一讲中运行实例时,我们发现onServiceConnected中并没有打印出来,这是因为onBind中没有返回这个binder。
二、startservice
bindservice时会返回一个service实例,我们可以通过service实例调用其中的接口。但startservice并不会返回实例,到底该怎么用呢?
这里我们在service中启动一个TimerTask,进行计数,并将计数结果通过broadcast发送给activity。
1、修改Service
(1)在onCreate中启动一个TimerTask。
public void onCreate() { super.onCreate(); Log.d(TAG, "MyService onCreate"); mTimer = new Timer(); mTimer.schedule(new MyTimerTask(), 0 , 1000); }(2)新建一个TimerTask类,进行计数,并发送广播
class MyTimerTask extends TimerTask { @Override public void run() { if(count==100){ count=0; } Log.d(TAG, "MyService count= "+count); Intent intent = new Intent("com.dlq.broadcast"); intent.putExtra("count", count); sendBroadcast(intent); count++; } }(3)在onDestroy中停止TimerTask
public void onDestroy() { Log.d(TAG, "MyService onDestroy"); super.onDestroy(); mTimer.cancel(); }2、修改Activity
(1)新建一个广播接收器
public class MyReceiver extends BroadcastReceiver { private static final String TAG = "MyService"; @Override public void onReceive(Context context, Intent intent) { if("com.dlq.broadcast".equals(intent.getAction())){ Log.i(TAG, "MyService get the broadcast from MyService..."); int count = intent.getIntExtra("count", 0); Log.d(TAG, "MyService BroadcastReceiver count="+count); } }}(2)在AndroidMainfest.xml中静态注册广播接收器
<receiver android:name=".MyReceiver"> <intent-filter> <action android:name="com.dlq.broadcast" /> </intent-filter> </receiver>3、运行效果
startservice 之后TImerTask开始启动,计数器累加,并发送广播。
Activity收到广播之后打印计数结果。
stopservice之后,停止计数。
08-15 01:42:15.626 9836-9836/com.dlq.servicetest D/MyService﹕ MyService08-15 01:42:15.626 9836-9836/com.dlq.servicetest D/MyService﹕ MyService onCreate08-15 01:42:15.628 9836-9836/com.dlq.servicetest D/MyService﹕ MyService onStartCommand08-15 01:42:15.628 9836-9836/com.dlq.servicetest D/MyService﹕ MyService onStart08-15 01:42:15.633 9836-9870/com.dlq.servicetest D/MyService﹕ MyService count= 008-15 01:42:15.648 9836-9836/com.dlq.servicetest I/MyService﹕ MyService get the broadcast from MyService...08-15 01:42:15.648 9836-9836/com.dlq.servicetest D/MyService﹕ MyService BroadcastReceiver count=008-15 01:42:16.632 9836-9870/com.dlq.servicetest D/MyService﹕ MyService count= 108-15 01:42:16.645 9836-9836/com.dlq.servicetest I/MyService﹕ MyService get the broadcast from MyService...08-15 01:42:16.645 9836-9836/com.dlq.servicetest D/MyService﹕ MyService BroadcastReceiver count=108-15 01:42:17.632 9836-9870/com.dlq.servicetest D/MyService﹕ MyService count= 208-15 01:42:17.647 9836-9836/com.dlq.servicetest I/MyService﹕ MyService get the broadcast from MyService...08-15 01:42:17.648 9836-9836/com.dlq.servicetest D/MyService﹕ MyService BroadcastReceiver count=208-15 01:42:18.632 9836-9870/com.dlq.servicetest D/MyService﹕ MyService count= 308-15 01:42:18.647 9836-9836/com.dlq.servicetest I/MyService﹕ MyService get the broadcast from MyService...08-15 01:42:18.647 9836-9836/com.dlq.servicetest D/MyService﹕ MyService BroadcastReceiver count=308-15 01:42:19.632 9836-9870/com.dlq.servicetest D/MyService﹕ MyService count= 408-15 01:42:19.647 9836-9836/com.dlq.servicetest I/MyService﹕ MyService get the broadcast from MyService...08-15 01:42:19.647 9836-9836/com.dlq.servicetest D/MyService﹕ MyService BroadcastReceiver count=408-15 01:42:20.278 9836-9836/com.dlq.servicetest D/MyService﹕ MyService onDestroy
0 0
- Android应用:Service开发实例(三)之Service的具体应用方法
- Android应用:Service开发实例(二)之Service的两种创建方法和其生命周期
- Android应用:Service开发实例(一)之AIDL和远程调用
- Android应用开发学习笔记之Service
- Service实例应用之电话录音
- Service实例应用之电话录音
- Android 的应用service
- Android系列之Service组件的应用
- Android应用框架之Service
- Android应用组件之Service
- Android基础之应用Service
- Android学习指南之十四:Service详解及应用实例
- Android应用实例之----基于Service与ContentProvider的音乐播放实例!
- Android应用实例之----基于Service与ContentProvider的音乐播放实例!
- Android应用实例之----基于Service与ContentProvider的音乐播放实例!
- Android应用实例之----基于Service与ContentProvider的音乐播放实例!
- Android应用实例之----基于Service与ContentProvider的音乐播放实例!
- Android应用实例之----基于Service与ContentProvider的音乐播放实例!
- select、poll、epoll之间的区别总结
- JPA学习笔记(3)——JPA注解
- Linux常用命令大全
- 在STS或者Eclipse切换用户操作
- 关于pureMVC框架的笔记
- Android应用:Service开发实例(三)之Service的具体应用方法
- 如何高效率解决BUG
- NYOJ 779 兰州烧饼
- C++ STL之Vector的使用介绍
- Codeforces 559C Gerald and Giant Chess 组合数学 DP
- 1285 确定比赛名次【拓扑排序】
- Unable to load native-hadoop library for your platform... using builtin-java classes where applicab
- LeetCode -- Substring with Concatenation of All Words
- 7种形式的Android Dialog使用举例