android多進(jìn)程及AIDL簡單使用

正常情況下宿崭,一個apk啟動后只會運(yùn)行在一個進(jìn)程中,其進(jìn)程名為AndroidManifest.xml文件中指定的應(yīng)用包名汹桦,所有的基本組件都會在這個進(jìn)程中運(yùn)行朽合。但是如果需要將某些組件(如Service、Activity等)運(yùn)行在單獨(dú)的進(jìn)程中扔水,就需要用到Android:process屬性了痛侍。我們可以為android的基礎(chǔ)組件指定process屬性來指定它們運(yùn)行在指定進(jìn)程中。

有什么好處

一般來說魔市,Android應(yīng)用多進(jìn)程有三個好處主届。
1)我們知道Android系統(tǒng)對每個應(yīng)用進(jìn)程的內(nèi)存占用是有限制的,而且占用內(nèi)存越大的進(jìn)程待德,通常被系統(tǒng)殺死的可能性越大君丁。讓一個組件運(yùn)行在單獨(dú)的進(jìn)程中,可以減少主進(jìn)程所占用的內(nèi)存将宪,降低被系統(tǒng)殺死的概率.
2)如果子進(jìn)程因?yàn)槟撤N原因崩潰了绘闷,不會直接導(dǎo)致主程序的崩潰,可以降低我們程序的崩潰率较坛。
3)即使主進(jìn)程退出了印蔗,我們的子進(jìn)程仍然可以繼續(xù)工作,假設(shè)子進(jìn)程是推送服務(wù)丑勤,在主進(jìn)程退出的情況下华嘹,仍然能夠保證用戶可以收到推送消息。

怎么來實(shí)現(xiàn)

對process屬性的設(shè)置有兩種形式:
第一種形式如 android:process=":remote"法竞,以冒號開頭除呵,冒號后面的字符串原則上是可以隨意指定的。如果我們的包名為“com.example.processtest”爪喘,則實(shí)際的進(jìn)程名為“com.example.processtest:remote”颜曾。這種設(shè)置形式表示該進(jìn)程為當(dāng)前應(yīng)用的私有進(jìn)程,其他應(yīng)用的組件不可以和它跑在同一個進(jìn)程中秉剑。
第二種情況如 android:process="com.example.processtest.remote"泛豪,以小寫字母開頭,表示運(yùn)行在一個以這個名字命名的全局進(jìn)程中侦鹏,其他應(yīng)用通過設(shè)置相同的ShareUID可以和它跑在同一個進(jìn)程诡曙。

有哪些陷阱

其實(shí)開啟應(yīng)用內(nèi)多進(jìn)程會有一些陷阱,稍微不注意就會陷入其中略水。我們首先要明確的一點(diǎn)是進(jìn)程間的內(nèi)存空間是不可見的价卤。從而,開啟多進(jìn)程后渊涝,我們需要面臨這樣幾個問題:
1)Application的多次重建慎璧。
2)靜態(tài)成員的失效床嫌。
3)文件共享問題。
4)斷點(diǎn)調(diào)試問題胸私。

下面介紹一下AIDL

Android 兩個進(jìn)程之間無法直接通信厌处,只能通過系統(tǒng)底層間接通信
能實(shí)現(xiàn)這些功能的有AIDL、Binder岁疼、Messenger

AIDL是什么阔涉,就是Android Interface Description Language,Android接口定義語言

AIDL Binder Messenger之間的區(qū)別

分類 IPC(進(jìn)程間通信) 多線程 多個應(yīng)用程序
AIDL 支持IPC 支持多線程 支持多個應(yīng)用程序
Binder 只有IPC 沒有多線程 支持多個應(yīng)用程序
Messenger 只有IPC 沒有多線程 不支持多個應(yīng)用程序

下面展示一下AIDL的使用方法捷绒,模擬遠(yuǎn)程計算功能

1.首先在main下創(chuàng)建一個AIDL文件夾

554A730B-1843-469A-8C87-3CB2F5702FB3.png

2.然后在aidl文件夾中創(chuàng)建aidl文件

創(chuàng)建完aidl文件后都需要build一下

00C41F23-8376-41F6-B912-30EF0078CA49.png
499DEB71-10E5-4A87-BF15-A2071A0669C1.png

3.創(chuàng)建一個service給其他進(jìn)程(app)使用

AIDL實(shí)質(zhì)就是使用service服務(wù)
注意:不要忘了在manifest定義,并且聲明他的進(jìn)程瑰排,如下

<service android:name=".service.IRemoteService"
            android:process=":aidl">
            <intent-filter>
                <action android:name="action.aidl"/>
            </intent-filter>
        </service>

注意:這里添加了一個intent-filter,這是因?yàn)樵诓煌瑧?yīng)用程序之間使用aidl時暖侨,如果沒有intent-filter凶伙,會找不到service,此intent-filter就是為了能夠讓雙方建立聯(lián)系它碎。


C014D03A-291E-4405-AA9F-7F9EA80564FF.png

public class IRemoteService extends Service {

