android 进程间通信示例

本文详细介绍如何使用Android接口定义语言(AIDL)实现两个进程间Service的通信。从编写AIDL文件到服务实现类和服务消费Activity的编写,一步步引导读者理解整个过程。

        两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。
        Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的 java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了.现在来实现一个HelloWorld级的服务以及在 Activity中使用这个服务。步骤如下:

1.编写aidl文件,在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为 IDataTimeService.aidl文件的内容为如下所示:

 package android.ipc; 
   
  // Declare the interface. 
  interface IDateTimeService { 
      String getCurrentDataTime(); 
  }

2.编写服务的实现类,在这个示例中为DataTimeService.java,内容如下:

package android.ipc;

import android.content.Intent;
import android.app.Service;
import java.util.Date;
import android.os.IBinder;

public class DateTimeService extends Service {
    public static final String BROADCAST_ACTION = "com.services.demo2.DataTimeServiceEvent";
    /**
     * 使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的
     * sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有 Activity注册的接收者进行处理;
     */
    private Intent broadcast = new Intent(BROADCAST_ACTION);

    private final IDateTimeService.Stub binder = new IDateTimeService.Stub() {
        public String getCurrentDataTime() {
            return (getCurrentDataTimeImpl());
        }
    };

    synchronized private String getCurrentDataTimeImpl() {
        Date date = new Date();
        return (date.toLocaleString());
    }

    @Override
    public IBinder onBind(Intent intent) {
        sendBroadcast(broadcast);
        return (binder);
    }
}

3.现在编写一个Activity,来消费这个服务:

 package android.ipc;

import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.webkit.WebView;
import android.content.ServiceConnection;
import android.content.ComponentName;
import android.os.IBinder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;

public class ipc extends Activity {
    private IDateTimeService service = null;
    private Intent serviceIntent = null;
    private WebView browser;
    private ServiceConnection svcConn = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder binder) {
            service = IDateTimeService.Stub.asInterface(binder);

            browser.postDelayed(new Runnable() {
                public void run() {
                    updateForecast();
                }
            }, 1000);
        }

        public void onServiceDisconnected(ComponentName className) {
            service = null;
        }
    };

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

        browser = (WebView) findViewById(R.id.WebView);
        serviceIntent = new Intent(this, DateTimeService.class);
        // 绑定一个服务
        bindService(serviceIntent, svcConn, BIND_AUTO_CREATE);
    }

    @Override
    public void onResume() {
        super.onResume();
        /**
         * 注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由 Activity注册的接收者
         * 接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收
         * DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;
         */
        registerReceiver(receiver, new IntentFilter(
                DateTimeService.BROADCAST_ACTION));
    }

    @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unbindService(svcConn);
    }

    private void updateForecast() {
        try {
            String page = service.getCurrentDataTime();
            if (page != null) {
                browser.loadDataWithBaseURL(null, page, "text/html", "UTF- ",
                        null);
                browser.postDelayed(new Runnable() {
                    public void run() {
                        updateForecast();
                    }
                }, 1000);
            }
        } catch (final Throwable t) {
            svcConn.onServiceDisconnected(null);
        }
    }

    // 接收者实例
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            runOnUiThread(new Runnable() {
                public void run() {
                    updateForecast();
                }
            });
        }
    };
}

参考:http://alex-yang-xiansoftware-com.javaeye.com/blog/607109

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值