as通信程序
1. Android 进程间通信的几种实现方式
Android 进程间通信的几种实现方式
主要有4种方式:
这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。
主要实现原理:
由于应用程序之间不能共享内存。为了在不同应用程序之间交互数据(跨进程通讯),AndroidSDK中提供了4种用于跨进程通讯的方式进行交互数据,实现进程间通信主要是使用sdk中提供的4组组件根据实际开发情况进行实现数据交互。
详细实现方式:
Acitivity实现方式
Activity的跨进程访问与进程内访问略有不同。虽然它们都需要Intent对象,但跨进程访问并不需要指定Context对象和Activity的 Class对象,而需要指定的是要访问的Activity所对应的Action(一个字符串)。有些Activity还需要指定一个Uri(通过 Intent构造方法的第2个参数指定)。 在android系统中有很多应用程序提供了可以跨进程访问的Activity,例如,下面的代码可以直接调用拨打电话的Activity。
IntentcallIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);
Content Provider实现方式
Android应用程序可以使用文件或SqlLite数据库来存储数据。Content Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)
应用程序可以利用Content Provider完成下面的工作
1. 查询数据
2. 修改数据
3. 添加数据
4. 删除数据
Broadcast 广播实现方式
广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通。在应用程序中发送广播比较简单。只需要调用sendBroadcast方法即可。该方法需要一个Intent对象。通过Intent对象可以发送需要广播的数据。
Service实现方式
常用的使用方式之一:利用AIDL Service实现跨进程通信
这是我个人比较推崇的方式,因为它相比Broadcast而言,虽然实现上稍微麻烦了一点,但是它的优势就是不会像广播那样在手机中的广播较多时会有明显的时延,甚至有广播发送不成功的情况出现。
注意普通的Service并不能实现跨进程操作,实际上普通的Service和它所在的应用处于同一个进程中,而且它也不会专门开一条新的线程,因此如果在普通的Service中实现在耗时的任务,需要新开线程。
要实现跨进程通信,需要借助AIDL(Android Interface Definition Language)。Android中的跨进程服务其实是采用C/S的架构,因而AIDL的目的就是实现通信接口。
总结
跨进程通讯这个方面service方式的通讯远远复杂于其他几种通讯方式,实际开发中Activity、Content Provider、Broadcast和Service。4种经常用到,学习过程中要对没种实现方式有一定的了解。
2. JS与AS如何通信
'JS给AS设置变量
function setflash(varn, value){
var flash = document.getElementById("index");
flash.SetVariable(varn,value);
}
'JS获取AS变量
function getVar(varn){
var v = GetVariable(varn)
}
'JS控制AS跳转
function goto() {
n++;
document.myFlash.GotoFrame(n);
}
'AS调用JS函数
on (release) {
getURL(\"JavaScript:alert('hello,world')\");
}
'JS间接调用AS函数
原理:JS改变AS的值,AS跟据值的变化调用其函数
var stat=0;
setInterval(test,300){
if (stat==1) doFlash();
}
function doFlash(){
}
JS
flash.SetVariable(star,1);
3. AS 在通信中什么意思
如果有确定的接收字节长度,设置Rthreshold等于接收字节长度有利接收正确率提高.由于你的几个下位机返回数据包字节不等长,你可根据寻址命令发出前预先改变Rthreshold值来保证接收返回符合要求的字节长度.
不然你接收多少字节符合你改发下一寻址命令呢?程序代码处理难度较高.
实际下位机返回数据包可在其代码中补一定其它字节来达到等长,从而使接收代码变得简洁.
等长接收数据后可对接收处理清0来等待下次接收.
补充:
假如下位机的返回数据按地址号能确定接收字节长度,下列代码可实现接收不等长数据,仅供参考:
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytReceived() As Byte
Dim strBuff As String
Dim strData As String
Dim i As Integer
Dim x As Integer
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
Text3 = Text3 + strData
If Left(strData, 2) = "00" And Len(strData) = 8 Then
Text1(0).Text = Left(strData, 8)
Call DataClear
ElseIf Left(strData, 2) = "01" And Len(strData) = 10 Then
Text1(1).Text = Left(strData, 10)
Call DataClear
End If
End Select
End Sub
Public Sub DataClear()
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0
Text3 = ""
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 1 'COM端口
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
'MSComm1.SThreshold = 1 '如果传输缓冲区完全空时产生MSComm事件
MSComm1.RThreshold = 1 '不产生MSComm事件
MSComm1.PortOpen = True
Text3 = "" '打开端口
End Subghh希望点赞我的
4. flash AS3两台电脑间通信,只要实现字符的传输便可;我只会点flash,最好只要用flash就能实现。
使用Socket类跟ServerSocket类完成。
假设你的两台电脑ip是192.168.1.101和192.168.1.102,在第一台电脑上建一个AIR应用程序,代码:
import flash.net.ServerSocket;
import flash.events.ServerSocketConnectEvent;
import flash.events.ProgressEvent;
import flash.net.Socket;
import flash.events.Event;
var ss:ServerSocket=new ServerSocket();
ss.bind(12345);
ss.listen();
ss.addEventListener(ServerSocketConnectEvent.CONNECT,hconnect);
function hconnect(e:ServerSocketConnectEvent){
trace("客户端"+e.socket.remoteAddress+"已连接");
e.socket.addEventListener(ProgressEvent.SOCKET_DATA,hdata);
e.socket.addEventListener(Event.CLOSE,hclo);
}
function hdata(e:ProgressEvent){
var s:Socket=e.target as Socket;
trace("客户端"+s.remoteAddress+"说:"+s.readMultiByte(s.bytesAvailable,"utf-8"));
s.writeMultiByte("Hello,Client!","utf-8");
}
function hclo(e:Event){
trace("客户端"+e.target.remoteAddress+"已断开");
}
在第二台电脑上建一个as3程序,代码:
import flash.net.Socket;
import flash.events.Event;
import flash.events.ProgressEvent;
var s:Socket=new Socket();
s.addEventListener(Event.CONNECT,hconnect);
s.connect("192.168.1.101",12345);
function hconnect(e:Event){
trace("服务器连接成功");
s.addEventListener(ProgressEvent.SOCKET_DATA,hdata);
s.writeMultiByte("Hello,Server!","utf-8");
}
function hdata(e:ProgressEvent){
trace("服务器说:"+s.readMultiByte(s.bytesAvailable,"utf-8"));
}
先开第一个程序,再开第二个程序。