編輯:關於Android編程
在過去的技術中,Corba可以實現跨進程的調用;在Java技術中,RMI也可以實現跨進程的調用;在Android中類似可以使用AIDL服務跨進程調用Service。
Android的遠程Service調用與Java的RMI基本相似,一樣都是先定義一個遠程調用接口,然後為該接口提供一個實現類即可。與RMI不同的是,客戶端訪問Service時,Android並不是直接返回Service對象給客戶端。
在Android中綁定本地Service時,返回的是一個IBinder對象;而訪問遠程Service時,是將IBinder的代理返回給客戶端,當客戶端獲得IBinder對象的代理後,就可以通過IBinder對象去回調遠程Service的屬性和方法了。
示例如下:
創建AIDL文件:
AIDL:指Android Interface Definition Language
注意:AIDL定義接口的源代碼必須以.aidl結尾;
AIDL接口中用到的數據類型,除了基本類型、String、List 、Map、CharSequence之外,其他類型都需要導包,即使在同一包中也需導包。
在Service端和客戶端都需要為該接口提供實現。使用ADT工具進行開發,會自動為AIDL接口生成實現。
這是AIDL源代碼的一個簡單例子:
[java]
package com.lovo.service;
interface IMessage{
int getFlag();
String getMessage(String msg);
}
package com.lovo.service;
interface IMessage{
int getFlag();
String getMessage(String msg);
}自動生成的AIDL實現,在此不給出。
遠程的Service:
[java]
package com.lovo.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class RemoteService extends Service {
@Override
public IBinder onBind(Intent intent) {
MyMessage message = new MyMessage();
return message;
}
}
package com.lovo.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class RemoteService extends Service {
@Override
public IBinder onBind(Intent intent) {
MyMessage message = new MyMessage();
return message;
}
}
MyMessage類(IMessage的實現類):
[java]
package com.lovo.service;
public class MyMessage extends IMessage.Stub {
@Override
public int getFlag() {
return 100;
}
@Override
public String getMessage(String msg) {
return msg + "Android!";
}
}
package com.lovo.service;
public class MyMessage extends IMessage.Stub {
@Override
public int getFlag() {
return 100;
}
@Override
public String getMessage(String msg) {
return msg + "Android!";
}
}
客戶端的Activity:
[java]
package com.lovo.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.lovo.conn.RemoteServiceConnection;
import com.lovo.lesson10.R;
public class StartRemoteActivity extends Activity {
private Button startServiceBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.remote_main);
startServiceBtn = (Button) findViewById(R.id.remote_main_btn_startserver);
startServiceBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.lovo.service.REMOTE_SERVICE");
bindService(intent, new RemoteServiceConnection(),
BIND_AUTO_CREATE);
}
});
}
}
package com.lovo.activity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.lovo.conn.RemoteServiceConnection;
import com.lovo.lesson10.R;
public class StartRemoteActivity extends Activity {
private Button startServiceBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.remote_main);
startServiceBtn = (Button) findViewById(R.id.remote_main_btn_startserver);
startServiceBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.lovo.service.REMOTE_SERVICE");
bindService(intent, new RemoteServiceConnection(),
BIND_AUTO_CREATE);
}
});
}
}
客戶端的ServiceConnection的實現類(RemoteServiceConnection):
[java]
package com.lovo.conn;
import com.lovo.service.IMessage;
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class RemoteServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 將遠程的代理對象轉換成真實對象
IMessage message = IMessage.Stub.asInterface(service);
try {
Log.i("訪問遠程方法:",
message.getFlag() + " " + message.getMessage("I like "));
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
package com.lovo.conn;
import com.lovo.service.IMessage;
import android.content.ComponentName;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class RemoteServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 將遠程的代理對象轉換成真實對象
IMessage message = IMessage.Stub.asInterface(service);
try {
Log.i("訪問遠程方法:",
message.getFlag() + " " + message.getMessage("I like "));
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
布局文件只有一個按鈕在此省略不寫。本文只是簡單地調用了遠程的方法,在實際中可以使用AIDL傳遞復雜數據。
前言相信大家都知道,當使用AppCompatEditText(Edit Text)時,默認的下劃線是跟隨系統的#FF4081的顏色值的,通過改變這個值可以改變所有的顏色樣
一、網絡爬蟲的基本知識網絡爬蟲通過遍歷互聯網絡,把網絡中的相關網頁全部抓取過來,這體現了爬的概念。爬蟲如何遍歷網絡呢,互聯網可以看做是一張大圖,每個頁面看做其中的一個節點
生命周期流程圖: 注:Activity生命周期void onCreate()* Activity已經被創建完畢void onStart()* Activity已
閒來無事,總結了兩個自定義的ProgressDialog,大家可以參考下,根據自己需要進行選擇修改:實現效果:示例1:示例2: 代碼如下:MainA
測試環境: win7 64 g++ 4.8.1 /*