色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

了解一下Service的繼承關系

哆啦安全 ? 來源:哆啦安全 ? 2023-04-28 15:48 ? 次閱讀

一、Service 簡介

首先我們先了解一下Service的繼承關系,方便我們更好的了解Service。Service繼承關系如下:

java.lang.Object
   ?    android.content.Context
       ?    android.content.ContextWrapper
           ?    android.app.Service

ServiceAndroid四大組件之一(Activity活動,Service服務,ContentProvider內容提供者,BroadcastReceiver廣播),與Activity相比,Service是運行在后臺,無用戶界面,用戶無法看到,Activity則是運行在前臺,用戶可以看得見。

Service主要用于組件之間交互(例如:與Activity、ContentProviderBroadcastReceiver進行交互)、執行后臺任務等(例如下載文件,播放音樂等)。

注意:Service在主線程運行時長不能超過20s,否則會出現ANR,耗時操作一般建議在子線程或工作線程中進行操作。

二、Service 的注冊

Service是四大組件之一,必現在AndroidMainfest.xml中注冊。
Service注冊方法如下:

 ... >
  ...
   ... >
       android:name=".ServiceMethods" />
      ...
  >
>

注意:
Service如不注冊 ,不會像Activity那樣會導致App Crash,Service不注冊 不會報異常信息,但是服務會起不來,如不注意很容易迷惑。

三、Service 的啟動模式

Service啟動模式主要分兩種:1. 啟動模式。2. 綁定模式。

  • 1.啟動模式

此模式通過startService()方法啟動,此服務可以在后臺一直運行,不會隨啟動組件的消亡而消亡。

但是,此種啟動模式只能執行單一操作,并且無法返回結果給調用方,主要常用于網絡下載、上傳文件,播放音樂等。

  • 2.綁定模式

此模式通過綁定組件(Activity等)調用bindService()啟動,此服務隨綁定組件的消亡而解除綁定。

如果此時沒有其它通過startService()啟動,則此服務會隨綁定組件的消亡而消亡。

多個組件不僅可以同時綁定一個Service,而且可以通過進程間通信(IPC)執行跨進程操作等。

  • 3.兩種服務可以同時運行

啟動模式與綁定模式的服務可以同時運行,在銷毀服務時,只有兩種模式都不在使用Service時候,才可以銷毀服務,否則會引起異常。

四、Service的生命周期

Service有兩種不同的啟動模式 ,不同的啟動模式對應不同生命周期。兩種不同Service模式的生命周期如下:

e9bfc102-e572-11ed-ab56-dac502259ad0.jpg

兩種 Service 模式生命周期圖

五、啟動模式使用舉例

通過啟動模式啟動的Service,如不主動關閉,Service會一直在。

1.啟動模式啟動服務的方法

        Intent  mBindIntent = new Intent(ServiceMethods.this, BindServiceMethods.class);
        startService(mStartIntent);

2.啟動模式啟動服務的生命周期

下面是驗證啟動模式啟動服務的生命周期的方法,詳細生命周期請查看上方Service的生命周期圖。

01-03 17:16:36.147 23789-23789/com.android.program.programandroid I/StartService wjwj:: ----onCreate----
01-03 17:16:36.223 23789-23789/com.android.program.programandroid I/StartService wjwj:: ----onStartCommand----
01-03 17:16:38.174 23789-23789/com.android.program.programandroid I/StartService wjwj:: ----onDestroy----

3.啟動模式 啟動服務案例

此案例功能:啟動服務,在服務中創建通知

    // Service 創建方法
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "----onCreate----");
    }
    // Service  啟動方法
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "----onStartCommand----");
        // 獲取NotificationManager實例
        notifyManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        // 實例化NotificationCompat.Builder并設置相關屬性
        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                this)
        // 設置小圖標
                .setSmallIcon(R.drawable.ic_launcher)
                .setLargeIcon(
                        BitmapFactory.decodeResource(getResources(),
                                R.drawable.ic_launcher))
                // 設置通知標題
                .setContentTitle("我是通過StartService服務啟動的通知")
                // 設置通知不能自動取消
                .setAutoCancel(false).setOngoing(true)
                // 設置通知時間,默認為系統發出通知的時間,通常不用設置
                // .setWhen(System.currentTimeMillis())
                // 設置通知內容
                .setContentText("請使用StopService 方法停止服務");

        // 通過builder.build()方法生成Notification對象,并發送通知,id=1
        notifyManager.notify(1, builder.build());

        return super.onStartCommand(intent, flags, startId);
    }
    // Service  銷毀方法
    @Override
    public void onDestroy() {
        Log.i(TAG, "----onDestroy----");
        notifyManager.cancelAll();
        super.onDestroy();
    }

