溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android中Service的理解與使用

發(fā)布時(shí)間:2020-07-18 15:08:03 來(lái)源:網(wǎng)絡(luò) 閱讀:450 作者:tlw90 欄目:移動(dòng)開(kāi)發(fā)

Android四大大組件

Activity:帶界面的。

BroadcastReceiver:廣播接收者,不帶界面,當(dāng)對(duì)應(yīng)的廣播事件發(fā)出來(lái)的時(shí)候,它就可以收到。

ContentProvider:內(nèi)容提供者,主要用于暴露數(shù)據(jù)給其他的應(yīng)用程序去使用。

Service:服務(wù)可以在后臺(tái)運(yùn)行的,不帶界面的。

1.Service服務(wù)

1.1.服務(wù)的寫(xiě)法: 

第一步:寫(xiě)個(gè)類(lèi)去繼承服務(wù)Service

第二步:重寫(xiě)服務(wù)的oncreate,ondestroy方法,OnCreate:服務(wù)對(duì)象創(chuàng)建的時(shí)候會(huì)執(zhí)行Ondestroy: 服務(wù)對(duì)象銷(xiāo)毀的時(shí)候會(huì)執(zhí)行。

第三步: 服務(wù)需要到清單文件中注冊(cè). <serviceandroid:name="cn.itcast.servicequickstart.QuickStartService"></service>

2.為什么需要服務(wù):需要去翻看文檔,Java的doc的文檔,一般都是程序自動(dòng)生成的,在看的時(shí)候,一般都去到文檔的目錄下找一個(gè)叫做index.html的文檔。這個(gè)是一個(gè)常識(shí)。

Android系統(tǒng)會(huì)讓一個(gè)應(yīng)用程序的進(jìn)程活的盡可能的長(zhǎng),但是也會(huì)去回收老的進(jìn)程以便于新的或者更加重要的進(jìn)程可以順暢的跑起來(lái)。

為了能夠決定哪些進(jìn)程先被殺死,哪些后被殺死,android系統(tǒng)中將進(jìn)程按照優(yōu)先級(jí)做了劃分,優(yōu)先級(jí)最低最先被干掉.然后以此類(lèi)推,從而去回收系統(tǒng)的資源。

進(jìn)程按照優(yōu)先級(jí)分為5種:

第一種:Android中Service的理解與使用前臺(tái)進(jìn)程,一個(gè)應(yīng)用程序有組件正在運(yùn)行著,獲得了焦點(diǎn),可以響應(yīng)用戶的點(diǎn)擊觸摸事件。

第二種:Android中Service的理解與使用可視進(jìn)程,一個(gè)應(yīng)用程序有組件正在運(yùn)行著,但是失去了焦點(diǎn),只是還看得見(jiàn)。

第三種:Android中Service的理解與使用服務(wù)進(jìn)程,如果一個(gè)應(yīng)用程序中一個(gè)service在后臺(tái)長(zhǎng)期運(yùn)行著,那么就可以稱之為服務(wù)進(jìn)程。

第四種:Android中Service的理解與使用后臺(tái)進(jìn)程,一個(gè)應(yīng)用程序中沒(méi)有service在后臺(tái)運(yùn)行,只有activity其他的組件在切換到了后臺(tái),那么就是屬于后臺(tái)進(jìn)程。

第五種:Android中Service的理解與使用空進(jìn)程,一個(gè)應(yīng)用程序中沒(méi)有任何組件在運(yùn)行著,那么就是屬于空進(jìn)程。

3.開(kāi)啟服務(wù)的生命周期:服務(wù)創(chuàng)建的時(shí)候會(huì)調(diào)用oncreate的方法 然后服務(wù)就一直在后臺(tái)運(yùn)行著,開(kāi)啟服務(wù)的時(shí)候會(huì)調(diào)用startService,那么服務(wù)的onstartCommand會(huì)執(zhí)行,多次開(kāi)啟服務(wù),并不會(huì)多次創(chuàng)建服務(wù),服務(wù)只能被創(chuàng)建一次, 多次開(kāi)啟只會(huì)重復(fù)調(diào)用onstartCommand,服務(wù)銷(xiāo)毀的之后會(huì)調(diào)用ondestroy方法。

開(kāi)啟服務(wù),服務(wù)后會(huì)一直在后臺(tái)運(yùn)行著,與開(kāi)啟服務(wù)的組件activity沒(méi)有關(guān)系了。

4.本地服務(wù)中的方法調(diào)用:本地服務(wù)的調(diào)用一般用的不多,大家可以將遠(yuǎn)程服務(wù)調(diào)用的代碼好好寫(xiě)寫(xiě)。

5.遠(yuǎn)程服務(wù)調(diào)用:

