ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划 (四)

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

原创 Linux操作系统 作者:broadviewbj 时间:2012-10-31 09:23:39 11 删除 编辑
 接着,我们就来看Client端的实现。Client端是一个Activity,实现在src/shy/luo/ashmem/Client.java文件中:

  1. package shy.luo.ashmem;  
  2.   
  3. import java.io.FileDescriptor;  
  4. import java.io.IOException;  
  5.   
  6. import shy.luo.ashmem.R;  
  7. import android.app.Activity;  
  8. import android.content.Intent;  
  9. import android.os.Bundle;  
  10. import android.os.MemoryFile;  
  11. import android.os.ParcelFileDescriptor;  
  12. import android.os.ServiceManager;  
  13. import android.os.RemoteException;  
  14. import android.util.Log;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18. import android.widget.EditText;  
  19.   
  20. public class Client extends Activity implements OnClickListener {  
  21.     private final static String LOG_TAG = "shy.luo.ashmem.Client";  
  22.       
  23.     IMemoryService memoryService = null;  
  24.     MemoryFile memoryFile = null;  
  25.       
  26.     private EditText valueText = null;  
  27.     private Button readButton = null;  
  28.     private Button writeButton = null;  
  29.     private Button clearButton = null;  
  30.       
  31.         @Override  
  32.         public void onCreate(Bundle savedInstanceState) {  
  33.             super.onCreate(savedInstanceState);  
  34.             setContentView(R.layout.main);  
  35.   
  36.         IMemoryService ms = getMemoryService();  
  37.         if(ms == null) {          
  38.                 startService(new Intent("shy.luo.ashmem.server"));  
  39.         } else {  
  40.             Log.i(LOG_TAG, "Memory Service has started.");  
  41.         }  
  42.   
  43.             valueText = (EditText)findViewById(R.id.edit_value);  
  44.             readButton = (Button)findViewById(R.id.button_read);  
  45.             writeButton = (Button)findViewById(R.id.button_write);  
  46.             clearButton = (Button)findViewById(R.id.button_clear);  
  47.   
  48.         readButton.setOnClickListener(this);  
  49.             writeButton.setOnClickListener(this);  
  50.             clearButton.setOnClickListener(this);  
  51.           
  52.             Log.i(LOG_TAG, "Client Activity Created.");  
  53.         }  
  54.   
  55.         @Override  
  56.         public void onResume() {  
  57.         super.onResume();  
  58.   
  59.         Log.i(LOG_TAG, "Client Activity Resumed.");  
  60.         }  
  61.   
  62.         @Override  
  63.         public void onPause() {  
  64.         super.onPause();  
  65.   
  66.         Log.i(LOG_TAG, "Client Activity Paused.");  
  67.         }  
  68.       
  69.         @Override  
  70.         public void onClick(View v) {  
  71.             if(v.equals(readButton)) {  
  72.                 int val = 0;  
  73.               
  74.                 MemoryFile mf = getMemoryFile();  
  75.                 if(mf != null) {  
  76.                 try {  
  77.                         byte[] buffer = new byte[4];  
  78.                         mf.readBytes(buffer, 0, 0, 4);  
  79.                   
  80.                         val = (buffer[0] << 24) | ((buffer[1] & 0xFF) << 16) | ((buffer[2] & 0xFF) << 8) | (buffer[3] & 0xFF);  
  81.                 } catch(IOException ex) {  
  82.                     Log.i(LOG_TAG, "Failed to read bytes from memory file.");  
  83.                     ex.printStackTrace();  
  84.                 }  
  85.                 }     
  86.               
  87.                 String text = String.valueOf(val);  
  88.                 valueText.setText(text);  
  89.             } else if(v.equals(writeButton)) {  
  90.                 String text = valueText.getText().toString();  
  91.                 int val = Integer.parseInt(text);  
  92.               
  93.                 IMemoryService ms = getMemoryService();  
  94.                 if(ms != null) {  
  95.                 try {  
  96.                         ms.setValue(val);  
  97.                 } catch(RemoteException ex) {  
  98.                     Log.i(LOG_TAG, "Failed to set value to memory service.");  
  99.                     ex.printStackTrace();  
  100.                 }  
  101.                 }  
  102.             } else if(v.equals(clearButton)) {  
  103.                 String text = "";  
  104.                 valueText.setText(text);  
  105.             }  
  106.         }  
  107.       
  108.         private IMemoryService getMemoryService() {  
  109.             if(memoryService != null) {  
  110.                 return memoryService;  
  111.             }  
  112.           
  113.             memoryService = IMemoryService.Stub.asInterface(  
  114.                             ServiceManager.getService("AnonymousSharedMemory"));  
  115.   
  116.         Log.i(LOG_TAG, memoryService != null ? "Succeed to get memeory service." : "Failed to get memory service.");  
  117.           
  118.             return memoryService;  
  119.         }  
  120.       
  121.         private MemoryFile getMemoryFile() {  
  122.             if(memoryFile != null) {  
  123.                 return memoryFile;  
  124.             }  
  125.               
  126.             IMemoryService ms = getMemoryService();  
  127.             if(ms != null) {  
  128.             try {  
  129.                     ParcelFileDescriptor pfd = ms.getFileDescriptor();  
  130.                 if(pfd == null) {  
  131.                     Log.i(LOG_TAG, "Failed to get memory file descriptor.");  
  132.                     return null;  
  133.                 }  
  134.   
  135.                 try {  
  136.                     FileDescriptor fd = pfd.getFileDescriptor();  
  137.                     if(fd == null) {  
  138.                         Log.i(LOG_TAG, "Failed to get memeory file descriptor.");  
  139.                         return null;                        
  140.                     }     
  141.   
  142.                         memoryFile = new MemoryFile(fd, 4, "r");  
  143.                 } catch(IOException ex) {  
  144.                     Log.i(LOG_TAG, "Failed to create memory file.");  
  145.                     ex.printStackTrace();  
  146.                 }  
  147.                 } catch(RemoteException ex) {  
  148.                 Log.i(LOG_TAG, "Failed to get file descriptor from memory service.");  
  149.                 ex.printStackTrace();  
  150.             }  
  151.         }  
  152.           
  153.             return memoryFile;  
  154.         }  
  155. }  
  1. package shy.luo.ashmem;  
  2.   
  3. import java.io.FileDescriptor;  
  4. import java.io.IOException;  
  5.   
  6. import shy.luo.ashmem.R;  
  7. import android.app.Activity;  
  8. import android.content.Intent;  
  9. import android.os.Bundle;  
  10. import android.os.MemoryFile;  
  11. import android.os.ParcelFileDescriptor;  
  12. import android.os.ServiceManager;  
  13. import android.os.RemoteException;  
  14. import android.util.Log;  
  15. import android.view.View;  
  16. import android.view.View.OnClickListener;  
  17. import android.widget.Button;  
  18. import android.widget.EditText;  
  19.   
  20. public class Client extends Activity implements OnClickListener {  
  21.     private final static String LOG_TAG = "shy.luo.ashmem.Client";  
  22.       
  23.     IMemoryService memoryService = null;  
  24.     MemoryFile memoryFile = null;  
  25.       
  26.     private EditText valueText = null;  
  27.     private Button readButton = null;  
  28.     private Button writeButton = null;  
  29.     private Button clearButton = null;  
  30.       
  31.         @Override  
  32.         public void onCreate(Bundle savedInstanceState) {  
  33.             super.onCreate(savedInstanceState);  
  34.             setContentView(R.layout.main);  
  35.   
  36.         IMemoryService ms = getMemoryService();  
  37.         if(ms == null) {          
  38.                 startService(new Intent("shy.luo.ashmem.server"));  
  39.         } else {  
  40.             Log.i(LOG_TAG, "Memory Service has started.");  
  41.         }  
  42.   
  43.             valueText = (EditText)findViewById(R.id.edit_value);  
  44.             readButton = (Button)findViewById(R.id.button_read);  
  45.             writeButton = (Button)findViewById(R.id.button_write);  
  46.             clearButton = (Button)findViewById(R.id.button_clear);  
  47.   
  48.         readButton.setOnClickListener(this);  
  49.             writeButton.setOnClickListener(this);  
  50.             clearButton.setOnClickListener(this);  
  51.           
  52.             Log.i(LOG_TAG, "Client Activity Created.");  
  53.         }  
  54.   
  55.         @Override  
  56.         public void onResume() {  
  57.         super.onResume();  
  58.   
  59.         Log.i(LOG_TAG, "Client Activity Resumed.");  
  60.         }  
  61.   
  62.         @Override  
  63.         public void onPause() {  
  64.         super.onPause();  
  65.   
  66.         Log.i(LOG_TAG, "Client Activity Paused.");  
  67.         }  
  68.       
  69.         @Override  
  70.         public void onClick(View v) {  
  71.             if(v.equals(readButton)) {  
  72.                 int val = 0;  
  73.               
  74.                 MemoryFile mf = getMemoryFile();  
  75.                 if(mf != null) {  
  76.                 try {  
  77.                         byte[] buffer = new byte[4];  
  78.                         mf.readBytes(buffer, 0, 0, 4);  
  79.                   
  80.                         val = (buffer[0] << 24) | ((buffer[1] & 0xFF) << 16) | ((buffer[2] & 0xFF) << 8) | (buffer[3] & 0xFF);  
  81.                 } catch(IOException ex) {  
  82.                     Log.i(LOG_TAG, "Failed to read bytes from memory file.");  
  83.                     ex.printStackTrace();  
  84.                 }  
  85.                 }     
  86.               
  87.                 String text = String.valueOf(val);  
  88.                 valueText.setText(text);  
  89.             } else if(v.equals(writeButton)) {  
  90.                 String text = valueText.getText().toString();  
  91.                 int val = Integer.parseInt(text);  
  92.               
  93.                 IMemoryService ms = getMemoryService();  
  94.                 if(ms != null) {  
  95.                 try {  
  96.                         ms.setValue(val);  
  97.                 } catch(RemoteException ex) {  
  98.                     Log.i(LOG_TAG, "Failed to set value to memory service.");  
  99.                     ex.printStackTrace();  
  100.                 }  
  101.                 }  
  102.             } else if(v.equals(clearButton)) {  
  103.                 String text = "";  
  104.                 valueText.setText(text);  
  105.             }  
  106.         }  
  107.       
  108.         private IMemoryService getMemoryService() {  
  109.             if(memoryService != null) {  
  110.                 return memoryService;  
  111.             }  
  112.           
  113.             memoryService = IMemoryService.Stub.asInterface(  
  114.                             ServiceManager.getService("AnonymousSharedMemory"));  
  115.   
  116.         Log.i(LOG_TAG, memoryService != null ? "Succeed to get memeory service." : "Failed to get memory service.");  
  117.           
  118.             return memoryService;  
  119.         }  
  120.       
  121.         private MemoryFile getMemoryFile() {  
  122.             if(memoryFile != null) {  
  123.                 return memoryFile;  
  124.             }  
  125.               
  126.             IMemoryService ms = getMemoryService();  
  127.             if(ms != null) {  
  128.             try {  
  129.                     ParcelFileDescriptor pfd = ms.getFileDescriptor();  
  130.                 if(pfd == null) {  
  131.                     Log.i(LOG_TAG, "Failed to get memory file descriptor.");  
  132.                     return null;  
  133.                 }  
  134.   
  135.                 try {  
  136.                     FileDescriptor fd = pfd.getFileDescriptor();  
  137.                     if(fd == null) {  
  138.                         Log.i(LOG_TAG, "Failed to get memeory file descriptor.");  
  139.                         return null;                        
  140.                     }     
  141.   
  142.                         memoryFile = new MemoryFile(fd, 4, "r");  
  143.                 } catch(IOException ex) {  
  144.                     Log.i(LOG_TAG, "Failed to create memory file.");  
  145.                     ex.printStackTrace();  
  146.                 }  
  147.                 } catch(RemoteException ex) {  
  148.                 Log.i(LOG_TAG, "Failed to get file descriptor from memory service.");  
  149.                 ex.printStackTrace();  
  150.             }  
  151.         }  
  152.           
  153.             return memoryFile;  
  154.         }  
  155. }  
        Client端的界面主要包含了三个按钮Read、Write和Clear,以及一个用于显示内容的文本框。

        这个Activity在onCreate时,会通过startService接口来启动我们前面定义的Server进程。调用startService时,需要指定要启动的服务的名称,这里就是"shy.luo.ashmem.server"了,后面我们会在程序的描述文件AndroidManifest.xml看到前面的Server类是如何和名称"shy.luo.ashmem.server"关联起来的。关于调用startService函数来启动自定义服务的过程,可以参考Android系统在新进程中启动自定义服务过程(startService)的原理分析一文。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13164110/viewspace-747974/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-02-22

  • 博文量
    1029
  • 访问量
    1730629