導航:首頁 > 操作系統 > android介面通信

android介面通信

發布時間:2022-10-07 17:32:15

android怎麼對usb介面編程與電腦通訊

安卓與PC的通訊 是用套節字來完成的. PC上做個服務端,手機上做個客戶端去連接。 然後在PC端的程序中調用ADB中的命令來完成對手機上的部分操作。比如安裝APK等。

② Android手機使用USB介面與RS232通訊

從技術上講,是肯定可以的。方案如下:
手機USB -> USB HOST -> USB轉232 -> RS232設備

主要工作會有:
手機USB端的程序需要定製。
USB HOST端的程序需要定製,如果不用PC機,甚至連USB HOST設備都要做。
RS232設備的程序需要重寫。

你確定你想這么做嗎?

③ android介面是什麼意思,調用介面是怎麼回事,求高手指點

介面是標准,只要符合標准才可以用,樓下說的完全不對,怎麼可能是usb呢,在手機中,功能層之間通信,必須調用介面才可以互相通信,使用介面用implements

java服務端android客戶端如何通信

從伺服器寫一個字元串過去可以這樣:String p = "-1,2,5";
發過去以後,將字元串分隔開,String[] ss = p.split(",");
數組裡面的元素就是位置的三個坐標了。
但鑒於你可能發送多種類型的數據,你可以寫一個協議,舉例說就是,String p ="P,-1,2,5";
分隔出來以後,可以根據數組裡面的第一個值判斷是什麼類型的數據,在執行相關的操作。

⑤ android 中什麼是上下層交互介面,命令

Android的無線介面層(RIL)提供了Android電話服務(android.telephony)與無線電硬體之間的抽象層。RIL是通訊無關的,提供基於GSM的網路支持。
下圖顯示了RIL位於Android電話系統架構中的位置:實線框表示Android部分,虛線框表示合作夥伴所專用的部分

RIL包含兩個基本部件:
RIL守護進程(RIL Daemon):RIL守護進程初始化Vendor RIL,管理所有來自Android通訊服務的通訊,將其作為被請求的命令(solicited commands)調度給Vendor RIL。
Vendor RIL:ril.h文件中的無線電專用Vendor RIL掌管著所有和無線電硬體的通訊,並且通過未被請求的命令(unsolicited commands)分發給RIL 守護進程。

RIL初始化:
Android在啟動時初始化通訊棧和Vendor RIL,描述如下:
1. RIL守護進程讀取rild.lib路徑和rild.libargs系統參數,決定應該使用的Vendor RIL庫和向Vendor RIL提供的初始化參數
2. RIL守護進程載入Vendor RIL庫,執行RIL_Init初始化RIL並為RIL函數獲取參數
3. RIL守護進程調用Android通訊棧中RIL_register,為Vendor RIL函數提供參考。
RIL守護進程源碼請參考:/device/commands/rild/rild.c

RIL 交互:
RIL句柄提供了兩種交互方式:
主動請求命令(Solicited commands):主動請求命令來自RIL lib,比如DIAL和HANGUP。
被動請求命令(Unsolicited responses):被動請求命令來自基帶,比如CALL_STATE_CHANGED 和 NEW_SMS。

主動請求:
以下代碼片段屬於主動請求命令
void OnRequest (int request_id, void *data, size_t datalen, RIL_Token t);
void OnRequestComplete (RIL_Token t, RIL_Error e, void *response, size_t responselen);

有超過60個主動請求命令:
* SIM PIN,IO和IMSI/IMEI(11)
* 電話狀態和動作(撥號,應答,靜音…)(16)
* 網路狀態查詢(4)
* 網路設置(禁止,轉發,選擇…)(12)
* 簡訊(3)
* PDP連接(4)
* 電源和復位(2)
* 輔助服務(5)
* 供應商定義及其支持(4)

下圖表明了Android系統一個主動請求的電話過程:

被動請求:
以下代碼片段屬於被動請求命令
void OnUnsolicitedResponse (int unsolResponse, void *data, size_t datalen);

