Android系統匿名共享記憶體Ashmem(Anonymous Shared Memory)簡要介紹和學習計劃 (四)

broadviewbj發表於2012-10-31
 接著,我們就來看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, 004);  
  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, 004);  
  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部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-747974/,如需轉載,請註明出處,否則將追究法律責任。

相關文章