Android service的开启和绑定,以及调用service的方法

界面:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <Button android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="开启服务"
            android:onClick="start"
            />

    <Button android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="关闭服务"
            android:onClick="close"
            />

    <Button android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="绑定服务"
            android:onClick="bind"
            />

    <Button android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="取消绑定服务"
            android:onClick="unbind"
            />

    <Button android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="调用服务的方法function()"
            android:onClick="callFunction"
            />
</LinearLayout>

 

Activity

package com.example.serviceTest;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;

public class MyActivity extends Activity {

    private IService myBinder;
    private ServiceConnection myConn = new MyConn();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void start(View view) {
        startService(new Intent(this, TestService.class));
    }

    /**
     * 多次调用停止服务,没有出现问题(不能多次解绑)
     */
    public void close(View view) {
        stopService(new Intent(this, TestService.class));
    }


    public void bind(View view) {
        Intent intent = new Intent(this, TestService.class);
        bindService(intent, myConn, BIND_AUTO_CREATE);
    }

    /**
     * 多次解绑服务会报出错误
     */
    public void unbind(View view) {
        unbindService(myConn);
    }

    public void callFunction(View view) {
        if (myBinder != null) {
            myBinder.callFunction();
        }
    }

    //绑定的时候,回调的一些方法
    class MyConn implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            System.out.println("获取到binder");
            myBinder = (IService) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            System.out.println("com.example.serviceTest.MyActivity.MyConn.onServiceDisconnected");
        }
    }
}


Service

package com.example.serviceTest;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;

/**
 * Created by Heyiyong on 14-5-16.
 */
public class TestService extends Service {

    public IBinder onBind(Intent intent) {
        System.out.println("服务被绑定了!");
        return new MyBinder();
    }

    //中间人(service的代理)
    private class MyBinder extends Binder implements IService{
        public void callFunction() {
            function();
        }
    }

    @Override
    public void onCreate() {
        System.out.println("com.example.serviceTest.TestService.onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("com.example.serviceTest.TestService.onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        System.out.println("com.example.serviceTest.TestService.onDestroy");
    }

    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("com.example.serviceTest.TestService.onUnbind");
        return super.onUnbind(intent);
    }

    public void function() {
        Toast.makeText(getApplicationContext(), "function()方法被调用了!", 1).show();
        System.out.println("com.example.serviceTest.TestService.function");
    }
}

 

posted @ 2014-05-17 11:26  无忧之路  阅读(786)  评论(0编辑  收藏  举报
无忧之路