Android -- 跨应用绑定service并通信

之前记录过跨应用绑定service:http://blog.csdn.net/gaopeng0071/article/details/46049929,那么绑定后如何进行通信呢,下面我们就来学习下。

第一步,

需要修改service1项目中aidl,增加一个方法。

package com.example.service1.aidl;  

interface IMyService {  

    void basicType();

    void setName(String name);
}

setName用于存储name的方法。

然后clear项目

第二步,

此时,我们service类中的onBind方法需要实现新接口。

package com.example.service1;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

import com.example.service1.aidl.IMyService;

public class MyService extends Service {

    private String serviceName = "默认名字";
    private boolean running;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return new IMyService.Stub() {

            @Override
            public void basicType() throws RemoteException {
                // TODO Auto-generated method stub

            }

            @Override
            public void setName(String name) throws RemoteException {
                serviceName = name;
            }
        };
    }

    @Override
    public void onCreate() {
        running = true;
        new Thread() {
            public void run() {
                while (running) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(serviceName);
                }
            };
        }.start();
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        running = false;
    }

}

代码27到29行,接收到name并且放入全局变量中,提供给onCreate方法输出。

第三步,

将service1项目中aidl拷贝到service2项目中,并且包名要一致,

第四步,

修改service2应用activity布局,增加一个text域,和一个按钮。用于将text中的信息提交到service1项目的service中。

第五步,

修改service2项目中activity,增加与service1的通信,

package com.example.service2;

import com.example.service1.aidl.IMyService;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener,
        ServiceConnection {

    Intent serviceIntent;

    private IMyService imyService = null;

    TextView t;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        serviceIntent = new Intent();
        serviceIntent.setComponent(new ComponentName("com.example.service1",
                "com.example.service1.MyService"));

        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this);
        findViewById(R.id.button4).setOnClickListener(this);

        findViewById(R.id.button5).setOnClickListener(this);

        t = (TextView) findViewById(R.id.textView1);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:
            startService(serviceIntent);
            break;
        case R.id.button2:
            stopService(serviceIntent);
            break;
        case R.id.button3:
            bindService(serviceIntent, this, Context.BIND_AUTO_CREATE);
            break;
        case R.id.button4:
            unbindService(this);
            imyService = null;
            break;
        case R.id.button5:
            if (imyService != null) {
                try {
                    imyService.setName(t.getText().toString());
                } catch (RemoteException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        imyService = IMyService.Stub.asInterface(service);
        System.out.println("onServiceConnected");
        System.out.println(service);

    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // TODO Auto-generated method stub

    }

}

代码72行,传输数据

代码84行用法imyService = IMyService.Stub.asInterface(service);

运行结果,如图,

时间: 2024-08-26 03:35:30

Android -- 跨应用绑定service并通信的相关文章

Android -- 跨应用绑定service(AIDL)

之前一章记录了跨应用启动service,之前学习过startService于bindService的区别及用法. 使用bindService方法,activity需要service返回一个Binder对象,那么如果是两个应用怎么实现呢,这里就涉及到了一个AIDL的概念. AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication,

Android使用Messenger进行Service IPC通信分析

如果想要进行IPC通信,一般写一个AIDL接口,再写一个Service子类,然后实现AIDL接口 当做IBinder返回给Activity界面层. 如果不想写AIDL接口文件,只是单I线程中与Service进行通信 我们可以用Android写好的Messenger类来处理,一样能将消息传递给Service进行通信. 先写上基本代码: public class MyService extends Service { Messenger messenger = null; public MyServ

跨应用绑定service

绑定service需要在上一讲中,新创建一个AIDL. // AppServiceRemoteBinder.aidl package com.example.yabushan.aidsservice; // Declare any non-default types here with import statements interface AppServiceRemoteBinder { /** * Demonstrates some basic types that you can use

跨进程绑定Service

之前讲过Service有远程服务,也就是不同程序之间也可以通过Service联系起来.跨进程的绑定Service可以通过aidl接口实现. 下面运用一个例子程序 提供Service里的方法和数据的程序叫做服务端,获取和运用Service里的方法和数据的程序叫客户端. 先创建两个安卓程序,一个作为服务端,一个作为客户端. 先对服务端进行操作,在服务端创建一个class类,然后在我的电脑的eclipse的项目存储目录下,找到该class并把后缀名改为 .aidl 然后回到开发程序中刷新一下,就会发现

Android -- 跨应用启动Service

本章博客,记录的是跨应用启动Service. 我们需要创建一个应用service1,其中包含一个MyService,部分代码如下: @Override public void onCreate() { // TODO Auto-generated method stub System.out.println("onCreate"); super.onCreate(); } @Override public void onDestroy() { System.out.println(&q

Android Activity与远程Service的通信学习总结

当一个Service在androidManifest中被声明为 process=":remote", 或者是还有一个应用程序中的Service时,即为远程Service, 远程的意思是和当前程序不在同一个进程中执行. Activity和远程Service的跨进程通信(IPC)通过Binder机制,使用AIDL服务实现. 一.  定义远程服务端 1.新建一个project,project文件夹例如以下 2. 文件内容 aidl传递复杂对象时,须要该对象实现Parcelable或Seria

绑定service进行通信

package com.example.yabushan.hello3; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; public class MyService extends Service { private boolean SERVICE_STATE=true; private String data="默认值

入门篇:10.Android中AIDL(安卓接口定义语言)跨应用操作Service

Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口.我们知道4个Android应用程序组件中的3个(Activity.BroadcastRec

Android应用程序绑定服务(bindService)的过程源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6745181 Android应用程序组件Service与Activity一样,既可以在新的进程中启动,也可以在应用程序进程内部 启动:前面我们已经分析了在新的进程中启动Service的过程,本文将要介绍在应用程序内部绑定Service的过程,这是一种在应用程序进程内部启动 Service的方法. 在前面一篇文章Android进程间通信(IPC)机