5.1.第一部分--支付寶:編寫(xiě)支付寶的應(yīng)用程序.需要有個(gè)服務(wù).服務(wù)與早上寫(xiě)的類(lèi)似.A)publicclassAlipayServiceextendsServiceB)自動(dòng)的會(huì)覆蓋onBind的方法C)編寫(xiě)一個(gè)私有的內(nèi)部類(lèi),去繼承一個(gè)由aidl文件生成的接口的Stub內(nèi)部類(lèi)。打開(kāi)生成的.java類(lèi),發(fā)現(xiàn)里面有一個(gè)內(nèi)部類(lèi)Stub,繼承了Binder,實(shí)現(xiàn)了IAlilpayNeixian的接口。AIDL)讓編寫(xiě)的私有的內(nèi)部類(lèi)(內(nèi)線)去繼承Stub類(lèi)//內(nèi)線類(lèi)去調(diào)用 pay的方法,從而完成支付

private class AlipayNeixianextends IAlipayNeixian.Stub{

@Override

public boolean callPay(Stringaccount, double money) {                         returnpay(account,money);                                             }  } )

在onBind方法中return內(nèi)線的實(shí)例對(duì)象

@Override

publicIBinder onBind(Intent intent){

System.out.println("onBind服務(wù)被綁定了...");

returnnewAlipayNeixian();

}

編寫(xiě)服務(wù)中最終要被調(diào)用到的方法pay方法

publicbooleanpay(Stringaccount,doublemoney){

System.out.println( account +"帳號(hào),支付了 "+money);

returntrue;  }

到清單文件中,配置AlipayService,由于一會(huì)需要讓美團(tuán)可以去激活這個(gè)服務(wù),所以需要配置隱式意圖。
<!--配置隱式意圖-><serviceandroid:name="cn.itcast.alipay.AlipayService">

<intent-filter><actionandroid:name="cn.itcast.ALIPAY"/></intent-filter></service>

5.2. 第二部分---美團(tuán):由于aidl用于規(guī)定兩個(gè)不同應(yīng)用程序之間通信的一個(gè)規(guī)則,所以這里需要將支付寶中的那個(gè)aidl文件直接copy過(guò)來(lái). 注意,需要帶包名copyAndroid中Service的理解與使用 A)編寫(xiě)布局文件Android中Service的理解與使用 B)編寫(xiě)布局文件中按鈕點(diǎn)擊的邏輯.Android中Service的理解與使用 C)調(diào)用服務(wù)中的方法編寫(xiě)具體的邏輯綁定服務(wù).

