多進程就是多個進程的意思,那麼什麼是進程呢?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來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。