Android開發學習之路-該怎么學Android(Service和Activity通信為例)


在大部分地方,比如書本或者學校和培訓機構,教學Android的方式都基本類似,就是告訴先上原理方法,然后對着代碼講一下。

但是,這往往不是一個很好的方法,為什么?

① 學生要掌握這個方法的用途,只能通過記憶而不是理解

② 當某些原理稍微復雜的時候,通過講解是不能直接理解的,有時候下課回去了再看也不一定看得明白

③ 對英語文檔不夠重視,有問題先百度

本鳥自學Android一年,慢慢也學習到了很多的方法,如果你也是一個入門不久但是覺得很多東西都不明白的新手,希望本文對你有幫助。

我覺得要想學好Android有幾個重要的難點(注意這里不是四大組件也不是什么框架),就是:英語、文檔和Google。

假設我們要寫一個后台服務,在一個Activity中要控制這個服務,也就是要執行服務中的方法。當你知道這個問題之后你會怎么去解決它?

我相信有很多人會直接就就翻書本看,或者百度一下看看別人的代碼是怎么寫的然后復制粘貼完成任務。很多人都是這么解決問題的,為什么?因為在課堂上看到了這些代碼,但不一定記住了,所以知道課本或者百度會有答案。

看書本和百度有什么缺點么?

① 百度各種亂入的推廣,搜索技術問題會給你培訓推廣。所以百度的唯一用處基本就是查看自家網絡是否正常了。

② 看書本不是不好,但是書本始終是別人的,入門的話看看書本是有好處的,但是當需要解決問題的時候,書本不應該是第一想到的幫手。

③ 直接給出的代碼可能不會引起你注意一些細小的地方,很多時候,就是這些細小的地方導致我們卡在某個地方,到時候就只能怪當時沒有弄明白了。

 

在開始編碼之前,有幾個重要的問題我們要先解決:

① 找到可用的翻牆工具或者VPN,保證自己可以翻牆,因為無論是Google還是SDK升級還是Android Studio升級都需要

② 在SDK Manager中下載最新的API文檔,沒有這個你都可以不用學Android開發了,如下圖:

③ 打開Android Studio的文檔提示,在Eclipse中鼠標放在方法名上會有文檔提示,在AS中需要手動打開一下,如下圖:

④ 准備好你的翻譯工具

 

開始編碼:

① 我們都知道,要綁定一個服務,是要通過Context.bindService方法來做到的,如下圖

可以看到,這個方法需要三個參數,但是這三個參數有代表什么呢,假設我們都不懂,沒關系,我們不要百度,也不用翻書,直接把鼠標放在方法上,我們可以看到關於這個方法的文檔,如下所示:

 我們可以大致看看這個方法的介紹,明白它有什么用就可以了,比如當我們沒有獲得綁定服務的權限的時候會拋出異常,方法不能被廣播接收者調用等等。這里我們要注意的是Parameters和Returns這兩個地方。

Parameters指出了方法需要的參數分別是什么意思,有何要求,對於這個方法需要三個參數分別是Intent、ServiceConnection和flags:

service:一個可以被識別且要連接到的服務意圖,意圖可以由服務類名實例化或者邏輯描述實例化(使用action或者catagory等等)

conn:用來接收服務啟動或者停止的信息,必須要實現

flags:一個配置標記,可以是上面這些值,意思也很明了

Returns指出調用這個方法會返回的值,這里如果綁定成功會返回true,否則返回false

② 意圖我們是很容易構建出來的,不外乎寫一個類並繼承Service,然后通過顯式或者隱式調用的方法構建一個Intent對象,這里代碼暫時省略

③ 我們可以看到ServiceConnection的文檔如下:

可以看到ServiceConnection是一個接口,最后一句表示:跟系統中許多的回調一樣,子類的方法都會在主線程被調用,這里我們知道,我們不能給接口new一個對象,傳入bindService只能是接口的實現類,那么就需要我們寫一個類,來實現這個接口,代碼如下:

private class MyServiceConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
}

 我們可以看到這個接口中有兩個方法需要我們實現,那么這兩個方法有時什么意思呢,我們先看onServiceConnected,文檔如下:

可以看到,方法是在服務連接成功的時候回調的,並且回調時會把一個IBinder的子類返回來,在參數中我們也看到了這個信息,文檔還提示我們可以通過IBinder來調用服務的方法。

④ 我們回到服務的代碼中

public class MyService extends Service {
    private static final String TAG = "MyService";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    public void Method(){
        Log.d(TAG, "Method() called" + "");
    }

}

 Service類中有一個抽象方法onBind,我們需要實現,並且我們在服務中添加了一個叫做Method的方法,用來表示我們需要在Activity中調用的方法。接下來我們看看onBind的文檔:

文檔指出,我們在Activity中獲得的IBinder是在這個方法中返回的,既然這樣,我們就可以嘗試在Service中(為什么要在這里?)定義一個IBinder的子類,但是我們發現,IBinder接口中有很多方法需要實現,在文檔中我們也看到其實官方不推薦我們之間實現這個接口,而應該繼承IBinder的子類Binder:

完成之后,我們直接在onBind方法中返回一個Binder的子類,並且在Binder子類中新建方法calllMethod來調用服務的Method方法,所以整個Service的方法如下:

public class MyService extends Service {
    private static final String TAG = "MyService";

    public class MyBinder extends Binder{
        public void callMethod(){
            Method();
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    public void Method(){
        Log.d(TAG, "Method() called" + "");
    }

}

⑤ 因為這個時候,Service中的Binder對象已經被回調方法傳回了Activity中,所以我們可以在onServiceConnected中獲取得到,但是注意獲取到的是IBinder類型,我們需要強制類型轉換一下:

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
     mBinder = (MyService.MyBinder) service;
}

獲取到這個Binder之后,我們就可以調用里面的方法了。

 

官方文檔是開發最好的指導,可能你會覺得都是英文很難看懂,看到速度沒有百度一下來得爽快,但是要知道,我們掌握的技術如果要等到有中文的時候才能掌握,那你就不應該選擇IT行業了。而且如果不刻意鍛煉提高自己的英語水平,那你是基本告別GitHub、StackOverflow等等有用的網站了。上面的例子其實並沒有提到Google,但是,如果你試過被一個問題弄到崩潰的邊緣,但是把問題Google一下之后,發現Stackoverflow中已經有人遇到並且有大神回答了幫了你好一大個忙的時候,你就會明白為什么我不用百度了。其實道理也很簡單,Google是全世界開發者共同使用的,而百度,是部分中國開發者才會使用的!

最后說一下這個英語,其實本人英語也不是多好,有時候某些單詞還是得靠翻譯。但是,只要你開始強迫自己去閱讀英語文檔,慢慢的你會發現,有時候我們都不知道文檔內容的中文意思,但是卻明白文檔要我們怎么做,這個就是我們需要的最好的狀態,不要被母語束縛了,有心學什么都不難。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM