49.android利用AIDL通信

本文详细介绍了如何使用Android接口定义语言(AIDL)实现跨进程通信(IPC),包括创建AIDL接口文件、服务端与客户端的交互流程及示例代码。

AIDL:Android的接口定义语言,接口定义语言,顾名思义,就是定义接口的语言,即利用AIDL可以定义接口。

AIDL简单地说就是进程间通信的方法,类似于Java的的中的RMI,主要用来进程之间通信的;

1.把远程服务的方法抽取成一个单独的接口的Java的文件

2.把接口的Java的文件的后缀名改成AIDL

3.在自动生成的publicbusiness.java文件中,有一个静态类抽象存根,它已经继承了粘合剂类实现了publicbusiness接口,这个类就是新的中间人。

4.把AIDL文件复制粘贴到新的项目中,粘贴的时候AIDL文件所在的包名必须和AIDL创建的时候的包名一致

5.新的项目中,强转中间人对象直接使用Stub.asInterface();

将之前创建的接口文件publicbusiness.java名字修改成publicbusiness.aidl并去掉里面的市民,因为AIDL里面的东西本身就是公开的。

publicbusiness.java是自动生产的,里面实现了中间人的方法:

public static abstract class Stub extends android.os.Binder implements com.ldw.remoteService.publicbusiness

因此在服务中不需要继承和实现一些方法,直接使用存根作为中间人对象。

中间方法定义成了这个

	class zhongjian extends Stub{
		public void diao(){
			beidiaoyong();
		}
	}

调用这个服务的应用程序需要把AIDL文件也粘贴到代码目录下,注意包名也必须一样,上面创建的publicbusiness.java在com.ldw.remoteService里面,因此调用的时候也要创建一个一样的包把AIDL放进去,里面也会生产一个publicbusiness.java

代码:

APP1:

清单文件

        <service android:name="com.ldw.remoteService.remoteService">
            <intent-filter >
                <action android:name="com.ldw.remote"/>
            </intent-filter>
        </service>

publicbusiness.aidl

package com.ldw.remoteService;

interface publicbusiness {
	void diao();
}

remoteService.java

package com.ldw.remoteService;


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

import com.ldw.remoteService.publicbusiness.Stub;

public class remoteService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("onBind方法");
		return new zhongjian();
	}
	
	class zhongjian extends Stub{
		public void diao(){
			beidiaoyong();
		}
	}
	
	public void beidiaoyong(){
		System.out.println("beidiaoyong方法被调用");
	}
	
}

APP 2:

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" 
    android:orientation="vertical"
    >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用服务的方法" 
        android:onClick="diaoyong"
        />
</LinearLayout>

MainActivity.java

package com.ldw.startservice;

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.os.RemoteException;
import android.view.View;

import com.ldw.remoteService.publicbusiness;
import com.ldw.remoteService.publicbusiness.Stub;

public class MainActivity extends Activity {

	private MyserviceConn conn;
	publicbusiness pb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        conn = new MyserviceConn();
    }
    
    public void start(View v){
    	Intent intent = new Intent();
    	intent.setAction("com.ldw.remote");
    	startService(intent);
    }
    
    public void stop(View v){
    	Intent intent = new Intent();
    	intent.setAction("com.ldw.remote");
    	stopService(intent);
    }
    
    public void bind(View v){
    	Intent intent = new Intent();
    	intent.setAction("com.ldw.remote");
    	bindService(intent, conn, BIND_AUTO_CREATE);
    }
    
    public void unbind(View v){
    	unbindService(conn);
    }
    
    public void diaoyong(View v){
    	try {
			pb.diao();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
    
    class MyserviceConn implements ServiceConnection{

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			//吧中间人对象强转成publicbusiness
			pb = Stub.asInterface(service);
		}

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

Alipay

app1创建一个service,来提供调用

Manifist.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ldw.alipay"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.ldw.alipay.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.ldw.alipay.payService">
            <intent-filter >
                <action android:name="com.ldw.pay"/>
            </intent-filter>
        </service>
    </application>

</manifest>

publicbusiness.aidl

package com.ldw.alipay;

interface publicbusiness {
	void pay();
}

MainActivity.java

package com.ldw.alipay;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

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


    @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;
    }
    
}

服务payService.java

package com.ldw.alipay;

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

import com.ldw.alipay.publicbusiness.Stub;

public class payService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return new zhongjian();
	}
	
	class zhongjian extends Stub{

		@Override
		public void pay() throws RemoteException {
			// TODO Auto-generated method stub
			//调用服务的pay方法
			payService.this.pay();
		}
		
	}
	
	public void pay(){
		System.out.println("pay支付");
	}

}

app2调用服务中的方法MainActivity.java

package com.ldw.usepay;

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.os.RemoteException;
import android.view.View;

import com.ldw.alipay.publicbusiness;
import com.ldw.alipay.publicbusiness.Stub;

public class MainActivity extends Activity {

	publicbusiness pb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent();
        intent.setAction("com.ldw.pay");
        //这次用匿名的内部类来实现
        bindService(intent, new ServiceConnection(){

			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				// TODO Auto-generated method stub
				pb = Stub.asInterface(service);
			}

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

    //调用远程服务的支付方法
    public void click(View v){
	   try {
		pb.pay();
	} catch (RemoteException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
    }
    
}

 

 

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
先展示下效果 https://pan.quark.cn/s/a4b39357ea24 本项目是本人参加BAT等其他公司电话、现场面试之后总结出来的针对Java面试的知识点或真题,每个点或题目都是在面试中被问过的。 除开知识点,一定要准备好以下套路: 个人介绍,需要准备一个1分钟的介绍,包括学习经历、工作经历、项目经历、个人优势、一句话总结。 一定要自己背得滚瓜烂熟,张口就来 抽象概念,当面试官问你是如何理解多线程的时候,你要知道从定义、来源、实现、问题、优化、应用方面系统性地回答 项目强化,至少与知识点的比例是五五开,所以必须针对简历中的两个以上的项目,形成包括【架构和实现细节】,【正常流程和异常流程的处理】,【难点+坑+复盘优化】三位一体的组合拳 压力练习,面试的时候难免紧张,可能会严重影响发挥,通过平时多找机会参与交流分享,或找人做压力面试来改善 表达练习,表达能力非常影响在面试中的表现,能否简练地将答案告诉面试官,可以通过给自己讲解的方式刻意练习 重点针对,面试官会针对简历提问,所以请针对简历上写的所有技术点进行重点准备 Java基础 JVM原理 集合 多线程 IO 问题排查 Web框架、数据库 Spring MySQL Redis 通用基础 操作系统 网络通信协议 排序算法 常用设计模式 从URL到看到网页的过程 分布式 CAP理论 锁 事务 消息队列 协调器 ID生成方式 一致性hash 限流 微服务 微服务介绍 服务发现 API网关 服务容错保护 服务配置中心 算法 数组-快速排序-第k大个数 数组-对撞指针-最大蓄水 数组-滑动窗口-最小连续子数组 数组-归并排序-合并有序数组 数组-顺时针打印矩形 数组-24点游戏 链表-链表反转-链表相加 链表-...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值