    /**
     * 當(dāng)用戶綁定到該服務(wù)時會 執(zhí)行
     * @param intent
     * @return
     */
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }

    //實(shí)現(xiàn)AIDL文件ITest的接口函荣,并生成iBinder供用戶綁定使用
    private IBinder iBinder= new ITest.Stub() {
        @Override
        public int add(int num1, int num2) throws RemoteException {
            Log.d("TAG", "已收到遠(yuǎn)程發(fā)送的數(shù)據(jù):num1=" + num1 + ";num2=" + num2);
            return num1+num2;
        }
    };
}

4.新建一個ClientModuel以新建一個進(jìn)程模擬用戶,原來的app模擬服務(wù)器

同樣的方法新建一個AIDL文件夾扳肛,在這之下新建一個文件夾傻挂,文件夾名需要和服務(wù)端的一樣(非常重要),將同一個aidl拷貝到該目錄下挖息,build一下

E1C46F82-3FB0-46E3-875C-C8B7306C08C0.png

5.實(shí)現(xiàn)遠(yuǎn)程計算功能

在client的MainActivity中綁定遠(yuǎn)程服務(wù)

public class MainActivity extends AppCompatActivity {

    TextView tvSum;
    EditText et1;
    EditText et2;
    Button btn;

    ITest iTest;

    private ServiceConnection connection=new ServiceConnection() {
        //綁定上服務(wù)的時候
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //拿到遠(yuǎn)程服務(wù)
            iTest=ITest.Stub.asInterface(service);
        }
        //斷開服務(wù)的時候
        @Override
        public void onServiceDisconnected(ComponentName name) {
            //回收資源
            iTest=null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWidget();

        //軟件一啟動就綁定服務(wù)
        bindService();
    }

    private void bindService() {
        Intent intent=new Intent();
        intent.setComponent(new ComponentName("com.johnson.todo","com.johnson.todo.service.IRemoteService"));//第一個參數(shù)包名金拒,第二個參數(shù)文件名
        bindService(intent,connection, BIND_AUTO_CREATE);
    }

    private void initWidget() {
        tvSum = (TextView) findViewById(R.id.tv_sum);
        et1 = (EditText) findViewById(R.id.et_1);
        et2 = (EditText) findViewById(R.id.et_2);
        btn= (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                add();
            }
        });
    }

    public void add(){
        int num1 = Integer.parseInt(et1.getText().toString());
        int num2 = Integer.parseInt(et2.getText().toString());

        try {
            int sum = iTest.add(num1, num2);
            tvSum.setText(sum+"");
        } catch (RemoteException e) {
            e.printStackTrace();
            tvSum.setText("RemoteException:"+e.toString());
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);
    }
}

6.最終效果

add.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市套腹,隨后出現(xiàn)的幾起案子绪抛,更是在濱河造成了極大的恐慌,老刑警劉巖电禀,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幢码,死亡現(xiàn)場離奇詭異,居然都是意外死亡尖飞,警方通過查閱死者的電腦和手機(jī)症副,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來政基,“玉大人贞铣,你說我怎么就攤上這事【诿鳎” “怎么了辕坝?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長荐健。 經(jīng)常有香客問我酱畅,道長琳袄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任圣贸,我火速辦了婚禮挚歧,結(jié)果婚禮上扛稽,老公的妹妹穿的比我還像新娘吁峻。我一直安慰自己,他們只是感情好在张,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布用含。 她就那樣靜靜地躺著,像睡著了一般帮匾。 火紅的嫁衣襯著肌膚如雪啄骇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天瘟斜,我揣著相機(jī)與錄音缸夹,去河邊找鬼。 笑死螺句,一個胖子當(dāng)著我的面吹牛虽惭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蛇尚,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼芽唇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了取劫?” 一聲冷哼從身側(cè)響起匆笤,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谱邪,沒想到半個月后炮捧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惦银,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年寓盗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璧函。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡傀蚌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蘸吓,到底是詐尸還是另有隱情善炫,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布库继,位于F島的核電站箩艺,受9級特大地震影響窜醉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艺谆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一榨惰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧静汤,春花似錦琅催、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抹估,卻和暖如春缠黍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背药蜻。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工瓷式, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人语泽。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓贸典,卻偏偏與公主長得像,于是被迫代替她去往敵國和親湿弦。 傳聞我的和親對象是個殘疾皇子瓤漏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,099評論 25 707
  • Jianwei's blog 首頁 分類 關(guān)于 歸檔 標(biāo)簽 巧用Android多進(jìn)程,微信颊埃,微博等主流App都在用...
    justCode_閱讀 5,915評論 1 23
  • 在上一篇Window里提及過IPC蔬充,本篇將詳細(xì)總結(jié)IPC,知識點(diǎn)如下: IPC基礎(chǔ)及概念多進(jìn)程模式序列化Seria...
    厘米姑娘閱讀 8,088評論 17 29
  • 每日一句:光努力是沒有用的班利,學(xué)會用平臺優(yōu)勢放大自己的努力饥漫。 健康狀況:送外賣(QQ計步14711步),生姜泡腳(驅(qū)...
    I楓林渡閱讀 868評論 0 1
  • 2008年之前罗标,我一直待在一個小縣城里面庸队。受到周圍環(huán)境的影響,上學(xué)也只是跟完成任務(wù)一樣闯割。所學(xué)的內(nèi)容也僅限于課本中的...
    c396267624d0閱讀 162評論 0 0