六、 綁定服務介紹

綁定模式啟動的服務會隨著綁定逐漸的消亡而解除Service綁定,如果此時Service沒有通過啟動模式啟動,則此服務將會被銷毀。

1.啟動綁定模式服務的方法

綁定模式,是通過其他組件調用bindService()方法啟動的Service

    // 啟動綁定服務處理方法
    public void BtnStartBindService(View view) {
        // 啟動綁定服務處理方法
        bindService(mBindIntent, serviceConnection, Context.BIND_AUTO_CREATE);
        isBindService = true;
        Toast.makeText(ServiceMethod.this, "啟動 " + mBindCount + " 次綁定服務",
                Toast.LENGTH_SHORT).show();
    }

    
    public void BtnSopBindService(View view) {
        if (isBindService) {
            // 解除綁定服務處理方法
            unbindService(serviceConnection);
            Toast.makeText(ServiceMethod.this, "解除 " + mUnBindCount + " 次綁定服務",
                    Toast.LENGTH_SHORT).show();
            isBindService = false;
        }

    }

2.綁定服務 隨綁定組件的消亡而消亡

如果綁定服務的組件被destory,這 bind 服務會走到onUnbind()方法。

3. 綁定模式 生命周期回調代碼如下:

    // Service 創建方法
    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "----onCreate----");
    }

    // Service 綁定方法
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "----onBind----");

        MyBinder myBinder = new MyBinder();
        return myBinder;
    }

    // Service 解除綁定方法
    @Override
    public boolean onUnbind(Intent intent) {

        Log.i(TAG, "----onUnbind----");
        return super.onUnbind(intent);

    }

    // Service 銷毀方法
    @Override
    public void onDestroy() {
        Log.i(TAG, "----onDestroy----");
        super.onDestroy();
    }

綁定服務的生命周期代碼打印Log信息如下:

01-03 20:32:59.422 13306-13306/com.android.program.programandroid I/BindService wjwj:: ----onCreate----
01-03 20:32:59.423 13306-13306/com.android.program.programandroid I/BindService wjwj:: -----onBind-----
01-03 20:33:09.265 13306-13306/com.android.program.programandroid I/BindService wjwj:: ----onUnbind----
01-03 20:33:09.266 13306-13306/com.android.program.programandroid I/BindService wjwj:: ----onDestroy----

七、bind 服務舉例

功能:
獲取綁定模式啟動 綁定服務及解除綁定服務的次數

1.綁定服務類

package com.android.program.programandroid.component.Service;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class BindServiceMethods extends Service {
    private static final String TAG = "BindService wjwj:";

    public BindServiceMethods() {
    }

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

    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "----onBind----");

        MyBinder myBinder = new MyBinder();
        return myBinder;
    }


    @Override
    public boolean onUnbind(Intent intent) {

        Log.i(TAG, "----onUnbind----");
        return super.onUnbind(intent);

    }

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

2.組件與綁定服務類之間的交互

 //    啟動綁定服務處理方法
    public void BtnStartBindService(View view) {

        bindService(mBindIntent, serviceConnection, Context.BIND_AUTO_CREATE);
        isBindService = true;
        Toast.makeText(ServiceMethods.this,"啟動 "+mBindCount+" 次綁定服務",Toast.LENGTH_SHORT).show();
    }

    //    解除綁定服務處理方法
    public void BtnSopBindService(View view) {
        if (isBindService) {
            unbindService(serviceConnection);
            Toast.makeText(ServiceMethods.this,"解除 "+mUnBindCount+" 次綁定服務",Toast.LENGTH_SHORT).show();
            isBindService=false;
        }

    }

3.組件之間交互所需的Binder接口

