• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 安卓學習筆記之service(一)

    安卓四大組件之Service

    今天來入門一下service這個組件,這玩意是在你后臺做一些必要的工作。


    **

    1.什么是service?

    **
    從google官網看的,官方的描述是這樣的。
    A Service is an application component representing either an application’s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each service class must have a corresponding declaration in its package’s AndroidManifest.xml. Services can be started with Context.startService() and Context.bindService().
    懂英語的話就一目了然了,英語水平差點的話就可以有道了。
    翻譯過來就是說:
    服務是應用程序組件,它表示應用程序希望執行長時間運行的操作,而不與用戶交互,或為其他應用程序提供功能。每個服務類在其包的androidmanifest.xml中都必須有相應的“聲明”。可以使用Context.startService()和context.bindservice()啟動服務。

    Service是一種在后臺長期運行的。沒有界面的組件,由其它組件調用進行。
    服務不太會被kill,即使在內存不足的時候被kill,當內存恢復足夠的時候,服務又會自己的復活。比如:下載的時候就可以放入服務中來做,啟動服務,完成時,關閉服務。


    2.如何創建與使用service

    我們要在manifest文件里進行聲明,當然我們使用as的時候我們也可以通過菜單進行快速的創建service省去手動在manifest文件添加的麻煩。會有兩種方法。

    第一種


    第一步:創建一個service類,并且分別重寫它的父類方法,并在manifest文件里面生命注冊

     <service android:name=".MyService"/>
    public class MyService extends Service {
        @Override
        public void onCreate() {
            Log.v("dd","onCreate");
            super.onCreate();
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.v("dd","onStartCommand");
            return super.onStartCommand(intent, flags, startId);
        }
    
        @Override
        public void onDestroy() {
            Log.v("dd","onDestroy");
            super.onDestroy();
        }
    
    
    }
    

    僅僅是添加了log日志打印輸出。看看生命周期的順序。然后在activity_main中添加兩個連個按鈕控件

    <Button
            android:id="@+id/btn_start"
            android:text="Start Service"
            android:textAllCaps="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <Button
            android:id="@+id/btn_stop"
            android:text="Stop Service"
            android:textAllCaps="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    

    然后在activity類里面測試:

    public class MyActivity extends Activity implements View.OnClickListener {
        private Button btn_start;
        private Button btn_stop;
        private Intent intent;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            initView();
            intent = new Intent(this,MyService.class);
        }
    
        private void initView() {
            btn_start= (Button) findViewById(R.id.btn_start);
            btn_stop= (Button) findViewById(R.id.btn_stop);
            btn_start.setOnClickListener(this);
            btn_stop.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_start:
                    startService(intent);
                    break;
                case R.id.btn_stop:
                    stopService(intent);
                    break;
            }
        }
    }

    當點擊start按鈕的時候,會看到控制臺輸入以下的文字:
    06-21 06:51:15.995 3006-3006/com.does.service V/dd: onCreate
    06-21 06:51:16.001 3006-3006/com.does.service V/dd: onStartCommand
    當點擊stop按鈕的時候會調用:
    06-21 06:51:22.829 3006-3006/com.does.service V/dd: onDestroy

    第二種

    使用bindService的方法


    布局文件

     <Button
            android:id="@+id/btn_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="StartService"
            android:textAllCaps="false" />
        <Button
            android:id="@+id/btn_stop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="StopService"
            android:textAllCaps="false" />
        <Button
            android:id="@+id/btn_bind"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="BindService"
            android:textAllCaps="false" />
        <Button
            android:id="@+id/btn_unbind"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="UnBindService"
            android:textAllCaps="false" />
    

    這里寫圖片描述

    MainActivity .java文件

    public class MainActivity extends Activity implements View.OnClickListener {
    
        private Button btn_bind,btn_unbind;
        private ServiceConnection connection;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
            initEvent();
        }
    
        private void initEvent() {
            connection=new ServiceConnection() {
                @Override
                public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                //服務連接成功的時候操作
    
                }
    
                @Override
                public void onServiceDisconnected(ComponentName componentName) {
                //服務取消連接的時候
                }
            };
        }
    
        private void initView() {
            btn_bind= (Button) findViewById(R.id.btn_bind);
            btn_unbind= (Button) findViewById(R.id.btn_unbind);
            btn_bind.setOnClickListener(this);
            btn_unbind.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.btn_start:
                    Intent start=new Intent(this,MyService.class);
                    startService(start);
                    break;
                case R.id.btn_stop:
                    Intent stop=new Intent(this,MyService.class);
                    stopService(stop);
                    break;
                case R.id.btn_bind:
                    Log.v("does","bind is clicked");
                    Intent bind=new Intent(this,MyService.class);
                    bindService(bind,connection,BIND_AUTO_CREATE);
                    break;
                case R.id.btn_unbind:
                    Log.v("does","unbind is clicked");
                    Intent unbind=new Intent(this,MyService.class);
                    unbindService(connection);
                    break;
                default:
                    break;
            }
        }
    }
    

    MyService.java

    public class MyService extends Service {
        @Override
        public void onCreate() {
            Log.v("does","onCreate");
            super.onCreate();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.v("does","onStartCommand");
            return super.onStartCommand(intent, flags, startId);
    
        }
    
        @Override
        public void onDestroy() {
            Log.v("does","onDestroy");
            super.onDestroy();
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    }
    

    當我們點擊bind按鈕的時候,發現
    07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: bind is clicked
    07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: onCreate
    當我們點擊unbind的時候,發現
    07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: unbind is clicked
    07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: onDestroy


    3.service的生命周期

    在上面我們看到了和activity類似差不多的方法。組件都會有生命周期。所以我們介紹一下service的生命周期。這里寫圖片描述

    想必,這樣就很形象了吧?
    第一種,
    onCreate()->onStartCommand()->onDestroy()
    第二種就是綁定service
    onCreate()->onBind()->unBind()->onDestroy()

    兩種啟動service和停止service的區別就是,第一種啟動服務時候,當應用程序退出的時候,后臺的service依舊運行,只有運行stopService的時候才停止運行service。那么bindService,整個service進程是隨著整個應用程序的生命周期存活,當app的使用內存被系統回收了,那么這個service就會跟著被回收。

    版權聲明:本文為qq_29157591原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_29157591/article/details/73441091

    智能推薦

    安卓學習筆記之IntentService

    什么是IntentService 它會創建一個獨立的子線程來處理所有的Intent請求,創建的子線程來處理onHandleIntent()實現的代碼,無需處理多線程的問題。默認實現onBind()方法,返回為null;默認實現onStartCommand()方法,將請求的Intent添加到隊列中。這個類實際上是繼承自service,內部是封裝了HandlerThread和Handler類。 代碼實...

    安卓學習筆記

    學習安卓的學習筆記,留存一下,雖然以后可能都不會從事安卓相關的工作了,紀念一下。 1 Activity 1 返回棧 活動可以層疊,啟動一個新的活動會覆蓋在原活動上,Back會銷毀最上面的活動,下面的一個活動就會重新顯示。 用任務管理一系列活動。任務用返回棧描述。 啟動一個新的活動,這個活動就在返回棧中入棧,finish()即棧頂元素出棧,系統總是會顯示處于棧頂的活動給用戶。(所以finish()銷...

    安卓學習UI組件-Service

    2019獨角獸企業重金招聘Python工程師標準>>>   案例: 代碼目錄   activity_main.xml MainActivity.java MyService.java MyIntentService.java MyBoundService.java    【 CatImpl.java    &n...

    安卓:數據存儲之SharedPreference——學習筆記

    Android提供了四種數據存儲的方式 SharedPreference:一種常用的數據存儲方式,其本質是基于XML文件存儲鍵值對數據,通常用來存儲一些簡單的配置信息。 SQLite:一個輕量級數據庫,支持基本SQL語法,是Android系統中常被采用的一種數據存儲方式。 ContentProvider:Android系統中能實現應用程序之間數據共享的一種存儲方式。 文件:即常說的文件存儲方法,常...

    安卓學習筆記——URI

    一、URI:統一資源定位符,Universal Resource Identifier的簡稱 每一個ContentProvider都擁有一個公共的URI,這個URI用于表示ContentProvider提供的數據 二、URI的組成: 例: 三、URI 常用方法: 1、static Uri parse(String UriString):將一個字符串轉換為Uri 例如: 2、 List getPat...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