天天看點

Android面經-基礎篇(持續更新...)

前言:順序是按照郭霖先生<第二行代碼>的書籍目錄進行的,可以前往圖靈社群購買正版支援,但如果覺得還貴一點,可以百度搜尋下載下傳盜版看的(但都希望哥們可以支援正版,畢竟電子版跟紙質版也不貴)

Activity A啟動Activity B經曆的生命周期順序

探究的源碼:關于探究Avctivity與Fragment的生命周期源碼-CSDN下載下傳

開啟的方法

btClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                Log.i("xx","intent執行前前前前");
                startActivity(intent);
                Log.i("xx","intent執行之後");
            }
        });
           
Android面經-基礎篇(持續更新...)

加上finish()方法

Button btClick = (Button) findViewById(R.id.bt_click);
        btClick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                Log.i("xx","intent執行前前前前");
                startActivity(intent);
                finish();
                Log.i("xx","intent執行之後");
                // finish();放來這裡也是一樣的,finish()不是立刻執行的,都是按照生命周期走的
            }
        });
           
Android面經-基礎篇(持續更新...)

關于Activity的幾篇好文章:

1.深入了解Activity的生命周期 - 簡書

2.Android開發:5分鐘解析Activity&Fragment生命周期 - 簡書

3.Activity的生命周期 - CSDN部落格

4.Android中Activity資料的儲存和恢複 - 簡書

5.Android-Activity所應該了解的大概就這樣。(上) - 簡書

關于第四篇Activity中的作者觀點

當我還沒有自學Android時,玩着一些APP就會産生一個疑問,比如我在一個輸入框中輸入了大量文字沒有送出或者儲存。此時來了一個電話,如果退回的時候,輸入框裡面的文字消失了,那我可能會砸了電話,是以這個儲存資料的操作,是Android開發者做的嗎?

然而是不需要的,因為Android的View本身自己就實作了onSaveInstanceState方法,這些控件自己就具有儲存臨時資料和恢複臨時資料的能力。

作者:MeloDev

來源連結:http://www.jianshu.com/p/6622434511f7

個人了解:

Android面經-基礎篇(持續更新...)

其實就是EditText等View控件具有暫時儲存臨時資料的功能(其中視訊中的是Home傳回桌面,并非是我們按傳回鍵傳回的)-這裡對于沒有走onDestroy()方法而言的,如果走onDestroy()方法就需要自己儲存資料了

在這裡,總結一下個人對資料存取的了解:

  • 臨時資料使用onSaveInstanceState儲存恢複,永久性資料使用onPause方法儲存。
  • 1.由于EditText以及TextView等View元件内部都實作了onSaveInstanceState()方法,具備一些臨時的、非永久資料存儲并進行恢複.不需要考慮不走onDestroy()方法,,比如Home回到桌面再回來以及接個電話再回來的情況(這裡先排除由于記憶體不夠被殺死的情況,下面會提及),View元件都會儲存資料的
  • 2.針對由于記憶體不夠被殺死的情況(在onPause()或者onStop()方法就被殺死,即非正常死亡),這樣的話系統就會調用Activity的onSaveInstanceState()方法,那麼我們就需要在此重寫這個方法進行儲存資料,然後在onCreate()方法進行恢複

    PS:Activity的onSaveInstanceState(Bundle)方法在按Home鍵以及螢幕鎖屏時候會走(注意該方法名字onSaveInstanceState(Bundle,PersistableBundle)不會走,其實我個人覺得就是怕記憶體不夠被殺死才會使用onSaveInstanceState(Bundle)這個方法的

//在MainActivity中添加如下代碼就可以将臨時資料進行儲存:
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    String tempData = "Something you just typed";
    outState.putString("data_key", tempData);
}

/*資料是已經儲存下來了,那麼我們應該在哪裡進行恢複呢?細心的你
也許早就發現,我們一直使用的onCreate()方法其實也有一個Bundle類型的
參數。這個參數在一般情況下都是null,但是如果在活動被系統回收之前有通
過onSaveInstanceState()方法來儲存資料的話,這個參數就會帶有之前所
儲存的全部資料,我們隻需要再通過相應的取值方法将資料取出即可。
修改MainActivity的onCreate()方法,如下所示:*/
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate");
    setContentView(R.layout.activity_main);
    if (savedInstanceState != null) {
        String tempData = savedInstanceState.getString("data_key");
        Log.d(TAG, tempData);
    }
    ...
}
           
  • 3.永久性資料使用onPause方法儲存,我們可以進行一些輕量級的存儲資料和去初始化的工作,不能太耗時,因為在跳轉Activity時隻有當一個Activity執行完了onPause方法後另一個Activity才會啟動,而且android中指定如果onPause在500ms即0.5秒内沒有執行完畢的話就會強制關閉Activity。
  • 4.對于重量級的暫時還沒有找到很好的合适辦法!!!