/**
* 該類提供 綁定組件與綁定服務提供接口
* */
public class MyBinder extends Binder {
   private int count = 0;

    public int getBindCount() {
        return ++count;
    }
    public int getUnBindCount() {
        return count> 0 ? count-- : 0;
    }
}

八、服務的優先級

服務默認啟動方式是后臺服務,但是可以通過設置服務為前臺服務,提高服務的優先級,進而避免手機內存緊張時,服務進程被殺掉。

設置服務優先級的方法如下:

1.設置為前臺服務

//設置為前臺服務
startForeground(int, Notification)

2.取消前臺服務

//取消為前臺服務
stopForeground(true);

3.startForeground 前臺服務案例

功能:前臺服務綁定通知信息,提高服務進程優先級,否則取消通知信息

package com.android.program.programandroid.component.Service;

import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;

import com.android.program.programandroid.R;

public class MyStartForcegroundService extends Service {

    public MyStartForcegroundService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        if (intent.getAction().equals("start_forceground_service")) {

//        獲取NotificationManager實例
            NotificationManager notifyManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//        實例化NotificationCompat.Builder并設置相關屬性
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
//                設置小圖標
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//                設置通知標題
                    .setContentTitle("我是通過startForeground 啟動前臺服務通知")
//                設置通知不能自動取消
                    .setAutoCancel(false)
                    .setOngoing(true)
//                設置通知時間,默認為系統發出通知的時間,通常不用設置
//                .setWhen(System.currentTimeMillis())
//               設置通知內容
                    .setContentText("請使用stopForeground 方法改為后臺服務");

            //通過builder.build()方法生成Notification對象,并發送通知,id=1
//        設置為前臺服務
            startForeground(1, builder.build());

        } else if (intent.getAction().equals("stop_forceground_service")) {
            
            stopForeground(true);
        }

        return super.onStartCommand(intent, flags, startId);
    }
}


審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Service
    +關注

    關注

    0

    文章

    30

    瀏覽量

    13784
  • 組件
    +關注

    關注

    1

    文章

    512

    瀏覽量

    17817
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19677

原文標題:八、服務的優先級

