Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划 (三)

 有了Binder进程间通信接口之后,接下来就是要在Server端实现一个本地服务了。这里,Server端实现的本地服务名为MemoryService,实现在src/shy/luo/ashmem/MemoryService.java文件中:

 

[java] view plain copy print ?
  1. package shy.luo.ashmem;  
  2.   
  3. import java.io.FileDescriptor;  
  4. import java.io.IOException;  
  5.   
  6. import android.os.Parcel;  
  7. import android.os.MemoryFile;  
  8. import android.os.ParcelFileDescriptor;  
  9. import android.util.Log;  
  10.   
  11. public class MemoryService extends IMemoryService.Stub {  
  12.     private final static String LOG_TAG = "shy.luo.ashmem.MemoryService";  
  13.     private MemoryFile file = null;  
  14.       
  15.     public MemoryService() {  
  16.         try {  
  17.                         file = new MemoryFile("Ashmem"4);  
  18.                         setValue(0);  
  19.                 }  
  20.                 catch(IOException ex) {  
  21.                         Log.i(LOG_TAG, "Failed to create memory file.");  
  22.                         ex.printStackTrace();  
  23.                 }  
  24.     }  
  25.   
  26.     public ParcelFileDescriptor getFileDescriptor() {  
  27.         Log.i(LOG_TAG, "Get File Descriptor.");  
  28.   
  29.         ParcelFileDescriptor pfd = null;  
  30.   
  31.         try {  
  32.             pfd = file.getParcelFileDescriptor();  
  33.         } catch(IOException ex) {  
  34.             Log.i(LOG_TAG, "Failed to get file descriptor.");  
  35.             ex.printStackTrace();  
  36.         }  
  37.   
  38.         return pfd;  
  39.     }  
  40.       
  41.     public void setValue(int val) {  
  42.         if(file == null) {  
  43.             return;  
  44.         }  
  45.   
  46.         byte[] buffer = new byte[4];     
  47.         buffer[0] = (byte)((val >>> 24) & 0xFF);  
  48.         buffer[1] = (byte)((val >>> 16) & 0xFF);  
  49.         buffer[2] = (byte)((val >>> 8) & 0xFF);   
  50.         buffer[3] = (byte)(val & 0xFF);  
  51.           
  52.         try {  
  53.             file.writeBytes(buffer, 004);  
  54.             Log.i(LOG_TAG, "Set value " + val + " to memory file. ");  
  55.         }  
  56.         catch(IOException ex) {  
  57.             Log.i(LOG_TAG, "Failed to write bytes to memory file.");  
  58.             ex.printStackTrace();  
  59.         }  
  60.     }  
  61. }  
[java] view plain copy print ?
  1. package shy.luo.ashmem;  
  2.   
  3. import java.io.FileDescriptor;  
  4. import java.io.IOException;  
  5.   
  6. import android.os.Parcel;  
  7. import android.os.MemoryFile;  
  8. import android.os.ParcelFileDescriptor;  
  9. import android.util.Log;  
  10.   
  11. public class MemoryService extends IMemoryService.Stub {  
  12.     private final static String LOG_TAG = "shy.luo.ashmem.MemoryService";  
  13.     private MemoryFile file = null;  
  14.       
  15.     public MemoryService() {  
  16.         try {  
  17.                         file = new MemoryFile("Ashmem"4);  
  18.                         setValue(0);  
  19.                 }  
  20.                 catch(IOException ex) {  
  21.                         Log.i(LOG_TAG, "Failed to create memory file.");  
  22.                         ex.printStackTrace();  
  23.                 }  
  24.     }  
  25.   
  26.     public ParcelFileDescriptor getFileDescriptor() {  
  27.         Log.i(LOG_TAG, "Get File Descriptor.");  
  28.   
  29.         ParcelFileDescriptor pfd = null;  
  30.   
  31.         try {  
  32.             pfd = file.getParcelFileDescriptor();  
  33.         } catch(IOException ex) {  
  34.             Log.i(LOG_TAG, "Failed to get file descriptor.");  
  35.             ex.printStackTrace();  
  36.         }  
  37.   
  38.         return pfd;  
  39.     }  
  40.       
  41.     public void setValue(int val) {  
  42.         if(file == null) {  
  43.             return;  
  44.         }  
  45.   
  46.         byte[] buffer = new byte[4];     
  47.         buffer[0] = (byte)((val >>> 24) & 0xFF);  
  48.         buffer[1] = (byte)((val >>> 16) & 0xFF);  
  49.         buffer[2] = (byte)((val >>> 8) & 0xFF);   
  50.         buffer[3] = (byte)(val & 0xFF);  
  51.           
  52.         try {  
  53.             file.writeBytes(buffer, 004);  
  54.             Log.i(LOG_TAG, "Set value " + val + " to memory file. ");  
  55.         }  
  56.         catch(IOException ex) {  
  57.             Log.i(LOG_TAG, "Failed to write bytes to memory file.");  
  58.             ex.printStackTrace();  
  59.         }  
  60.     }  
  61. }  