有超過10條被動請求命令:
* 網路狀態改變(4)
* 新簡訊通知(3)
* 新USSD通知(2)
* 信號強度和時間改變(2)

下圖表明Android系統中一個被動請求的電話過程:

實現RIL:
為了實現一個通訊專用RIL,需要執行一系列函數以創建一個共享庫,保證Android能夠相應無線通信請求。所需要的函數被定義在RIL頭部(/include/telephony/ril.h)
Android通訊介面是通訊無關的,Vendor RIL可以使用任意協議進行無線通訊。Android提供了一個參考Vendor RIL,使用的是賀式(Hayes)AT命令設備,可作為一個商用的快速入門指導以及通訊測試使用。
RIL參考源碼在/commands/reference-ril/。
通常將你自己的Vendor RIL編譯為以下形式:
libril-<companyname>-<RIL version>.so
比如:
libril-acme-124.so
其中:
libril:所有vendor RIL的開頭;
<companyname>:專用公司縮寫
<RIL version>:RIL版本number
so:文件擴展

RIL初始化:
特定的Vendor RIL必須定義一個初始化函數,提供一系列句柄函數以處理每一個通訊請求。Android RIL守護進程會在啟動時調用RIL_Init以初始化RIL。
RIL_RadioFunctions *RIL_Init (RIL_Env* env, int argc, char **argv);
RIL_Init 返回一個RIL_RadioFunctions結構體包含無線電函數指針。
type structure {
int RIL_version;
RIL_RequestFunc onRequest;
RIL_RadioStateRequest onStateRequest;
RIL_Supports supports;
RIL_Cancel onCancel;
RIL_GetVersion getVersion;
} RIL_RadioFunctions;

RIL函數:
ril.h定義了RIL狀態和變數,比如RIL_UNSOL_STK_CALL_SETUP, RIL_SIM_READY, RIL_SIM_NOT_READY,具體函數描述見下表。忽略頭文件細節。

RIL主動命令請求
Vendor RIL必須提供下表中的函數用以發送主動命令。RIL主動命令請求類型定義在ril.h的RIL_REQUEST_prefix中。
void (*RIL_RequestFunc) (int request, void *data, size_t datalen, RIL_Token t);
RIL主動命令入口指針,必須能夠處理各種RIL主動請求(定義於ril.h的RIL_REQUEST_ prefix)
* request 是一種 RIL_REQUEST_*
* data 是一個指向RIL_REQUEST_*數據的指針
* t 應當被用於RIL_onResponse的後續調用
* datalen 由調用者所有,應當由被調者修改或釋放
必須調用RIL_onRequestComplete()函數完成通訊。?RIL_onRequestComplete() 在這個函數返回前或之後可能被任意線程調用。這個函數總會調用同一個線程,因此返回到這里意味著無線通訊准備去處理其他命令(無論前面命令是否完成傳輸)。
RIL_RadioState (*RIL_RadioStateRequest)();
這個函數應該返回當前通訊同步狀態
int (*RIL_Supports)(int requestCode);
如果提供指定RIL_REQUEST代碼,返回1,否則返回0.
void (*RIL_Cancel)(RIL_Token t);
本函數用來指示取消一個待處理請求。函數將被一個獨立線程所調用,而不是RIL_RequestFunc函數。
一旦取消,被調用者應當盡量放棄請求並在這之後調用RIL_onRequestComplete 函數的RIL_Errno CANCELLED 。
響應請求後調用 RIL_onRequestComplete 並產生其他結果是可以被接受的,但會被忽略(理應忽略被取消的請求)。
RIL_Cancel 調用應該被立刻返回,不需要等待取消。
const char * (*RIL_GetVersion) (void);
向你的Vendor RIL返回版本字元串

⑥ android兩個應用程序之間的通信和調用