public voidbind(View v){                  //              Intent intent = new Intent(this,AlipayS)                  Intentintent = new Intent();                  intent.setAction("cn.itcast.ALIPAY");                                    mConn = newMyServiceConnection();                                    //綁定服務(wù)                  bindService(intent, mConn,BIND_AUTO_CREATE);                  } 
  // Connecetion內(nèi)部類(lèi)的邏輯private classMyServiceConnection implements ServiceConnection{                  @Override                  public voidonServiceConnected(ComponentName name, IBinder service) {                                                      //之前是強(qiáng)轉(zhuǎn),現(xiàn)在就不用了.                                                      mNeixian = IAlipayNeixian.Stub.asInterface(service);                                             }                   @Override                  public voidonServiceDisconnected(ComponentName name) {                                             }                          }  6.   關(guān)于aidl技術(shù):Aidl--- android inteface definition language ---安卓接口定義語(yǔ)言.主要用于規(guī)定進(jìn)程間通信的規(guī)則. 在編寫(xiě)aidl文件的時(shí)候,注意寫(xiě)法與寫(xiě)接口很類(lèi)似. 首先寫(xiě)接口,寫(xiě)完后把public這樣的訪問(wèn)修飾符干掉. 其余照搬過(guò)來(lái). 擴(kuò)展名記得要改成.aidl ,這些寫(xiě)好了之后,刷新,會(huì)自動(dòng)的生成 .java類(lèi)在gen的目錄下.例如: 
Android中Service的理解與使用 如果aidl文件的方法中的接收的參數(shù),還有返回值是8種基本數(shù)據(jù)類(lèi)型或者String類(lèi)型的數(shù)據(jù),那么可以直接寫(xiě).但是如果接收的參數(shù)或者返回值的類(lèi)型是復(fù)雜的類(lèi)型(對(duì)象類(lèi)型的數(shù)據(jù)),這個(gè)時(shí)候?qū)?yīng)的對(duì)象數(shù)據(jù)類(lèi)型的類(lèi)必須要去實(shí)現(xiàn)Parceable的接口或者Serializable的接口.   關(guān)于aidl文件更多的內(nèi)容,請(qǐng)參考 官方文檔. Android中Service的理解與使用   7.   綁定服務(wù)的生命周期(了解):    8.   混合開(kāi)啟服務(wù)(了解): 開(kāi)啟服務(wù)服務(wù)可以一直在后臺(tái)運(yùn)行, 但是不能直接調(diào)用服務(wù)中的方法綁定服務(wù)服務(wù)不可以一直在后臺(tái)運(yùn)行,但是可以調(diào)用服務(wù)中的方法.  既可以長(zhǎng)期的在后臺(tái)運(yùn)行,又可以調(diào)用服務(wù)中的方法,那么就會(huì)自然而然想到混合開(kāi)啟. 混合開(kāi)啟請(qǐng)嚴(yán)格按照如下的順序去編程 Android中Service的理解與使用 ====多媒體編程====多媒體:多種媒體的一個(gè)集合... 圖形,聲音,視頻,傳感器,照相機(jī),動(dòng)畫(huà)....  9.   圖形處理相關(guān):9.1. 顯示普通的小圖片://讓圖片顯示到ImageView中    Bitmap bitmap =BitmapFactory.decodeFile("/mnt/sdcard/bb.jpg");        mIv_pic.setImageBitmap(bitmap);9.2. 顯示大圖片(重要):大圖片,由于占用的內(nèi)存空間比較大,很多時(shí)候需要進(jìn)行縮放處理.縮放處理,需要找到合適的縮放比  1.需要知道圖片的寬高信息,
                           //Extended information接口                           ExifInterfaceinfo = new ExifInterface("/mnt/sdcard/big.jpg");                                                      intp_w_picpathWidth = info.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0);                           intp_w_picpathHeight = info.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0);                                                      System.out.println("p_w_picpathWidth:" + p_w_picpathWidth+", p_w_picpathHeight : "+ p_w_picpathHeight);  2.需要知道手機(jī)屏幕的寬高信息.
              int screenWidth =getWindowManager().getDefaultDisplay().getWidth();                           intscreenHeight = getWindowManager().getDefaultDisplay().getHeight();                           System.out.println("screenWidth:"+screenWidth +", screenHeight : "+screenHeight);  // 3.基于圖片的寬高和屏幕的寬高找到合適的縮放的比
          int scale1= p_w_picpathWidth/screenWidth;        // 5                           intscale2 = p_w_picpathHeight/screenHeight;      // 7                                                      //拿到縮放比                           intscale =0;                           if(scale1>=scale2){                                    scale=scale1;                           }else{                                    scale=scale2;                           }                                                      Options opts = new Options();                           opts.inSampleSize = scale;  // 4,  寬高都變?yōu)樵瓉?lái)的1/4,那么就變成了1/16                                                       Bitmapbitmap = BitmapFactory.decodeFile("/mnt/sdcard/big.jpg",opts); 10. 常規(guī)的圖片的處理:圖片可以縮放,旋轉(zhuǎn),平移, 倒影,鏡面10.1.   核心的代碼: 
                  //顯示處理后的圖                                    //參考了現(xiàn)實(shí)生活中畫(huà)畫(huà)臨摹的過(guò)程來(lái)實(shí)現(xiàn)的.                                    //這個(gè)bitmap目前是一個(gè)空白的bitmap ,什么都沒(méi)有,                  //只是有了寬高,以及配置信息.                  Bitmap createBitmap =Bitmap.createBitmap(orginalBitmap.getWidth(), orginalBitmap.getHeight(),orginalBitmap.getConfig());                                    //畫(huà)布--- Canvas                  Canvas canvas = new Canvas(createBitmap);                                    Matrix matrix = new Matrix(); //矩陣                                    Paint paint = new Paint(); //畫(huà)筆                                    canvas.drawBitmap(orginalBitmap, matrix, paint);                                    //顯示處理后的圖                  mIv_processed.setImageBitmap(createBitmap);                    10.2.   處理:l 縮放://寬高各變?yōu)樵瓉?lái)的60%//  matrix.setScale(0.6f,0.6f); l 平移:matrix.setTranslate(100,0); //向x軸正方向平移100像素l 旋轉(zhuǎn):matrix.setRotate(40);  //旋轉(zhuǎn)40度    //圍繞著圖片的中心旋轉(zhuǎn)90度matrix.setRotate(90,createBitmap.getWidth()/2,createBitmap.getHeight()/2); l 鏡面:在 x軸的值變?yōu)樨?fù)值之后,再進(jìn)行平移.matrix.setScale(-1, 1);matrix.postTranslate(createBitmap.getWidth(),0); l 倒影:matrix.setScale(1, -1);matrix.postTranslate(0,createBitmap.getHeight()); 具體的參考代碼
Android中Service的理解與使用  作業(yè):1.服務(wù)的5種優(yōu)先級(jí).2.服務(wù)開(kāi)啟后會(huì)一直在后臺(tái)運(yùn)行..3.美圖調(diào)用支付寶4.圖形顯示大圖片.獲得圖片的寬高. 屏幕的寬高.5.效果...       


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI