使用AIDL调用服务中的方法

AIDL:android interface define language(接口定义语言)

作用:方便远程调用其他服务中的方法

注意:安卓四大组件都要在清单文件注册

aidl创建图:

interface InterfaceAidl {
   void interfacePay();
}
public class MyService extends Service {

    class MyBinder extends InterfaceAidl.Stub {
        @Override
        public void interfacePay() throws RemoteException {
            pay();
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        MyBinder binder = new MyBinder();
        return binder;
    }

    private void pay() {
        Log.i("service","支付成功");
    }
}
public class MainActivity extends AppCompatActivity {
    private Intent intent;
    private MyServiceConnection myServiceConnection;
    private InterfaceAidl interfaceAidl;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent(this,MyService.class);
        myServiceConnection = new MyServiceConnection();
    }

    public void bind(View view){
        bindService(intent, myServiceConnection, BIND_AUTO_CREATE);
    }

    public void pay(View view){
        try {
            interfaceAidl.interfacePay();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    class MyServiceConnection implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            interfaceAidl = InterfaceAidl.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(myServiceConnection);
    }
}

远程调用服务

interface InterfaceAidl {
   void interfacePay();
}
<service android:name=".MyService">
            <intent-filter>
                <action android:name="aidl_interface.pay"></action>
            </intent-filter>
        </service>
public class MainActivity extends AppCompatActivity {

    private Intent intent;
    private InterfaceAidl interfaceAidl;
    private MyServiceConnection myServiceConnection;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intent = new Intent();
        myServiceConnection = new MyServiceConnection();
        intent.setAction("aidl_interface.pay");
        intent.setPackage("com.example.administrator.aidlservice");
    }

    public void bind(View view){
        bindService(intent,myServiceConnection,BIND_AUTO_CREATE);
    }

    public void pay(View view){
        try {
            interfaceAidl.interfacePay();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    class MyServiceConnection implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            interfaceAidl  = InterfaceAidl.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(myServiceConnection);
    }
}
时间: 2024-08-04 07:32:07

使用AIDL调用服务中的方法的相关文章

绑定服务调用远程服务中的方法

在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信.为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Se

绑定服务调用本地服务中的方法

如果想调用服务中的方法, 通过startService()是做不到的, 这时需要用bindService来解决. 下面的demo是在Activity中调用Service中的自定义方法---methodInService 这个demo可以解决在项目开发中调用service里的数据. 这里在service中使用到了代理模式.这是为了,给service组件和activity组件中间添加一个中间人. 通过代理来传递数据.也就是binder对象.这个代理就是接口IService Service中的代码如下

远程调用服务里的方法service,进程间通信adil的学习

1当一个进程需要调用另外一个进程的方法时候,进程可以通过aidl文件以接口的方式将方法抛出.比如android没有对外提供挂电话的方法,若用户想要调用这个方法就必须与电话管理这个应用程序通信,调用挂电话的方法. 2.下面我就举例一个demo调用远程服务里的方法.为了验证service能否单独启动,这个demo启动了2个远程服务,一个有activity的一个只有service的.并且他们抛出的接口名字相同,正好学习一下同名的引用,发现一个java文件里只能import  1个同同名的类,若想调用另

Android(java)学习笔记228:服务(service)之绑定服务调用服务里面的方法

1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 :                     bindService(intent, new MyConn(), BIND_AUTO_CREATE): 参数intent:意图对象,服务对应的意图对象  new  Intent(this,Service.class) 参数ServiceConnection (接口,自定义其接口实现内部类MyConn() ):通讯

Unity SLua 如何调用Unity中C#方法

1.原理 就是通常在Lua框架中所说的,开放一个C#的web接口,或者叫做在Slua框架中注册函数. 2.作用 在Lua中调用C#中的方法,这个是在做热更新中很常用的一种方法,无论是slua,还是lua,都差不多.这里,我拿slua举例. 3.实际运用 举例:如何在Slua中打印Log 原理:其实是slua通过调用C#中的Debug.Log方法实现的打印,并不是说是lua中的打印方法起到作用. 步骤: 首先,既然是Lua调用C#中的方法,这里自定义写一个打印log的方法. 1 2 3 4 5 6

通过接口方式调用服务里面的方法

  接口可以隐藏代码内部的细节 让程序员暴露自己只想暴露的方法   (6)定义一个接口 把想暴露的方法都定义在接口里面 (7)我们定义的中间人对象 实现我们定义的接口 (8)在获取我们定义的中间人对象方式变了 public interface Iservice { //把领导想暴露的方法 都定义在接口里面 public void callBanZheng(int money); public void callPlayMaJiang(); } public class MainActivity

webview中js调用Android中的方法

package com.example.helloworld; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webView = null

使用Java的反射功能调用类中的方法

最近一直在搞Java的反射,今天使用反射调用方法时出现了很多问题,主要是没有详细参考官方API.所以走了很多弯路. 所以想把这个例子记下来,供自己也供他人学习. package com.mine.practice.reflect; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * 使用反射调用类中的方法 * @author 2014-11-5 上午10:51:28

在Android Studio中调用so中的方法

本节用的so是上节用Android Studio创建的so.想在Android Studio中调用so中的方法,需要先引用so.Android Studio中引用so的方法有二种,下面开始介绍. 一 引用so  在app/src/main目录下新建Directory,命名文件夹为jniLIB(文件名不能错),把so文件放进去 ,如图: 二 编写java代码调用so中方法 ①在代码中引用so 创建myJNI.java文件,用System.loadLibrary加载so,同时声明so中的HelloW