国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Service 使用詳解

freewolf / 2350人閱讀

摘要:只能執(zhí)行單一操作,無法返回結(jié)果給調(diào)用方,常用于網(wǎng)絡(luò)下載上傳文件,播放音樂等。綁定模式此模式通過綁定組件等調(diào)用啟動此服務(wù)隨綁定組件的消亡而解除綁定。

極力推薦文章:歡迎收藏
Android 干貨分享

閱讀五分鐘,每日十點,和您一起終身學(xué)習(xí),這里是程序員Android

本篇文章主要介紹 Android 開發(fā)中的部分知識點,通過閱讀本篇文章,您將收獲以下內(nèi)容:

Service 簡介

四大組件之一,必須在Androidmainfest.xml 中注冊

啟動模式啟動服務(wù)

綁定模式綁定服務(wù)

前臺服務(wù)

AIDL遠程服務(wù)

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

Service主要用于組件之間交互(例如:與Activity、ContentProviderBroadcastReceiver進行交互)、后臺執(zhí)行耗時操作等(例如下載文件,播放音樂等,但Service在主線程運行時長不能超過20s,否則會出現(xiàn)ANR,耗時操作一般建議在子線程中進行操作)。

1.Service 簡介

在了解Service 的生命周期的之前,我們先了解一下Service 的繼承關(guān)系,方便我們更好的了解Service

Service 繼承關(guān)系如下:
java.lang.Object
   ?    android.content.Context
        ?    android.content.ContextWrapper
             ?    android.app.Service
Service 的兩種啟動模式

Service 有兩種不同的啟動模式 ,不同的啟動模式對應(yīng)不同生命周期.
Service 啟動模式主要分兩種: 1. 啟動模式。 2. 綁定模式。

1.啟動模式

此模式通過 startService()方法啟動,此服務(wù)可以在后臺一直運行,不會隨啟動組件的消亡而消亡。只能執(zhí)行單一操作,無法返回結(jié)果給調(diào)用方,常用于網(wǎng)絡(luò)下載、上傳文件,播放音樂等。

2.綁定模式

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

如果此時沒有其它通過startService()啟動,則此服務(wù)會隨綁定組件的消亡而消亡。
多個組件不僅可以同時綁定一個Service,而且可以通過進程間通信(IPC)執(zhí)行跨進程操作等。

3.兩種服務(wù)可以同時運行

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

4. 兩種 Service 模式的生命周期

兩種 Service 模式的生命周期如下:

2.四大組件之一,必須在Androidmainfest.xml 中注冊 Service 注冊方法如下:

  ...
  
      
      ...
  
注意:

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

3.啟動模式

通過啟動模式啟動的Service ,如不主動關(guān)閉,Service會一直在。

啟動模式啟動服務(wù)的方法
        Intent  mBindIntent = new Intent(ServiceMethods.this, BindServiceMethods.class);
        startService(mStartIntent);
啟動模式啟動服務(wù)的生命周期

下面是驗證啟動模式啟動服務(wù)的生命周期的方法,詳細生命周期請查看上方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----
啟動模式 啟動服務(wù)案例

此案例功能:啟動服務(wù),在服務(wù)中創(chuàng)建通知

    // Service 創(chuàng)建方法
    @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并設(shè)置相關(guān)屬性
        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                this)
        // 設(shè)置小圖標(biāo)
                .setSmallIcon(R.drawable.ic_launcher)
                .setLargeIcon(
                        BitmapFactory.decodeResource(getResources(),
                                R.drawable.ic_launcher))
                // 設(shè)置通知標(biāo)題
                .setContentTitle("我是通過StartService服務(wù)啟動的通知")
                // 設(shè)置通知不能自動取消
                .setAutoCancel(false).setOngoing(true)
                // 設(shè)置通知時間,默認為系統(tǒng)發(fā)出通知的時間,通常不用設(shè)置
                // .setWhen(System.currentTimeMillis())
                // 設(shè)置通知內(nèi)容
                .setContentText("請使用StopService 方法停止服務(wù)");

        // 通過builder.build()方法生成Notification對象,并發(fā)送通知,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();
    }
4. 綁定模式啟動綁定服務(wù)

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

綁定模式啟動綁定服務(wù)的方法

綁定模式,是通過其他組件啟動的Service。

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

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

    }

綁定服務(wù) 隨綁定組件的消亡而消亡

