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
原创粉丝点击