{"id":1138,"date":"2022-04-20T11:20:03","date_gmt":"2022-04-20T03:20:03","guid":{"rendered":"http:\/\/www.max-shu.com\/blog\/?p=1138"},"modified":"2022-04-20T11:20:03","modified_gmt":"2022-04-20T03:20:03","slug":"android%e4%bd%bf%e7%94%a8messenger%e5%92%8csharedmemory%e5%ae%9e%e7%8e%b0%e8%b7%a8app%e7%9a%84%e6%b5%b7%e9%87%8f%e6%95%b0%e6%8d%ae%e4%bc%a0%e8%be%93","status":"publish","type":"post","link":"http:\/\/www.max-shu.com\/blog\/?p=1138","title":{"rendered":"Android\u4f7f\u7528Messenger\u548cSharedMemory\u5b9e\u73b0\u8de8app\u7684\u6d77\u91cf\u6570\u636e\u4f20\u8f93"},"content":{"rendered":"<div>\u00a0 \u00a0 Messenger\u662fandroid\u4e0b\u8f7b\u91cf\u7ea7\u7684\u8de8\u8fdb\u7a0b\u901a\u4fe1\u673a\u5236\uff0cSharedMemory\u53ef\u4ee5\u4f5c\u4e3aMessenger\u4e2dMessage\u7684Bundle\u6570\u636e\u6765\u53d1\u9001\uff0c\u4ece\u800c\u5b9e\u73b0\u6d77\u91cf\u6570\u636e\u4f20\u8f93\u3002<\/div>\n<div><\/div>\n<h3><strong>\u4e00\u3001\u76f4\u63a5\u4f7f\u7528SharedMemory\u65b9\u5f0f<\/strong><\/h3>\n<div><\/div>\n<div><strong>Server\u7aef\uff1a<\/strong><\/div>\n<div><strong>\u4e0b\u9762\u4e3aMessengerService\u7c7b\u7684\u4ee3\u7801\uff0c\u5728MainActivity\u91cc\u9762\u628a\u5b83\u542f\u52a8\u5373\u53ef\uff0c\u4e5f\u53ef\u4ee5\u5ba2\u6237\u7aefapp\u901a\u8fc7bindservice\u6765\u62c9\u8d77\u5b83\uff1a<\/strong><\/div>\n<div>package com.maxshu.messenger_sharedmemory;<\/div>\n<div><\/div>\n<div>import android.app.NotificationChannel;<\/div>\n<div>import android.app.NotificationManager;<\/div>\n<div>import android.app.Service;<\/div>\n<div>import android.content.Intent;<\/div>\n<div>import android.os.Bundle;<\/div>\n<div>import android.os.Handler;<\/div>\n<div>import android.os.IBinder;<\/div>\n<div>import android.os.Message;<\/div>\n<div>import android.os.Messenger;<\/div>\n<div>import android.os.RemoteException;<\/div>\n<div>import android.os.SharedMemory;<\/div>\n<div>import android.system.ErrnoException;<\/div>\n<div>import android.util.Log;<\/div>\n<div><\/div>\n<div>import java.nio.ByteBuffer;<\/div>\n<div><\/div>\n<div>import androidx.core.app.NotificationCompat;<\/div>\n<div><\/div>\n<div>public class MessengerService extends Service {<\/div>\n<div>private static final String TAG = &#8220;MessengerService&#8221;;<\/div>\n<div><\/div>\n<div>private MessengerHandler mHandler=new MessengerHandler();<\/div>\n<div>private Messenger mMessenger=new Messenger(mHandler);<\/div>\n<div><\/div>\n<div>public MessengerService() {<\/div>\n<div>Log.i(TAG,&#8221;MessengerService().&#8221;);<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>@Override<\/div>\n<div>public IBinder onBind(Intent intent) {<\/div>\n<div>Log.i(TAG,&#8221;onBind().&#8221;);<\/div>\n<div>return mMessenger.getBinder();<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>private static class MessengerHandler extends Handler {<\/div>\n<div>@Override<\/div>\n<div>public void handleMessage(Message msg) {<\/div>\n<div>super.handleMessage(msg);<\/div>\n<div>\/\/\u53d6\u51fa\u5ba2\u6237\u7aef\u7684\u6d88\u606f\u5185\u5bb9<\/div>\n<div>Bundle bundle = msg.getData();<\/div>\n<div>String clientMsg = bundle.getString(&#8220;client&#8221;);<\/div>\n<div>Log.i(TAG,&#8221;\u6765\u81ea\u5ba2\u6237\u7aef\u7684\u6d88\u606f\uff1a&#8221;+clientMsg);<\/div>\n<div><\/div>\n<div>\/\/\u901a\u8fc7SharedMemory\u5171\u4eab\u5185\u5b58\u5f97\u5230\u7684\u6570\u636e<\/div>\n<div>int sharedMemoryLen = bundle.getInt(&#8220;sharedmemory_len&#8221;);<\/div>\n<div>SharedMemory sharedMemory = bundle.getParcelable(&#8220;sharedmemory_data&#8221;);<\/div>\n<div>if (sharedMemory == null) {<\/div>\n<div>Log.i(TAG,&#8221;sharedMemory\u4e3a\u7a7a\u3002&#8221;);<\/div>\n<div>return;<\/div>\n<div>}<\/div>\n<div>try {<\/div>\n<div>ByteBuffer byteBuffer = sharedMemory.mapReadOnly();<\/div>\n<div>int len = byteBuffer.limit() &#8211; byteBuffer.position();<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: len:&#8221; + len);<\/div>\n<div>byte[] bytes = new byte[sharedMemoryLen];<\/div>\n<div>byteBuffer.get(bytes);<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: bytes[0]:&#8221; + bytes[0]);<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: bytes[0]:&#8221; + bytes[1]);<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: bytes[sharedMemoryLen-2]:&#8221; + bytes[sharedMemoryLen &#8211; 2]);<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: bytes[sharedMemoryLen-1]:&#8221; + bytes[sharedMemoryLen &#8211; 1]);<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: bytes.length:&#8221; + bytes.length);<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: sharedMemory:&#8221; + sharedMemory.toString());<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: sharedMemory.size:&#8221; + sharedMemory.getSize());<\/div>\n<div>\/\/\u4f7f\u7528\u5b8cunmap\u540c\u65f6close sharedMemory\u91ca\u653e\u5185\u5b58<\/div>\n<div>SharedMemory.unmap(byteBuffer);<\/div>\n<div>sharedMemory.close(); \/\/\u5bf9\u7aefcreate\uff0c\u672c\u7aef\u4f7f\u7528\u5b8cclose.<\/div>\n<div>}catch (ErrnoException e){<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory\u9519\u8bef\uff1a&#8221;);<\/div>\n<div>e.printStackTrace();<\/div>\n<div>return ;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>\/\/\u65b0\u5efa\u4e00\u4e2aMessage\u5bf9\u8c61\uff0c\u4f5c\u4e3a\u56de\u590d\u5ba2\u6237\u7aef\u7684\u5bf9\u8c61<\/div>\n<div>Message message = Message.obtain();<\/div>\n<div>Bundle bundle1 = new Bundle();<\/div>\n<div>bundle1.putString(&#8220;service&#8221;,&#8221;\u4eca\u5929\u5c31\u4e0d\u53bb\u4e86\uff0c\u8fd8\u6709\u5f88\u591a\u4e1c\u897f\u8981\u5b66\uff01\uff01&#8221;);<\/div>\n<div>message.setData(bundle1);<\/div>\n<div>try {<\/div>\n<div>msg.replyTo.send(message);<\/div>\n<div>Log.i(TAG,&#8221;\u53d1\u9001\u6d88\u606f\u5230\u5ba2\u6237\u7aef\u3002&#8221;);<\/div>\n<div>} catch (RemoteException e) {<\/div>\n<div>e.printStackTrace();<\/div>\n<div>}<\/div>\n<div>}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>@Override<\/div>\n<div>public void onCreate() {<\/div>\n<div>Log.i(TAG,&#8221;onCreate().&#8221;);<\/div>\n<div>super.onCreate();<\/div>\n<div>startForeground();<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>private void startForeground() {<\/div>\n<div>Log.i(TAG,&#8221;startForeground().&#8221;);<\/div>\n<div>String CHANNEL_ONE_ID = &#8220;com.maxshu.messenger_sharedmemory.channel&#8221;;<\/div>\n<div>String CHANNEL_ONE_NAME = &#8220;Channel One&#8221;;<\/div>\n<div>NotificationChannel notificationChannel = null;<\/div>\n<div>if (android.os.Build.VERSION.SDK_INT &gt;= android.os.Build.VERSION_CODES.O) {<\/div>\n<div>notificationChannel = new NotificationChannel(CHANNEL_ONE_ID,<\/div>\n<div>CHANNEL_ONE_NAME, NotificationManager.IMPORTANCE_DEFAULT);<\/div>\n<div>NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);<\/div>\n<div>assert manager != null;<\/div>\n<div>manager.createNotificationChannel(notificationChannel);<\/div>\n<div>startForeground(1, new NotificationCompat.Builder(this, CHANNEL_ONE_ID).build());<\/div>\n<div>}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>}<\/div>\n<div><\/div>\n<div><strong>Server\u7aef\u7684AndroidManifest.xml\uff1a<\/strong><\/div>\n<div>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<\/div>\n<div>&lt;manifest xmlns:android=&#8221;<a href=\"http:\/\/schemas.android.com\/apk\/res\/android\">http:\/\/schemas.android.com\/apk\/res\/android<\/a>&#8220;<\/div>\n<div>package=&#8221;com.maxshu.messenger_sharedmemory&#8221;&gt;<\/div>\n<div><\/div>\n<div>&lt;uses-permission android:name=&#8221;android.permission.FOREGROUND_SERVICE&#8221;\/&gt;<\/div>\n<div><\/div>\n<div>&lt;application<\/div>\n<div>android:allowBackup=&#8221;true&#8221;<\/div>\n<div>android:icon=&#8221;@mipmap\/ic_launcher&#8221;<\/div>\n<div>android:label=&#8221;@string\/app_name&#8221;<\/div>\n<div>android:roundIcon=&#8221;@mipmap\/ic_launcher_round&#8221;<\/div>\n<div>android:supportsRtl=&#8221;true&#8221;<\/div>\n<div>android:theme=&#8221;@style\/Theme.Messenger_SharedMemory&#8221;&gt;<\/div>\n<div>&lt;service<\/div>\n<div>android:name=&#8221;.MessengerService&#8221;<\/div>\n<div>android:enabled=&#8221;true&#8221;<\/div>\n<div>android:exported=&#8221;true&#8221;&gt;<\/div>\n<div>&lt;intent-filter&gt;<\/div>\n<div>&lt;action android:name=&#8221;android.intent.action.MESSENGER&#8221; \/&gt;<\/div>\n<div>&lt;\/intent-filter&gt;<\/div>\n<div>&lt;\/service&gt;<\/div>\n<div><\/div>\n<div>&lt;activity<\/div>\n<div>android:name=&#8221;.MainActivity&#8221;<\/div>\n<div>android:exported=&#8221;true&#8221;&gt;<\/div>\n<div>&lt;intent-filter&gt;<\/div>\n<div>&lt;action android:name=&#8221;android.intent.action.MAIN&#8221; \/&gt;<\/div>\n<div><\/div>\n<div>&lt;category android:name=&#8221;android.intent.category.LAUNCHER&#8221; \/&gt;<\/div>\n<div>&lt;\/intent-filter&gt;<\/div>\n<div>&lt;\/activity&gt;<\/div>\n<div>&lt;\/application&gt;<\/div>\n<div><\/div>\n<div>&lt;\/manifest&gt;<\/div>\n<div><\/div>\n<div><strong>Client\u7aef\uff1a<\/strong><\/div>\n<div><strong>client\u7aef\u901a\u8fc7bindservice\u8c03\u7528\u670d\u52a1\u7aef\u4ee3\u7801\u5373\u53ef\uff1a<\/strong><\/div>\n<div>package com.maxshu.messenger_sharedmemory_2;<\/div>\n<div><\/div>\n<div>import androidx.appcompat.app.AppCompatActivity;<\/div>\n<div><\/div>\n<div>import <a href=\"http:\/\/android.content.componentname\/\">android.content.ComponentName<\/a>;<\/div>\n<div>import android.content.Context;<\/div>\n<div>import android.content.Intent;<\/div>\n<div>import android.content.ServiceConnection;<\/div>\n<div>import android.os.Bundle;<\/div>\n<div>import android.os.Handler;<\/div>\n<div>import android.os.IBinder;<\/div>\n<div>import android.os.Message;<\/div>\n<div>import android.os.Messenger;<\/div>\n<div>import android.os.RemoteException;<\/div>\n<div>import android.os.SharedMemory;<\/div>\n<div>import android.system.ErrnoException;<\/div>\n<div>import android.system.OsConstants;<\/div>\n<div>import android.util.Log;<\/div>\n<div><\/div>\n<div>import java.nio.ByteBuffer;<\/div>\n<div><\/div>\n<div>public class MainActivity extends AppCompatActivity {<\/div>\n<div>private static final String TAG = &#8220;MainActivity&#8221;;<\/div>\n<div><\/div>\n<div>private Messenger mService;<\/div>\n<div>private GetRelyHandler mGetRelyHandler = new GetRelyHandler();<\/div>\n<div>private Messenger mRelyMessenger = new Messenger(mGetRelyHandler);<\/div>\n<div><\/div>\n<div>private ServiceConnection mConnection = new ServiceConnection() {<\/div>\n<div>@Override<\/div>\n<div>public void onServiceConnected(ComponentName name, IBinder service) {<\/div>\n<div>Log.i(TAG, &#8220;onServiceConnected.&#8221;);<\/div>\n<div>\/\/\u83b7\u53d6\u670d\u52a1\u7aef\u5173\u8054\u7684Messenger\u5bf9\u8c61<\/div>\n<div>mService = new Messenger(service);<\/div>\n<div>\/\/\u521b\u5efaMessage\u5bf9\u8c61<\/div>\n<div>Message message = Message.obtain();<\/div>\n<div>Bundle bundle = new Bundle();<\/div>\n<div>bundle.putString(&#8220;client&#8221;, &#8220;\u4eca\u5929\u51fa\u53bb\u73a9\u5417\uff1f&#8221;);<\/div>\n<div><\/div>\n<div>\/\/\u4f7f\u7528SharedMemory\u5171\u4eab\u5185\u5b58\u6765\u8de8app\u8fdb\u7a0b\u4f20\u8f93\u5927\u91cf\u6570\u636e<\/div>\n<div>byte[] bytes = new byte[1024*1024*4]; \/\/4MB<\/div>\n<div>bytes[0] = &#8216;a&#8217;;<\/div>\n<div>bytes[1] = &#8216;5&#8217;;<\/div>\n<div>bytes[1024*1024*4-2] = &#8216;5&#8217;;<\/div>\n<div>bytes[1024*1024*4-1] = &#8216;a&#8217;;<\/div>\n<div>try {<\/div>\n<div>SharedMemory sharedMemory = SharedMemory.create(&#8220;sharedmemory&#8221;, bytes.length);<\/div>\n<div>ByteBuffer buffer = sharedMemory.mapReadWrite();<\/div>\n<div>buffer.put(bytes);<\/div>\n<div>\/\/\u628asharedMemory\u6743\u9650\u8bbe\u7f6e\u4e3a\u53ea\u8bfb\uff0ccreate\u9ed8\u8ba4\u662f\u8bfb\u5199\u6743\u9650\u90fd\u6709\uff0c\u8fd9\u91cc\u53ef\u4ee5\u907f\u514d\u5ba2\u6237\u7aef\u66f4\u6539\u6570\u636e<\/div>\n<div>sharedMemory.setProtect(OsConstants.PROT_READ);<\/div>\n<div>\/\/\u4f7f\u7528\u5b8c\u9700\u8981unmap<\/div>\n<div>SharedMemory.unmap(buffer);<\/div>\n<div>bundle.putInt(&#8220;sharedmemory_len&#8221;, bytes.length);<\/div>\n<div>bundle.putParcelable(&#8220;sharedmemory_data&#8221;, sharedMemory);<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: bytes.length:&#8221;+bytes.length);<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: sharedMemory:&#8221;+sharedMemory.toString());<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory: sharedMemory.size:&#8221;+sharedMemory.getSize());<\/div>\n<div>}catch (ErrnoException e){<\/div>\n<div>Log.i(TAG, &#8220;sharedMemory\u9519\u8bef\uff1a&#8221;);<\/div>\n<div>e.printStackTrace();<\/div>\n<div>return;<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>\/\/\u8bbe\u7f6e\u6570\u636e\u5185\u5bb9<\/div>\n<div>message.setData(bundle);<\/div>\n<div>\/\/\u5728message\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u56de\u590dmRelyMessenger\u5bf9\u8c61<\/div>\n<div>message.replyTo = mRelyMessenger;<\/div>\n<div>try {<\/div>\n<div>mService.send(message);<\/div>\n<div>Log.i(TAG, &#8220;\u53d1\u9001\u6d88\u606f\u5230\u670d\u52a1\u5668\u7aef\u3002&#8221;);<\/div>\n<div>} catch (RemoteException e) {<\/div>\n<div>e.printStackTrace();<\/div>\n<div>}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>@Override<\/div>\n<div>public void onServiceDisconnected(ComponentName name) {<\/div>\n<div>Log.i(TAG, &#8220;onServiceDisconnected.&#8221;);<\/div>\n<div>mService = null;<\/div>\n<div>}<\/div>\n<div>};<\/div>\n<div><\/div>\n<div>public static class GetRelyHandler extends Handler {<\/div>\n<div>@Override<\/div>\n<div>public void handleMessage(Message msg) {<\/div>\n<div>super.handleMessage(msg);<\/div>\n<div>Bundle bundle = msg.getData();<\/div>\n<div>String serviceMsg = bundle.getString(&#8220;service&#8221;);<\/div>\n<div>Log.i(TAG, &#8220;\u6765\u81ea\u670d\u52a1\u7aef\u7684\u56de\u590d\uff1a&#8221; + serviceMsg);<\/div>\n<div>}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>@Override<\/div>\n<div>protected void onCreate(Bundle savedInstanceState) {<\/div>\n<div>super.onCreate(savedInstanceState);<\/div>\n<div>setContentView(R.layout.activity_main);<\/div>\n<div><\/div>\n<div>\/\/\u542f\u52a8\u670d\u52a1\u7aef\u7684MessengerService<\/div>\n<div>Intent intent = new Intent();<\/div>\n<div>\/\/\u548c\u670d\u52a1\u7aefAndroidManifest.xml\u7684MessengerServiceService\u7684intent-filter\u7684Action name\u4fdd\u6301\u4e00\u81f4\uff1a<\/div>\n<div>intent.setAction(&#8220;android.intent.action.MESSENGER&#8221;);<\/div>\n<div>intent.setPackage(&#8220;com.maxshu.messenger_sharedmemory&#8221;); \/\/\u670d\u52a1\u7aef\u7684\u5305\u540d<\/div>\n<div>\/\/\u542f\u52a8\u670d\u52a1\uff0c\u5982\u679c\u670d\u52a1\u7aefService\u6ca1\u6709\u542f\u52a8\uff0c\u5219\u81ea\u52a8\u62c9\u8d77<\/div>\n<div>boolean rtn = bindService(intent, mConnection, Context.BIND_AUTO_CREATE);<\/div>\n<div>if(rtn){<\/div>\n<div>Log.i(TAG, &#8220;\u542f\u52a8\u670d\u52a1\u7aefMessengerService\u6210\u529f\u3002&#8221;);<\/div>\n<div>}else {<\/div>\n<div>Log.i(TAG, &#8220;\u542f\u52a8\u670d\u52a1\u7aefMessengerService\u5931\u8d25\u3002&#8221;);<\/div>\n<div>}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div>@Override<\/div>\n<div>protected void onDestroy() {<\/div>\n<div>super.onDestroy();<\/div>\n<div>\/\/\u6ce8\u9500\u7ed1\u5b9a<\/div>\n<div>unbindService(mConnection);<\/div>\n<div>}<\/div>\n<div>}<\/div>\n<div><\/div>\n<div><strong>Client\u7aef\u7684AndroidManifest.xml\uff1a<\/strong><\/div>\n<div>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<\/div>\n<div>&lt;manifest xmlns:android=&#8221;<a href=\"http:\/\/schemas.android.com\/apk\/res\/android\">http:\/\/schemas.android.com\/apk\/res\/android<\/a>&#8220;<\/div>\n<div>package=&#8221;com.maxshu.messenger_sharedmemory_2&#8243;&gt;<\/div>\n<div><\/div>\n<div>&lt;!&#8211;Android11\u4e4b\u540e\uff0c\u5fc5\u987b\u52a0\u5165\u8be5queries\u6761\u76ee\uff0c\u624d\u80fd\u62c9\u8d77\u5176\u4ed6app\u7684Service &#8211;&gt;<\/div>\n<div>&lt;queries&gt;<\/div>\n<div>&lt;package android:name=&#8221;com.maxshu.messenger_sharedmemory&#8221; \/&gt;<\/div>\n<div>&lt;\/queries&gt;<\/div>\n<div><\/div>\n<div>&lt;application<\/div>\n<div>android:allowBackup=&#8221;true&#8221;<\/div>\n<div>android:icon=&#8221;@mipmap\/ic_launcher&#8221;<\/div>\n<div>android:label=&#8221;@string\/app_name&#8221;<\/div>\n<div>android:roundIcon=&#8221;@mipmap\/ic_launcher_round&#8221;<\/div>\n<div>android:supportsRtl=&#8221;true&#8221;<\/div>\n<div>android:theme=&#8221;@style\/Theme.Messenger_SharedMemory&#8221;&gt;<\/div>\n<div>&lt;activity<\/div>\n<div>android:name=&#8221;.MainActivity&#8221;<\/div>\n<div>android:exported=&#8221;true&#8221;&gt;<\/div>\n<div>&lt;intent-filter&gt;<\/div>\n<div>&lt;action android:name=&#8221;android.intent.action.MAIN&#8221; \/&gt;<\/div>\n<div><\/div>\n<div>&lt;category android:name=&#8221;android.intent.category.LAUNCHER&#8221; \/&gt;<\/div>\n<div>&lt;\/intent-filter&gt;<\/div>\n<div>&lt;\/activity&gt;<\/div>\n<div>&lt;\/application&gt;<\/div>\n<div><\/div>\n<div>&lt;\/manifest&gt;<\/div>\n<div><\/div>\n<h3><strong>\u4e8c\u3001\u95f4\u63a5\u4f7f\u7528Binder\u65b9\u5f0f\uff08\u5e95\u5c42\u5b9e\u73b0\u4e5f\u662f\u7528\u7684\u5171\u4eab\u5185\u5b58\u65b9\u5f0f\uff09<\/strong><\/h3>\n<div>\u00a0\u00a0 \u00a0\u4f7f\u7528Binder\u8c03\u7528\u4f20\u56fe\uff0c\u662f\u5f80Intent\u91cc\u585e\u4e86\u4e2aBinder\u5bf9\u8c61\uff0c\u7b49\u5230\u53e6\u4e00\u4e2a\u7ec4\u4ef6\u542f\u52a8\u4e4b\u540e\uff0c\u8bfb\u51fa\u8fd9\u4e2aBinder\u5bf9\u8c61\uff0c\u8c03\u7528\u5b83\u7684getBitmap\u51fd\u6570\u62ff\u5230Bitmap\u3002<\/div>\n<div>\u6ce8\u610f\u4e0b\uff0cputBinder \u65b9\u5f0f \u53ea\u5728Android 4.3 \uff08api 18\uff09\u53ca\u4ee5\u4e0a\u624d\u6709\uff0c\u6240\u4ee5\u6211\u4eec\u505a\u4e0b\u5224\u65ad\u3002<\/div>\n<div><\/div>\n<div><strong>\u53d1\u9001\u7aef\uff1a<\/strong><\/div>\n<div>private void ipcBitmapBinder() {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Intent intent = new Intent(this, SecondActivity.class);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Bundle bundle = new Bundle();<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.JELLY_BEAN_MR2) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0bundle.putBinder(&#8220;bitmap&#8221;, new ImageBinder(mBitmap));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0intent.putExtras(bundle);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0startActivity(intent);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div><strong>\u63a5\u6536\u7aef\uff1a<\/strong><\/div>\n<div>Bundle bundle = getIntent().getExtras();<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (bundle != null) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.JELLY_BEAN_MR2) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ImageBinder imageBinder = (ImageBinder) bundle.getBinder(&#8220;bitmap&#8221;);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Bitmap bitmap = imageBinder.getBitmap();<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mTv.setText(String.format((&#8220;bitmap\u5927\u5c0f\u4e3a%dkB&#8221;), bitmap.getByteCount() \/ 1024));<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mIv.setImageBitmap(bitmap);<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div><\/div>\n<div>ImageBinder \u662f\u4e2a\u7ee7\u627f\u81eaBinder\u7684\u7c7b\uff0c\u63d0\u4f9b\u83b7\u53d6\u56fe\u7247\u7684\u65b9\u5f0f\uff1a<\/div>\n<div>class ImageBinder extends Binder {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0private Bitmap bitmap;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0public ImageBinder(Bitmap bitmap) {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.bitmap = bitmap;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0Bitmap getBitmap() {<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return bitmap;<\/div>\n<div>\u00a0\u00a0\u00a0\u00a0}<\/div>\n<div>}<\/div>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u00a0 \u00a0 Messenger\u662fandroid\u4e0b\u8f7b\u91cf\u7ea7\u7684\u8de8\u8fdb\u7a0b\u901a\u4fe1\u673a\u5236\uff0cSharedMemory\u53ef\u4ee5\u4f5c\u4e3aMesse &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[394,867,865,866],"class_list":["post-1138","post","type-post","status-publish","format-standard","hentry","category-linuxandroid","tag-android","tag-binder","tag-messenger","tag-sharedmemory"],"views":2697,"_links":{"self":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1138"}],"version-history":[{"count":1,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1138\/revisions"}],"predecessor-version":[{"id":1139,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1138\/revisions\/1139"}],"wp:attachment":[{"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1138"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.max-shu.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}