編輯:Android開發實例
通常每個應用程序都在它自己的進程內運行,但有時需要在進程間傳遞對象,你可以通過應用程序UI的方式寫個運行在一個不同的進程中的service。在android平台中,一個進程通常不能訪問其他進程中的內存區域。所以,他們需要把對象拆分成操作系統能理解的簡單形式,以便偽裝成對象跨越邊界訪問。編寫這種偽裝代碼相當的枯燥乏味,好在android為我們提供了AIDL工具可以來做這件事。
AIDL(android接口描述語言)是一個IDL語言,它可以生成一段代碼,可以使在一個android設備上運行的兩個進程使用內部通信進程進行交互。如果你需要在一個進程中(例如:在一個Activity中)訪問另一個進程中(例如:一個Service)某個對象的方法,你就可以使用AIDL來生成這樣的代碼來偽裝傳遞各種參數。
要使用AIDL,Service需要以aidl文件的方式提供服務接口,AIDL工具將生成一個相應的java接口,並且在生成的服務接口中包含一個功能調用的stub服務樁類。Service的實現類需要去繼承這個stub服務樁類。Service的onBind方法會返回實現類的對象,之後你就可以使用它了,參見下例:
先創建一個IMyRemoteService.aidl文件
package org.allin.android.remote;
interface IMusicControlService{
void play();
void stop();
void pause();
}
如果你正在使用eclipse的Android插件,則它會根據這個aidl文件生成一個Java接口類。生成的接口類中會有一個內部類Stub類,你要做的事就是去繼承該Stub類:
/**
* @author allin.dev
* http://allin.cnblogs.com/
*
*/
public class RemoteMusicService extends Service {
private static final String TAG = "RemoteMusicService";
private MediaPlayer mediaPlayer;
/*
* (non-Javadoc)
*
* @see android.app.Service#onBind(android.content.Intent)
*/
@Override
public IBinder onBind(Intent intent) {
return binder;
}
private final IMusicControlService.Stub binder = new IMusicControlService.Stub() {
@Override
public void stop() throws RemoteException {
Log.d(TAG,"stop....");
if (mediaPlayer != null) {
mediaPlayer.stop();
try {
// 在調用stop後如果需要再次通過start進行播放,需要之前調用prepare函數
mediaPlayer.prepare();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
@Override
public void play() throws RemoteException {
Log.d(TAG,"play....");
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(RemoteMusicService.this,
R.raw.tmp);
mediaPlayer.setLooping(false);
}
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
}
@Override
public void pause() throws RemoteException {
Log.d(TAG,"pause....");
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
};
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
if(mediaPlayer != null){
mediaPlayer.stop();
mediaPlayer.release();
}
}
}
當客戶端應用連接到這個Service時,onServiceConnected方法將被調用,客戶端就可以獲得IBinder對象。參看下面的客戶端onServiceConnected方法:
private ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
musicService = null;
Log.d(TAG, "in onServiceDisconnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
musicService = IMusicControlService.Stub.asInterface(service);
Log.d(TAG, "in onServiceConnected");
}
};
啟動後的界面如下
[源碼下載]
Android登錄實例
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
Android中的Service相關全面總結
1、Service的種類 按運行地點分類: 類別 區別 優點 缺點 應用 本地服務(Local) 該服務依附在主進程
Android本地化
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我
Android個人理財工具實例之一:項目概述與啟動界面的實現
從本文開始為大家制作一個Android個人理財工具,並把整個開發過程記錄下來,