文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求大神詳細介紹一下關于類的封裝與繼承

    求大神詳細介紹一下關于類的封裝與繼承
    發表于 04-28 06:40

    了解一下STM32的時鐘樹

    的時鐘頻率又是如何確定的呢?帶著這個問題,我們起詳細了解一下STM32的時鐘樹。時鐘樹是了解STM32時鐘的靈魂,ST...
    發表于 08-06 07:11

    USB顯微鏡,不想了解一下嗎?

    USB顯微鏡,不想了解一下嗎? 近日,在很多國外網站上都搜的到配備了USB接口的數字顯微鏡,他們打破了傳統顯微鏡機體笨重,操作復雜的傳統,
    發表于 04-28 10:24 ?3531次閱讀

    Java類的繼承與派生

    一下與類的初始化相關的東西,然后再從幾個方面闡述繼承大特性。以下是本文的目錄大綱: 。你了解類嗎? 二。你
    發表于 09-27 10:55 ?0次下載
    Java類的<b class='flag-5'>繼承</b>與派生

    了解OOP三大特點中繼承的優缺點

    程序員來說,OOP(面向對象編程)的三大特性——數據封裝、繼承和多態通常是面試中的重點考察問題,因此大部分人對此也相當熟悉。 不過,OOP的優缺點你真的了解嗎?今天這篇文章會帶領大家了解
    的頭像 發表于 02-06 14:54 ?8631次閱讀
    <b class='flag-5'>了解</b>OOP三大特點中<b class='flag-5'>繼承</b>的優缺點

    宏碁智能佛珠了解一下

    朋友,最近工作順利嗎?家庭幸福嗎?生活美滿嗎?看你心情復雜,要不要了解一下宏碁剛發布的智能佛珠?
    的頭像 發表于 08-08 16:27 ?3554次閱讀

    帶你了解一下什么是USB 3.1接口

    盡管USB是外部設備中最常見的連接,但它有很多的版本,不同的接頭和連接類型都令人困惑不解。USB 3.1是當今最常見的標準之,但它究竟是什么呢?它與之前和之后的版本有什么不同?讓我們來詳細了解一下。
    發表于 09-23 17:31 ?1.7w次閱讀

    電磁爐加熱一下就停一下什么原因

    電磁爐加熱一下就停一下什么原因。
    的頭像 發表于 06-04 10:01 ?3.8w次閱讀

    python類的繼承詳解

    python類的繼承 類的繼承,跟人類繁衍的關系相似。 被繼承的類稱為基類(也叫做父類),繼承而得的類叫派生類(也叫子類),這種
    的頭像 發表于 03-08 16:40 ?3097次閱讀

    了解一下AOC有源光纜的相關知識

    信息傳輸與交換量與日俱增,高密度,高寬帶應用也越來越多,傳統的銅質電纜已經不能適應通信的需要,相比于傳統線纜來說,有源光纜能夠幫助通信設備享受到光傳輸的巨大優勢。那AOC有源光纜有什么不同呢?今天就跟易天光通信(ETU-LINK)一起來了解一下AOC有源光纜的相關知識吧!
    的頭像 發表于 03-25 08:58 ?2273次閱讀

    大哥!100W移動電源方案,了解一下

    100W移動電源方案,了解一下
    的頭像 發表于 06-02 19:03 ?2431次閱讀
    大哥!100W移動電源方案,<b class='flag-5'>了解</b><b class='flag-5'>一下</b>

    了解一下光纖傳輸的特點

    光纖作為綜合布線種常見的傳輸媒介,很多人搞不清楚光纖和光纜這兩者,光纖是光傳導工具,傳輸原理是“光的全反射”,被用作長距離的信息傳遞,下面跟著科蘭小編一起來了解一下光纖傳輸的特點。
    的頭像 發表于 06-08 13:42 ?845次閱讀

    虹科帶你來了解一下汽車以太網和TSN的測試標準

    虹科帶你來了解一下汽車以太網和TSN的測試標準
    的頭像 發表于 12-22 17:46 ?3555次閱讀
    虹科帶你來<b class='flag-5'>了解</b><b class='flag-5'>一下</b>汽車以太網和TSN的測試標準

    了解一下“薄膜厚度監控”

    光學鍍膜干貨來了!了解一下“薄膜厚度監控”
    的頭像 發表于 07-20 10:11 ?862次閱讀
    <b class='flag-5'>了解</b><b class='flag-5'>一下</b>“薄膜厚度監控”

    無需電流采樣電阻的智能電機驅動IC,不來了解一下么?

    無需電流采樣電阻的智能電機驅動IC,不來了解一下么?
    的頭像 發表于 11-30 17:43 ?453次閱讀
    無需電流采樣電阻的智能電機驅動IC,不來<b class='flag-5'>了解</b><b class='flag-5'>一下</b>么?
    主站蜘蛛池模板: 性色AV一区二区三区咪爱四虎| 第一福利在线永久视频| 欧美成人中文字幕在线看| 国产精品第1页| 69日本人XXXX护士HD| 特黄大片aaaaa毛片| 啦啦啦视频在线观看WWW| 国产成人免费观看在线视频| 99久久国产视频| 野花社区WWW韩国日本| 日韩高清在线亚洲专区| 久久天天躁狠狠躁夜夜呲| 国产精品搬运| 国产午夜人做人免费视频中文 | 免费光看午夜请高视频| 后式大肥臀国产在线| 国产传媒18精品免费1区| 国产亚洲国际精品福利| 久久99视热频国只有精品| 国产精品亚洲欧美一区麻豆| xxx暴力xxx| 91夫妻交友论坛| 最近最新中文字幕MV高清在线| 亚洲午夜精品A片久久WWW解说| 亚洲 欧美 国产 综合 在线| 色小说在线| 人与畜禽CROPROATION免费| 年轻老师毛茸茸自由性| 妹妹的第一次有点紧| 手机在线成人精品视频网 | 啦啦啦影院视频在线看高清...| 强开少妇嫩苞又嫩又紧九色| 蜜臀AV99无码精品国产专区| 三级黄.色| 我就去色色| 天天躁夜夜踩很很踩2022| 亚洲一区免费香蕉在线| silk118中文字幕无删减| 国产视频精品免费| 免费可以看黄的视频s色| 琪琪伦伦影院理论片|