package shy.luo.ashmem;

import java.io.FileDescriptor;
import java.io.IOException;

import android.os.Parcel;
import android.os.MemoryFile;
import android.os.ParcelFileDescriptor;
import android.util.Log;

public class MemoryService extends IMemoryService.Stub {
	private final static String LOG_TAG = "shy.luo.ashmem.MemoryService";
	private MemoryFile file = null;
	
	public MemoryService() {
		try {
                        file = new MemoryFile("Ashmem", 4);
                        setValue(0);
                }
                catch(IOException ex) {
                        Log.i(LOG_TAG, "Failed to create memory file.");
                        ex.printStackTrace();
                }
	}

	public ParcelFileDescriptor getFileDescriptor() {
		Log.i(LOG_TAG, "Get File Descriptor.");

		ParcelFileDescriptor pfd = null;

		try {
			pfd = file.getParcelFileDescriptor();
		} catch(IOException ex) {
			Log.i(LOG_TAG, "Failed to get file descriptor.");
			ex.printStackTrace();
		}

		return pfd;
	}
	
	public void setValue(int val) {
		if(file == null) {
			return;
		}

		byte[] buffer = new byte[4];   
		buffer[0] = (byte)((val >>> 24) & 0xFF);
		buffer[1] = (byte)((val >>> 16) & 0xFF);
		buffer[2] = (byte)((val >>> 8) & 0xFF); 
		buffer[3] = (byte)(val & 0xFF);
		
		try {
			file.writeBytes(buffer, 0, 0, 4);
			Log.i(LOG_TAG, "Set value " + val + " to memory file. ");
		}
		catch(IOException ex) {
			Log.i(LOG_TAG, "Failed to write bytes to memory file.");
			ex.printStackTrace();
		}
	}
}

        注意,这里的MemoryService类实现了IMemoryService.Stub类,表示这是一个Binder服务的本地实现。在构造函数中,通过指定文件名和文件大小来创建了一个匿名共享内存文件,即创建MemoryFile的一个实例,并保存在类成员变量file中。这个匿名共享内存文件名为"Ashmem",大小为4个节字,刚好容纳一个整数,我们这里举的例子就是要说明如果创建一个匿名共享内存来在两个进程间实现共享一个整数了。当然,在实际应用中,可以根据需要创建合适大小的共享内存来共享有意义的数据。

 

        这里还实现了IMemoryService.Stub的两个接口getFileDescriptor和setVal,一个用来获取匿名共享内存文件的文件描述符,一个来往匿名共享内存文件中写入一个整数,其中,接口getFileDescriptor的返回值是一个ParcelFileDescriptor。在Java中,是用FileDescriptor类来表示一个文件描述符的,而ParcelFileDescriptor是用来序列化FileDescriptor的,以便在进程间调用时传输。
        定义好本地服务好,就要定义一个Server来启动这个服务了。这里定义的Server实现在src/shy/luo/ashmem/Server.java文件中:

 