Activity中啟動Fragment的生命周期順序

源碼:關于探究Avctivity與Fragment的生命周期源碼-CSDN下載下傳

1.在MainActivity中定義的fragment

<fragment
            android:id="@+id/top_fragment"
            android:name="com.example.yueyue.myapplication.RightFragment"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"/>
           

執行的生命周期如下

Android面經-基礎篇(持續更新...)

PS:這裡值得注意的是最後兩個方法:

I/xx: RightFragment onStart…

I/xx: MainActivity onStart

I/xx: MainActivity onResume

I/xx: RightFragment onResume…

2.在動态添加frament

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

        Log.i("xx",TAG+" onCreate");
        initView();


    }

    //在MainActivity中onCreate調用initView方法的
    private void initView() {
        fr_container = (FrameLayout) findViewById(R.id.fr_container);
        bt_click = (Button) findViewById(R.id.bt_click);
        bt_click.setOnClickListener(this);

        //MainActivity走了onResume,RightFragment才走onResume
        relaceFrgment(new RightFragment());
    }

   //開啟一個Fragment
    private void relaceFrgment(Fragment fragment) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction tr = fm.beginTransaction();
        tr.replace(R.id.fr_container, fragment);
//        tr.commitAllowingStateLoss();
        tr.commit();
    }
           

PS:這裡值得注意的是最後兩個方法(這裡的方法不值得參照,隻想引出下面的小總結而已):

Android面經-基礎篇(持續更新...)

小總結:無論動态添加還是靜态xml添加的fragment,順序都是

RightFragment onStart -> MainActivity onStart -> MainActivity onResume -> RightFragment onResume

3.Frgament替換Frgament的生命周期方法

private static int type = ;

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_click://使用Button開啟Fragment
                relaceFrgment(type++);

                break;
        }
    }

    private void relaceFrgment(int type) {
        if (type %  == ) {
            relaceFrgment(new RightFragment());
        } else {
            relaceFrgment(new AnotherRightFragment());
        }
    }

    private void relaceFrgment(Fragment fragment) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction tr = fm.beginTransaction();
        tr.replace(R.id.fr_container, fragment);
//        tr.commitAllowingStateLoss();
        tr.commit();
    }
           
Android面經-基礎篇(持續更新...)

I/xx: RightFragment 構造方法走了…

I/xx: RightFragment onAttach走了…

I/xx: RightFragment onCreate走了…

I/xx: RightFragment onCreateView走了…

I/xx: RightFragment onActivityCreated…

I/xx: RightFragment onStart…

I/xx: RightFragment onResume…

I/xx: AnotherRightFragment 構造方法走了…

I/xx: AnotherRightFragment onAttach走了…

I/xx: AnotherRightFragment onCreate走了…

I/xx: RightFragment onPause…

I/xx: RightFragment onStop…

I/xx: RightFragment onDestroyView…

I/xx: RightFragment onDestroy…

I/xx: RightFragment onDetach…

I/xx: AnotherRightFragment onCreateView走了…

I/xx: AnotherRightFragment onActivityCreated…

I/xx: AnotherRightFragment onStart…

I/xx: AnotherRightFragment onResume…

PS: Frgament替換Frgament跟Activity開啟另外一個Activity執行的有點出入

4.Activity退出的時候,依附在Activity的fragment的生命周期

Android面經-基礎篇(持續更新...)

I/xx: AnotherRightFragment onPause…

I/xx: MainActivity onPause

I/xx: AnotherRightFragment onStop…

I/xx: MainActivity onStop

I/xx: AnotherRightFragment onDestroyView…

I/xx: AnotherRightFragment onDestroy…

I/xx: AnotherRightFragment onDetach…

I/xx: MainActivity onDestroy

5.當事務加入addToBackStack(null);的時候

private void relaceFrgment(Fragment fragment) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction tr = fm.beginTransaction();
        tr.replace(R.id.fr_container, fragment);
        tr.addToBackStack(null);//點選可以傳回上一個Fragment
        tr.commit();
    }
           
Android面經-基礎篇(持續更新...)

I/xx: RightFragment 構造方法走了…

I/xx: RightFragment onAttach走了…

I/xx: RightFragment onCreate走了…

I/xx: RightFragment onCreateView走了…

I/xx: RightFragment onActivityCreated…

I/xx: RightFragment onStart…

I/xx: RightFragment onResume…

這裡執行了替換操作————————–

I/xx: AnotherRightFragment 構造方法走了…

I/xx: AnotherRightFragment onAttach走了…

I/xx: AnotherRightFragment onCreate走了…

I/xx: RightFragment onPause…

I/xx: RightFragment onStop…

I/xx: RightFragment onDestroyView…

I/xx: AnotherRightFragment onCreateView走了…

I/xx: AnotherRightFragment onActivityCreated…

I/xx: AnotherRightFragment onStart…

I/xx: AnotherRightFragment onResume…

小總結:從這裡看出,事物加入了addToBackStack(null)之後,如果在替換的時候加入了addToBackStack()方法,此時RightFragment就不會走onDestroy()方法以及onDetach()方法()方法

當點選傳回鍵之後

Android面經-基礎篇(持續更新...)

I/xx: AnotherRightFragment onCreateView走了…

I/xx: AnotherRightFragment onActivityCreated…

I/xx: AnotherRightFragment onStart…

I/xx: AnotherRightFragment onResume…

這裡執行了傳回鍵操作————————–

I/xx: AnotherRightFragment onPause…

I/xx: AnotherRightFragment onStop…

I/xx: AnotherRightFragment onDestroyView…

I/xx: AnotherRightFragment onDestroy…

I/xx: AnotherRightFragment onDetach…

I/xx: RightFragment onCreateView走了…

I/xx: RightFragment onActivityCreated…

I/xx: RightFragment onStart…

I/xx: RightFragment onResume…

可以看出,傳回鍵是執行銷毀目前Fragment的,是以會走 ,但上一個Fragment由于addToBackStack()方法就不需要不執行onAttach()方法以及onCreate()方法(因為它被替換的時候也不執行onDestroy()方法以及onDetach()方法()方法)

這裡還有幾篇特别好的文章:

1.實作Activity和Fragment之前通信 - CSDN部落格

2.死磕 Fragment 的生命周期 - MeloDev的部落格 - CSDN部落格 ,這裡的源碼架構很不錯:itsMelo/BuzzerBeater: 邁出開源的第一步,初心為鑒,時間為證。–這裡實作的懶加載不是很正确,看下面的[1][2][3][4]會對你有所啟發

[1] android fragment onHiddenChanged的使用 - CSDN部落格 ,這裡是為了解釋第二篇博文準備的

[2] Fragment的setUserVisibleHint方法實作懶加載,但setUserVisibleHint 不起作用? - Leevey·L - 部落格園 ,這裡是為了解釋第二篇博文準備的

[3] TabLayout使用詳解 - 簡書 ,這裡是為了解釋第二篇博文準備的

[4] 套在ViewPagerz中的Fragment在各種狀态下的生命周期 - 格物窮理 - CSDN部落格

3.Android – Fragment 基本用法、生命周期與細節注意 - 簡書

4.Fragment全解析系列(一):那些年踩過的坑 - 簡書

關于BroadcastReceiver

1.Android中廣播的使用(動态、靜态注冊的差別,有序無序廣播的使用) - OONullPointerAlex的部落格 - CSDN部落格

2.Android四大元件:BroadcastReceiver史上最全面解析 - 簡書

PS:

1.廣播不可以進行任何的耗時操作,通常用來打開一個程式的其他元件(建立一條狀态欄通知或者啟動一個服務)

2.本地LocalBroadcastReceiver是無法通過靜态注冊的方式來接收的

3.對于操作特别頻繁的廣播事件,比如螢幕的解鎖屏,電池電量的變化,必須使用動态注冊才得(即不可以在清單檔案注冊)

資料存儲方案

  • Android 資料存儲五種方式使用與總結 - CSDN部落格
  • 安卓内外部存儲完全解析 – 别再弄混了 - 簡書
  • 徹底搞懂Android檔案存儲—内部存儲,外部存儲以及各種存儲路徑解惑 - CSDN部落格
  • 淺談Android的檔案存儲 - 掘金

運作時權限(危險權限)

  • Runtime Permissions(郭霖CSDN公開課) - 簡書
  • Android6.0運作時權限解決方案 - 簡書

在這裡,我建議去Github尋找那些已經封裝好的類直接使用即可,畢竟那些代碼真的很多,而且很容易忘記

ContentProvider

1.ContentProvider從入門到精通 - 簡書

2.Android 進階11:程序通信之 ContentProvider 内容提供者 - CSDN部落格

這裡感覺初級複習應該好好回去看通信錄以及短信備份更有效,如果是進階的話,建議從設計模式的角度去看這個元件更好(ContentProvider跟BroadcastReceiver好像都是觀察者模式)

豐富你的程式

使用通知

  • Android 中通知的基本使用 - 簡書
  • Android 通知欄Notification的整合 全面學習 (一個DEMO讓你完全了解它) - 未來之路 的專欄 - CSDN部落格
  • 你真的了解Android Notification嗎? - CSDN部落格

拍照或者從相冊選擇照片

Android開發之調用攝像頭拍照 - 小朵八的部落格 - CSDN部落格

播放視訊或者音頻

  • Android多媒體程式設計——MediaPlayer播放音樂 - CSDN部落格

網絡技術

WebView

  • Android開發:最全面、最易懂的Webview使用詳解 - 簡書
  • 最全面總結 Android WebView與 JS 的互動方式 - 簡書
  • 必知必會 | WebView 的一切都在這兒
  • 如何設計一個優雅健壯的Android WebView?(上) - 掘金
  • 如何設計一個優雅健壯的Android WebView?(下) - 掘金

Android多線程程式設計

  • android: 多線程程式設計基礎 - dodo-yufan - 部落格園
  • android: 使用 AsyncTask - dodo-yufan - 部落格園
    • Java多線程系列目錄(共43篇) - 如果天空不死 - 部落格園

服務

  • Android Service完全解析,關于服務你所需知道的一切(上) - 郭霖的專欄 - CSDN部落格
  • Android Service完全解析,關于服務你所需知道的一切(下) - 郭霖的專欄 - CSDN部落格

服務的生命周期

Android面經-基礎篇(持續更新...)

1.繼承一個服務

public class MyService extends Service {
    private static final String TAG=MyService.class.getSimpleName();

    public MyService() {
        Log.i(TAG,"MyService構造方法走了....");
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        Log.i(TAG,"onBind");
      return new MyBinder();
    }


    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG,"onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG,"onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.i(TAG,"onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        Log.i(TAG,"onDestroy");
        super.onDestroy();
    }

    //這裡是BindService使用的
    class MyBinder extends Binder{
        public void startDownload() {
            Log.i(TAG,"startDownload");
        }

        public void stopDownload() {
            Log.i(TAG,"stopDownload.......");
        }
    }

}
           

2.開啟服務或者銷毀服務(測試的普通Service)

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_click1:
                //開啟服務
                Intent intent=new Intent(MainActivity.this,MyService.class);
                startService(intent);
                break;
            case R.id.bt_click2:
                //銷毀服務
                Intent intent1=new Intent(MainActivity.this,MyService.class);
                stopService(intent1);
                break;
        }
    }
           

當你點的第一次的時候,服務走的生命周期

Android面經-基礎篇(持續更新...)

當你點多幾次,隻走onStartCommand()方法

Android面經-基礎篇(持續更新...)

當你點選停止服務(之後點選多次不會走任何方法,也不會報錯)

Android面經-基礎篇(持續更新...)

當你再點選開啟服務的時候

Android面經-基礎篇(持續更新...)

3.開啟或者關閉bindService

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_click1:
                //開啟服務
                Intent intent = new Intent(MainActivity.this, MyService.class);
                if (mConn==null) {
                    mConn = new MyConn();
                }
                bindService(intent, mConn, BIND_AUTO_CREATE);
                break;
            case R.id.bt_click2:
                //銷毀服務,bindService隻可以點選一次(多次點選會報錯)
                //報錯:java.lang.IllegalArgumentException: Service not registered
                if (mConn != null) {
                    unbindService(mConn);
                    mConn = null;
                }
                break;
        }
    }

    class MyConn implements ServiceConnection {
        /**
         * MyService中的onBind()方法不為null才會走這方法onServiceConnected
         */
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            mMyBinder = (MyService.MyBinder) iBinder;
            mMyBinder.startDownload();
            Log.i("MyService", "onServiceConnected...........componentName" + componentName);
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            mMyBinder.stopDownload();
            Log.i("MyService", "onServiceDisconnected...........componentName" + componentName);
        }
    }
           

點選進行綁定:

Android面經-基礎篇(持續更新...)

多次點選綁定按鈕:

if (mConn==null) {
                    mConn = new MyConn();
                }
           
Android面經-基礎篇(持續更新...)

換成這樣的代碼就不同了

//                if (mConn==null) {
//這樣點選停止服務,無法執行onUnbind()以及onDestroy()進行銷毀,下面探究1講解
                    mConn = new MyConn();
//                }
           
Android面經-基礎篇(持續更新...)

PS:每點選一次就走一個onServiceConnected()方法,但Service相關方法不走了…

點選停止服務(點選一次):

Android面經-基礎篇(持續更新...)

點選多次停止服務

Android面經-基礎篇(持續更新...)

是以代碼要這樣寫:

if (mConn != null) {
                    unbindService(mConn);
                    //這裡一定要置為空,友善上邊的條件mConn != null成立
                    mConn = null;
                }
           

探究1:

public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_click1:
                //開啟服務
                Intent intent = new Intent(MainActivity.this, MyService.class);
                //if (mConn==null) {
                mConn = new MyConn();
                //}
                Log.i(MyService.class.getSimpleName(), "新建立的mConn:" + mConn);
                bindService(intent, mConn, BIND_AUTO_CREATE);
                break;
            case R.id.bt_click2:
                //銷毀服務,bindService隻可以點選一次(多次點選會報錯)
                //報錯:java.lang.IllegalArgumentException: Service not registered
                //if (mConn != null) {
                Log.i(MyService.class.getSimpleName(), "銷毀的時候mConn:" + mConn);
                unbindService(mConn);
                //mConn = null;
                //}
                break;
        }
    }
           
Android面經-基礎篇(持續更新...)
第一次點選綁定服務:新建立的mConn:com.example.yueyue.myapplication.MainActivity[email protected]
第二次點選綁定服務:新建立的mConn:com.example.yueyue.myapplication.MainActivity[email protected]
第一次點選解綁服務:銷毀的時候mConn:com.example.yueyue.myapplication.MainActivity[email protected]
第二次點選解綁服務:銷毀的時候mConn:com.example.yueyue.myapplication.MainActivity[email protected]
(報異常 java.lang.IllegalArgumentException: Service not registered)
           

個人見解:因為 bindService()中的第三個參數flags中的BIND_AUTO_CREATE表示當收到綁定請求時,如果服務尚未建立,則即刻建立,在系統記憶體不足,需要先銷毀優先級元件來釋放記憶體,且隻有駐留該服務的程序成為被銷毀對象時,服務才可被銷毀;是以因為之前已經建立該服務了,是以就不會再建立了,服務的任何方法都不會再走,但由于每次都是new Conn(Conn是實作了ServiceConnection接口),是以都會回調一次onServiceConnected方法(這裡我水準問題:猜測是Conn相當于一條橋梁,當調用者(比如Activity)與MyService每搭橋一次成功,然後Conn就會回調一次ServiceConnection方法)

注意:調用者(比如Activity)與MyService可以搭載多座橋(捆綁服務bindService開啟的情況下)

為什麼銷毀的時候會不走呢?這裡不是不走,這裡需要注意一點:當所有連接配接MyService的Conn都unBind的時候,MyService才會走onUnbind以及onDestroy方法

證明代碼(使用一個sMyConnList來管理):

private static List<MyConn> sMyConnList = new ArrayList<>();

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_click1:
                //開啟服務
                Intent intent = new Intent(MainActivity.this, MyService.class);
                mConn = new MyConn();
                sMyConnList.add(mConn);
                Log.i(MyService.class.getSimpleName(), "新建立的mConn:" + mConn);
                bindService(intent, mConn, BIND_AUTO_CREATE);
                break;
            case R.id.bt_click2:
                //銷毀服務,bindService隻可以點選一次(多次點選會報錯)
                for (MyConn myConn:sMyConnList) {
                    Log.i(MyService.class.getSimpleName(), "銷毀的時候mConn:" + mConn);
                    unbindService(myConn);
                }
                break;
        }
    }
           
Android面經-基礎篇(持續更新...)

Service小總結:

  • start方式開啟服務的特點:
    • 第一次點選開啟服務按鈕,服務就會走構造方法MyService()->onCreate()->onStartCommand()
    • 服務中的onStartCommand()跟Activity中的onStart()方法隻是名字不同,但作用是一樣的
    • 第二次點選開啟服務的時候(之前沒有銷毀),服務隻走onStartCommand()方法
    • 服務一旦被開啟,服務就會在背景長期運作,直到使用者手動停止
  • bindService開啟服務的特别:
    • 第一次點選按鈕,會執行 構造方法MyService()->onCreate()->onBind()方法
    • 當onBind()方法傳回null的時候,onServiceConnected()是不執行的
    • 第二次點選開啟服務,服務沒有走任何的方法
    • 這種服務不求同時生,但求同時死(這裡指的是調用者(比如Activity)與服務之間的關系)
    • 服務不可以多次解綁,多次解綁會導緻報異常
    • 通過bindService方法開啟服務,服務不能在設定頁面找到,相當于一個隐形的服務
    • 類ServiceConnection中的onServiceDisconnected()方法在正常情況下是不被調用的,它的調用時機是當Service服務被異外銷毀時,例如記憶體的資源不足時這個方法才被自動調用。
    • Service.onBind如果傳回null,則調用 bindService 會啟動 Service,但不會連接配接上 Service,是以 ServiceConnection.onServiceConnected不會被調用,但你任然需要使用unbindService 函數斷開它,這樣Service 才會停止。
  • 實際上服務都隻會存在一個執行個體
  • 隻有Activity,Service,和ContentProvider可以綁定到一個service—你不能從一個BroadcastReceiver綁定到service.BroadcastReceiver的context生命周期很短暫,bindService沒有什麼意義。

混合開啟服務

  • 混合使用startService,bindService,以及tartForegroud方法使用總結 - pugongying1988的專欄 - CSDN部落格
  • Android裡Service的bindService()和startService()混合使用深入分析 - CSDN部落格
  • 如何提升 service 等級,不被kill(整合) - 暈菜一員 - 部落格園
  • Android:程序(process)優先級、startForeground - 天空沒有痕迹但我飛過 - 51CTO技術部落格

一般混合服務的需求都是:既想讓服務在背景長期運作又想調用服務裡面的辦法(即與服務實作互動)

一般順序:

1.先調用startService方法開啟服務,保證服務能夠在背景長期運作(MyService構造方法->onCreate->onStartCommand)

2.調用bindService方法,去擷取中間對象(這時候走onBind以及類ServiceConnection中的onServiceConnected)

3.調用unBindService解綁服務(走onUnbind方法,但沒有走onDestroy方法)

4.調用stopService(走onDestroy方法)

但如果是另外一種順序:

1.bindService(MyService構造方法->onCreate->onBind以及類ServiceConnection中的onServiceConnected)

2.startService(隻走onStartCommand)

3.stopService(什麼辦法都不會走)

4.unBindService(onUnbind->onDestroy)

但還有一種順序:

1.bindService(MyService構造方法->onCreate->onBind以及類ServiceConnection中的onServiceConnected)

2.startService(隻走onStartCommand)

3.unBindService(onUnbind)

4.stopService(onDestroy)

————-我是低調的分割線————————–

如果對你有幫助,可以點選“推薦”哦`(*∩_∩*)′

Android面經-基礎篇(持續更新...)
Android面經-基礎篇(持續更新...)
Android面經-基礎篇(持續更新...)
Android面經-基礎篇(持續更新...)
本文連結: Android面經-提升篇(持續更新…) - CSDN部落格 ,在此說明本人可能用到很多部落格的連結以及話語引用沒有說明,請相關的部落客莫怪,本人也沒有想過靠這些來進行吸引來達到盈利的目的,純碎是為了儲存好這些自己覺得寫得很好的博文

繼續閱讀