你是說兩個應用之間還是單個應用的進程之間?
應用程序之間共享數據其實可以使用shareperference 或者 sqlite就行 只是實時操作而已 系統資源消耗比較大。
如果是線程間通信可以使用類似handler和runable傳參數。
如果是進程間通信的話可以使用遠程服務,AIDL作為中間介面,一個服務端一個客戶端數據就可以交互。

⑦ android線程間通信有哪些方式

進程:是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
  線程:是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統資源,只擁有一些在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。
  區別:
  (1)、一個程序至少有一個進程,一個進程至少有一個線程;
  (2)、線程的劃分尺度小於進程,使得多線程程序的並發性高;
  (3)、進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉。
---------------------
一、Android進程間通信方式
1.Bundle
  由於Activity,Service,Receiver都是可以通過Intent來攜帶Bundle傳輸數據的,所以我們可以在一個進程中通過Intent將攜帶數據的Bundle發送到另一個進程的組件。
  缺點:無法傳輸Bundle不支持的數據類型。
2.ContentProvider
  ContentProvider是Android四大組件之一,以表格的方式來儲存數據,提供給外界,即Content Provider可以跨進程訪問其他應用程序中的數據。用法是繼承ContentProvider,實現onCreate,query,update,insert,delete和getType方法,onCreate是負責創建時做一些初始化的工作,增刪查改的方法就是對數據的查詢和修改,getType是返回一個String,表示Uri請求的類型。注冊完後就可以使用ContentResolver去請求指定的Uri。
3.文件
  兩個進程可以到同一個文件去交換數據,我們不僅可以保存文本文件,還可以將對象持久化到文件,從另一個文件恢復。要注意的是,當並發讀/寫時可能會出現並發的問題。
4.Broadcast
  Broadcast可以向android系統中所有應用程序發送廣播,而需要跨進程通訊的應用程序可以監聽這些廣播。
5.AIDL方式
  Service和Content Provider類似,也可以訪問其他應用程序中的數據,Content Provider返回的是Cursor對象,而Service返回的是Java對象,這種可以跨進程通訊的服務叫AIDL服務。
AIDL通過定義服務端暴露的介面,以提供給客戶端來調用,AIDL使伺服器可以並行處理,而Messenger封裝了AIDL之後只能串列運行,所以Messenger一般用作消息傳遞。
6.Messenger
  Messenger是基於AIDL實現的,服務端(被動方)提供一個Service來處理客戶端(主動方)連接,維護一個Handler來創建Messenger,在onBind時返回Messenger的binder。
  雙方用Messenger來發送數據,用Handler來處理數據。Messenger處理數據依靠Handler,所以是串列的,也就是說,Handler接到多個message時,就要排隊依次處理。
7.Socket
  Socket方法是通過網路來進行數據交換,注意的是要在子線程請求,不然會堵塞主線程。客戶端和服務端建立連接之後即可不斷傳輸數據,比較適合實時的數據傳輸
二、Android線程間通信方式
  一般說線程間通信主要是指主線程(也叫UI線程)和子線程之間的通信,主要有以下兩種方式:
1.AsyncTask機制
  AsyncTask,非同步任務,也就是說在UI線程運行的時候,可以在後台的執行一些非同步的操作;AsyncTask可以很容易且正確地使用UI線程,AsyncTask允許進行後台操作,並在不顯示使用工作線程或Handler機制的情況下,將結果反饋給UI線程。但是AsyncTask只能用於短時間的操作(最多幾秒就應該結束的操作),如果需要長時間運行在後台,就不適合使用AsyncTask了,只能去使用Java提供的其他API來實現。
2.Handler機制
  Handler,繼承自Object類,用來發送和處理Message對象或Runnable對象;Handler在創建時會與當前所在的線程的Looper對象相關聯(如果當前線程的Looper為空或不存在,則會拋出異常,此時需要在線程中主動調用Looper.prepare()來創建一個Looper對象)。使用Handler的主要作用就是在後面的過程中發送和處理Message對象和讓其他的線程完成某一個動作(如在工作線程中通過Handler對象發送一個Message對象,讓UI線程進行UI的更新,然後UI線程就會在MessageQueue中得到這個Message對象(取出Message對象是由其相關聯的Looper對象完成的),並作出相應的響應)。
