android 进程间通信示例

来源:互联网 发布:新概念2 3 4教材知乎 编辑:程序博客网 时间:2024/04/28 15:16

http://blog.csdn.net/liushaogeng/article/details/5866397


两个进程间的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


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 墙内水管漏水怎么办3步骤巧维修 下面有地暖下面水管漏水怎么办 热水器接的塑料水管子漏水怎么办 电热水器烧热水时热水管漏水怎么办 户户通位置锁定模块异常1怎么办 户户通位置锁定模块异常3怎么办 逆战安全系统检测客户端异常怎么办 电视户户通位置信息模块异常怎么办 苹果手机wi-fi模块坏了怎么办 xp本地连接受限制或无连接怎么办 公司没帮二级建造师延续注册怎么办 考造价师考过了年限不够怎么办? 上海众非称重不显示数字怎么办 宝骏630防火墙隔热棉掉了怎么办 冷车启动水温报警灯亮了怎么办 租铺位面积比合同面积小怎么办 农村村民建房领居不肯签名怎么办 车祸死者家属不来协商赔偿怎么办 26岁想回去当老师了怎么办 面包车排量小空调带不凉快怎么办 科三包过不给退钱人跑了怎么办 护师职称考试成绩单丢了怎么办 河南二级建造师报名地址填错怎么办 山东以前的企业没有消防备案怎么办 重庆渝北初级审核时间过了怎么办 初级职称复核毕业证弄丢了怎么办 杭州公租房选房后变更单位的怎么办 契税交了贷款办不下来怎么办 天津公租房住满5年后怎么办 大江里钓鱼水流太急立不住漂怎么办 房子定金交了不想要了怎么办 房子付了首付不想要了怎么办 三国大时代4王越死了任务怎么办 红米2卡顿反应慢怎么办 国税和地税合并新进的公务员怎么办 买车合格证不给我们要怎么办 初级会计报名信息表填写错误怎么办 跨国快递需要收件人自行清关怎么办 腋下有异味怎么办邀约成都真愛 腋下有异味怎么办犀利成都真愛 腋下有异味怎么办有信成都真愛