綁定模式 生命周期回調(diào)代碼如下:
    // Service 創(chuàng)建方法
    @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();
    }

綁定服務(wù)的生命周期代碼打印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----
綁定服務(wù)案例

功能:獲取綁定模式啟動 綁定服務(wù)及解除綁定服務(wù)的次數(shù)

綁定服務(wù)類
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();
    }
}

組件與綁定服務(wù)類之間的交互

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

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

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

    }

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

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

    public int getBindCount() {
        return ++count;
    }
    public int getUnBindCount() {
        return count> 0 ? count-- : 0;
    }
}
5. 提高服務(wù)的優(yōu)先級

服務(wù)默認啟動方式是后臺服務(wù),但是可以通過設(shè)置服務(wù)為前臺服務(wù),提高服務(wù)的優(yōu)先級,進而避免手機內(nèi)存緊張時,服務(wù)進程被殺掉。

設(shè)置前臺服務(wù)的兩種方法

1.設(shè)置為前臺服務(wù)

//設(shè)置為前臺服務(wù)
startForeground(int, Notification)

2.取消前臺服務(wù)

//取消為前臺服務(wù)
stopForeground(true);
startForeground 前臺服務(wù)案例

功能:前臺服務(wù)綁定通知信息,提高服務(wù)進程優(yōu)先級,否則取消通知信息

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并設(shè)置相關(guān)屬性
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
//                設(shè)置小圖標(biāo)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//                設(shè)置通知標(biāo)題
                    .setContentTitle("我是通過startForeground 啟動前臺服務(wù)通知")
//                設(shè)置通知不能自動取消
                    .setAutoCancel(false)
                    .setOngoing(true)
//                設(shè)置通知時間,默認為系統(tǒng)發(fā)出通知的時間,通常不用設(shè)置
//                .setWhen(System.currentTimeMillis())
//               設(shè)置通知內(nèi)容
                    .setContentText("請使用stopForeground 方法改為后臺服務(wù)");

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

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

        return super.onStartCommand(intent, flags, startId);
    }
}
6. 使用AIDL接口實現(xiàn)遠程綁定

由于內(nèi)容較多,后續(xù)另開一篇詳細介紹。

至此,本篇已結(jié)束,如有不對的地方,歡迎您的建議與指正。同時期待您的關(guān)注,感謝您的閱讀,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75818.html

相關(guān)文章

  • service-worker用法詳解

    摘要:二簡要介紹是一段腳本,在后臺運行。作為一個獨立的線程,不會對頁面造成阻塞。本質(zhì)上充當(dāng)應(yīng)用程序與瀏覽器之間的代理服務(wù)器。可以做到離線使用消息推送后臺自動更新,的出現(xiàn)是正是為了使得也可以具有類似的能力。在我們的例子例,是在,的根目錄是。 一、背景 taro框架轉(zhuǎn)的h5,想在無網(wǎng)絡(luò)狀態(tài)下可以控制展示給用戶的界面,使用客戶端離線緩存可以達到目的,并且可以將靜態(tài)資源進行緩存,從而減少白屏?xí)r間,加...

    104828720 評論0 收藏0
  • SpringAOP面向切面詳解(帶實例)

    摘要:了解的相關(guān)術(shù)語通知通知定義了切面是什么,以及何時使用。描述了切面要完成的工作和何時需要執(zhí)行這個工作。就是用來配置切面設(shè)置代理模式。 了解AOP的相關(guān)術(shù)語 1.通知(Advice): 通知定義了切面是什么,以及何時使用。描述了切面要完成的工作和何時需要執(zhí)行這個工作。 2.連接點(Joinpoint): 程序能夠應(yīng)用通知的一個時機,這些時機就是連接點,例如方法被調(diào)用時、異常被拋出時等等。 ...

    馬忠志 評論0 收藏0
  • CentOS 開機啟動服務(wù)詳解

    摘要:樣例啟動服務(wù)啟動服務(wù)文件說明參數(shù)說明服務(wù)的說明描述服務(wù)描述服務(wù)類別服務(wù)運行參數(shù)的設(shè)置是后臺運行的形式為服務(wù)的具體運行命令為重啟命令為停止命令表示給服務(wù)分配獨立的臨時空間服務(wù)安裝的相關(guān)設(shè)置,可設(shè)置為多用戶注意啟動重啟停止命樣例:啟動 Seahub 服務(wù)[Unit] Description=Seafile Seahub After=network.target seafile.service...

    Tecode 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<