三、Android兩個子線程之間通信
  面試的過程中,有些面試官可能會問Android子線程之間的通信方式,由於絕大部分程序員主要關注的是Android主線程和子線程之間的通信,所以這個問題很容易讓人懵逼。
  主線程和子線程之間的通信可以通過主線程中的handler把子線程中的message發給主線程中的looper,或者,主線程中的handler通過post向looper中發送一個runnable。但looper默認存在於main線程中,子線程中沒有Looper,該怎麼辦呢?其實原理很簡單,把looper綁定到子線程中,並且創建一個handler。在另一個線程中通過這個handler發送消息,就可以實現子線程之間的通信了。
  子線程創建handler的兩種方式:
  方式一:給子線程創建Looper對象:
new Thread(new Runnable() {
public void run() {
Looper.prepare(); // 給這個Thread創建Looper對象,一個Thead只有一個Looper對象
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show();
}
};
handler.sendEmptyMessage(1);
Looper.loop(); // 不斷遍歷MessageQueue中是否有消息
};
}).start();
---------------------
方式二:獲取主線程的looper,或者說是UI線程的looper:
new Thread(new Runnable() {
public void run() {
Handler handler = new Handler(Looper.getMainLooper()){ // 區別在這!!!
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show();
}
};
handler.sendEmptyMessage(1);
};
}).start();

⑧ android 如何讓兩個apk相互通信

A.apk,B.apk都是我寫的.現在我想在B.apk里實現獲得A.apk的某控制項ID,並向其發送一個按鍵事件.如何實現,謝謝!也就是用B控制A.

這兩個apk 是在兩個進程里的,(或許可以配置成一個進程。不過如何直接操作這個沒有試過。)

所以一般的有兩種方法:
1、RPC
2、通過 BroadcastRecever 或 Service

第二種方法比較簡單一些。
比如B 控制 A的話,
A定義Service ,比如com.my.ServerA .自定義actionFilter 「com.my.serverA.action"
B中調用Intent it = newIntent("com.my.serverA.action");
it.putExtra(....);// 傳遞你的自定義控制指令。
B.startService(it);
在A中ServerA的 onStartService(Intent it) 。解析這個控制指令,做相應操作就可以了。

用BroadcastRecever 的道理一樣。

Aidl,android平台的IPC方式之一,基於系統的Ibinder機制。
網上大多數例子都是在一個apk下來測試調用service,現在我在兩個project下面來調用。
一個是server project,一個是client project
首先我們建立的是server project,這裡面要實現aidl文件和一個service,activity只是用來啟動service的,當然,你也可以通過發廣播的形式來啟動service。
首先看IAidlService.aidl文件:

Java代碼
package com.ds.server;
interface IAidlService {
int getType();
}

這樣在eclipse裡面自動編譯的時候會在gen下面生成IAidlService.java文件(燈下我們的client project要用)。
然後新建一個service,這個service裡面has a IAidlService的stub對象,service具體代碼如下:

Java代碼
package com.ds.server;

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

public class AidlService extends Service {

private IAidlService.Stub mBinder = new IAidlService.Stub() {

@Override
public int getType() throws RemoteException {
// TODO Auto-generated method stub
return 5;
}
};

private void Log(String str) {
Log.d("AidlService", "------ " + str + "------");
}

@Override
public void onCreate() {
Log("service create");
}

@Override
public void onStart(Intent intent, int startId) {
Log("service start id=" + startId);
}

@Override
public IBinder onBind(Intent t) {
Log("service on bind");
return mBinder;
}

@Override
public void onDestroy() {
Log("service on destroy");
super.onDestroy();
}

@Override
public boolean onUnbind(Intent intent) {
Log("service on unbind");
return super.onUnbind(intent);
}

public void onRebind(Intent intent) {
Log("service on rebind");
super.onRebind(intent);
}

}