[java] view plain copy print ?
  1. package shy.luo.ashmem;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7. import android.os.ServiceManager;  
  8.   
  9. public class Server extends Service {  
  10.     private final static String LOG_TAG = "shy.luo.ashmem.Server";  
  11.   
  12.     private MemoryService memoryService = null;  
  13.   
  14.     @Override  
  15.     public IBinder onBind(Intent intent) {  
  16.         return null;  
  17.     }  
  18.   
  19.     @Override  
  20.     public void onCreate() {  
  21.     Log.i(LOG_TAG, "Create Memory Service...");  
  22.   
  23.     memoryService = new MemoryService();  
  24.   
  25.         try {  
  26.             ServiceManager.addService("AnonymousSharedMemory", memoryService);  
  27.             Log.i(LOG_TAG, "Succeed to add memory service.");  
  28.         } catch (RuntimeException ex) {  
  29.             Log.i(LOG_TAG, "Failed to add Memory Service.");  
  30.             ex.printStackTrace();  
  31.         }  
  32.   
  33.     }  
  34.   
  35.     @Override  
  36.     public void onStart(Intent intent, int startId) {  
  37.         Log.i(LOG_TAG, "Start Memory Service.");  
  38.     }  
  39.   
  40.     @Override  
  41.     public void onDestroy() {  
  42.     Log.i(LOG_TAG, "Destroy Memory Service.");  
  43.     }  
  44. }  
[java] view plain copy print ?
  1. package shy.luo.ashmem;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7. import android.os.ServiceManager;  
  8.   
  9. public class Server extends Service {  
  10.     private final static String LOG_TAG = "shy.luo.ashmem.Server";  
  11.   
  12.     private MemoryService memoryService = null;  
  13.   
  14.     @Override  
  15.     public IBinder onBind(Intent intent) {  
  16.         return null;  
  17.     }  
  18.   
  19.     @Override  
  20.     public void onCreate() {  
  21.     Log.i(LOG_TAG, "Create Memory Service...");  
  22.   
  23.     memoryService = new MemoryService();  
  24.   
  25.         try {  
  26.             ServiceManager.addService("AnonymousSharedMemory", memoryService);  
  27.             Log.i(LOG_TAG, "Succeed to add memory service.");  
  28.         } catch (RuntimeException ex) {  
  29.             Log.i(LOG_TAG, "Failed to add Memory Service.");  
  30.             ex.printStackTrace();  
  31.         }  
  32.   
  33.     }  
  34.   
  35.     @Override  
  36.     public void onStart(Intent intent, int startId) {  
  37.         Log.i(LOG_TAG, "Start Memory Service.");  
  38.     }  
  39.   
  40.     @Override  
  41.     public void onDestroy() {  
  42.     Log.i(LOG_TAG, "Destroy Memory Service.");  
  43.     }  
  44. }  
package shy.luo.ashmem;

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

public class Server extends Service {
    private final static String LOG_TAG = "shy.luo.ashmem.Server";

    private MemoryService memoryService = null;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
	Log.i(LOG_TAG, "Create Memory Service...");

	memoryService = new MemoryService();

        try {
            ServiceManager.addService("AnonymousSharedMemory", memoryService);
            Log.i(LOG_TAG, "Succeed to add memory service.");
        } catch (RuntimeException ex) {
            Log.i(LOG_TAG, "Failed to add Memory Service.");
            ex.printStackTrace();
        }

    }

    @Override
    public void onStart(Intent intent, int startId) {
        Log.i(LOG_TAG, "Start Memory Service.");
    }

    @Override
    public void onDestroy() {
	Log.i(LOG_TAG, "Destroy Memory Service.");
    }
}

你可能感兴趣的:(移动开发)