多进程就是多个进程的意思,那么什么是进程呢?java
当一个应用在开始运行时,系统会为它建立一个进程,一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名。android
进程的特色:缓存
根据上边的引言和进程的特色能够看出,使用多进程的场景为:须要使apk所使用的内存限制扩大。安全
按优先级能够分为五类,优先级从高到低排列:多线程
Android多进程建立很简单,只须要在AndroidManifest.xml的声明四大组件的标签中增长”android:process”属性便可。命名以后,就成了一个单独的进程。app
process分私有进程和全局进程:ide
<service android:name=".MusicService" android:process=":musicservice"/>
<service android:name=".MusicService" android:process="com.trampcr.musicdemo.service"/>
为了节省系统内存,在退出该Activity的时候能够将其杀掉(若是没有人为杀掉该进程,在程序彻底退出时该进程会被系统杀掉)。ui
多进程被建立好了,应用运行时就会对进程进行初始化,若是一个application中有多个进程,在进行全局初始化时,多进程会被初始化屡次。this
解决办法:判断当前进程,而后作相应的初始化操做。spa
IPC:InterProcess Communication,即进程间通讯。
咱们知道,同一个进程的多个线程是共享该进程的全部资源,但多个进程间内存是不可见的,也就是说多个进程间内存是不共享的。那么进程间是如何进行通讯的呢?
Android中提供了三种方法:
如需让服务与远程进程通讯,则可以使用Messenger为服务提供接口。
定义一个MessengerService继承自Service,并在AndroidManifest.xml中声明并给一个进程名,使该服务成为一个单独的进程。代码以下:
MessengerService.java
public class MessengerService extends Service{ class IncomingHandler extends Handler{ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 0: Toast.makeText(getApplicationContext(), "hello, trampcr", Toast.LENGTH_SHORT).show(); break; } } } Messenger mMessenger = new Messenger(new IncomingHandler()); @Nullable @Override public IBinder onBind(Intent intent) { Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); return mMessenger.getBinder(); } }
AndroidManifest.xml文件的配置以下:
<service android:name=".MessengerService" android:process="com.trampcr.messenger.service"/>
MessengerActivity.java
public class MessengerActivity extends Activity{ private boolean mBound; private Messenger mMessenger; private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mMessenger = new Messenger(service); mBound = true; } @Override public void onServiceDisconnected(ComponentName name) { mMessenger = null; mBound = false; } }; public void sayHello(View v){ if(!mBound){ return; } Message msg = Message.obtain(null, 0 , 0, 0); try { mMessenger.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_messenger); } @Override protected void onStart() { super.onStart(); Intent intent = new Intent(MessengerActivity.this, MessengerService.class); bindService(intent, mServiceConnection, BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); if(mBound){ unbindService(mServiceConnection); mBound = false; } } }
经过以上代码,能够看到Messenger的使用方法:
这样,客户端并无调用服务的“方法”。而客户端传递的“消息”(Message对象)是服务在其Handler中接收的。
以上代码实现的应用,刚打开会弹出一个binding,binding表示打开应用Activity就经过Messenger链接了一个服务进程,而后点击say hello会弹出hello,trampcr,这表示了Activity经过Messenger将Message发送给了服务进程。以下图:
AIDL是一种接口描述语言,一般用于进程间通讯。
使用AIDL的步骤:
interface IMyAidlInterface { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString); String getName(String nickName); }
以上是咱们本身建立的aidl文件,系统还会自动生成aidl代码,所在位置为:build/generated/source/aidl下debug和release,可是此时debug下没有任何东西,能够rebuild或运行一下程序,再次打开debug,发现生成了一个包和一个aidl文件。
public class AIDLService extends Service { IMyAidlInterface.Stub mStub = new IMyAidlInterface.Stub() { @Override public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException { } @Override public String getName(String nickName) throws RemoteException { return "aidl " + nickName; } }; @Nullable @Override public IBinder onBind(Intent intent) { return mStub; } }
<service android:name=".AIDLService" android:process="com.aidl.test.service"/>
public class MainActivity extends AppCompatActivity { private Button mBtnAidl; private IMyAidlInterface mIMyAidlInterface; ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtnAidl = (Button) findViewById(R.id.btn_aidl); bindService(new Intent(MainActivity.this, AIDLService.class), mServiceConnection, BIND_AUTO_CREATE); mBtnAidl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mIMyAidlInterface != null){ try { String name = mIMyAidlInterface.getName("I'm nick"); Toast.makeText(MainActivity.this, "name = " + name, Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); } } } }); } }
在Activity中利用bindService与AIDLService进行链接,经过IMyAidlInterface实例与AIDLService进程进行通讯,以下图所示:
Parcelable code generate:自动生成实现了Parcelable接口的对象。
做者:trampcr连接:https://www.jianshu.com/p/ce1e35c84134來源:简书著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。