這里一定要實現onBind方法,並返回一個IAidlService.Stub對象。
再去AndroidManifest.xml注冊這個service:

Xml代碼
<service
android:name=".AidlService"
android:enabled="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.ds.server.IAidlService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>

android:enabled="true"
android:process=":remote"這兩個標簽可有可無。
只要注冊了這個service就行。
好了,到此,服務端已經完成。

-------------------華麗的分割線-----------------------------------------

下面我們開始client project。
client project比較簡單,需要注意的地方是,首先需要把server project中gen文件夾中aidl生成的那個IAidlService.java類以及包都拷貝到我們的client project中。
(注意:client project的包名為com.ds.client;另外一個包名com.ds.server以及這個server包下面的IAidlService.java類都是從server project的gen文件夾拷貝過來的,至於gen文件夾的其他文件就不需要拷貝過來。)。
好了,這樣的話,client project只要從activity去遠程調用service就好了,實現代碼如下:

Java代碼
package com.ds.client;

import com.ds.server.IAidlService;

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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class AidlClientActivity extends Activity {

IAidlService iservice;

private ServiceConnection connection = new ServiceConnection() {

public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
// 從遠程service中獲得AIDL實例化對象
iservice = IAidlService.Stub.asInterface(service);
Log.i("Client","Bind Success:" + iservice);
}

public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
iservice = null;
Log.i("Client","onServiceDisconnected");
}
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TextView tv = (TextView) findViewById(R.id.tv);
Button bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);
if (iservice != null) {
try {
tv.setText("" + iservice.getType());
} catch (RemoteException e) {
e.printStackTrace();
}
}

}

});

}
}

注意幾點:
1,import com.ds.server.IAidlService;使用的是我們拷貝過來的IAidlService.java類
2,需要一個ServiceConnection對象
3,通過Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);來bind service。這樣就可以調用aidl中定義的介面來獲取service中的值了。

唉,由於在使用中沒有注意拷貝server project中gen文件夾下面的包和IAidlService.java,老是出現Unable to start service Intent這樣的錯誤。搞了好久。
附件是源碼。注意使用的時候,先要運行server project,啟動服務,然後再運行client project。

⑨ android 怎麼介面進行類間的通信

A寫個介面 B實現它就行了
例如 A類中有一個介面
然後
A類中

public interface LoginInputListener
{
void onLoginInputComplete(int one , int two ,int three,int four,int five,int six,int seven,boolean lunxun);
}

傳值
LoginInputListener listener = (LoginInputListener) getActivity();
listener.onLoginInputComplete(position1,position2,position3,xintiaoMin,xintiaoMax,huxiMin,huxiMax,lunxun);

B類
implements LoginInputListener

// 介面回調
@Override
public void onLoginInputComplete(int one, int two, int three, int four,
int five, int six, int seven, boolean lunxun) {

}

⑩ 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種經常用到,學習過程中要對沒種實現方式有一定的了解。

閱讀全文

與android介面通信相關的資料

熱點內容
網盤忘記解壓碼怎麼辦 瀏覽:852
文件加密看不到裡面的內容 瀏覽:651
程序員腦子里都想什麼 瀏覽:430
oppp手機信任app在哪裡設置 瀏覽:185
java地址重定向 瀏覽:268
一年級下冊摘蘋果的演算法是怎樣的 瀏覽:448
程序員出軌電視劇 瀏覽:88
伺服器系統地址怎麼查 瀏覽:54
解壓游戲發行官 瀏覽:601
國外小伙解壓實驗 瀏覽:336
頂級大學開設加密貨幣 瀏覽:437
java重載與多態 瀏覽:528
騰訊應屆程序員 瀏覽:942
一鍵編譯程序 瀏覽:129
語音加密包哪個好 瀏覽:340
有什麼學習高中語文的app 瀏覽:282
安卓手機的表格里怎麼打勾 瀏覽:411
阿里雲伺服器有網路安全服務嗎 瀏覽:969
超解壓兔子視頻 瀏覽:24
單片機怎麼測負脈沖 瀏覽:174