您好,登錄后才能下訂單哦!
Android四大大組件
Activity:帶界面的。
BroadcastReceiver:廣播接收者,不帶界面,當對應的廣播事件發出來的時候,它就可以收到。
ContentProvider:內容提供者,主要用于暴露數據給其他的應用程序去使用。
Service:服務可以在后臺運行的,不帶界面的。
1.Service服務
1.1.服務的寫法:
第一步:寫個類去繼承服務Service
第二步:重寫服務的oncreate,ondestroy方法,OnCreate:服務對象創建的時候會執行Ondestroy: 服務對象銷毀的時候會執行。
第三步: 服務需要到清單文件中注冊. <serviceandroid:name="cn.itcast.servicequickstart.QuickStartService"></service>
2.為什么需要服務:需要去翻看文檔,Java的doc的文檔,一般都是程序自動生成的,在看的時候,一般都去到文檔的目錄下找一個叫做index.html的文檔。這個是一個常識。
Android系統會讓一個應用程序的進程活的盡可能的長,但是也會去回收老的進程以便于新的或者更加重要的進程可以順暢的跑起來。
為了能夠決定哪些進程先被殺死,哪些后被殺死,android系統中將進程按照優先級做了劃分,優先級最低最先被干掉.然后以此類推,從而去回收系統的資源。
進程按照優先級分為5種:
第一種:前臺進程,一個應用程序有組件正在運行著,獲得了焦點,可以響應用戶的點擊觸摸事件。
第二種:可視進程,一個應用程序有組件正在運行著,但是失去了焦點,只是還看得見。
第三種:服務進程,如果一個應用程序中一個service在后臺長期運行著,那么就可以稱之為服務進程。
第四種:后臺進程,一個應用程序中沒有service在后臺運行,只有activity其他的組件在切換到了后臺,那么就是屬于后臺進程。
第五種:空進程,一個應用程序中沒有任何組件在運行著,那么就是屬于空進程。
3.開啟服務的生命周期:服務創建的時候會調用oncreate的方法 然后服務就一直在后臺運行著,開啟服務的時候會調用startService,那么服務的onstartCommand會執行,多次開啟服務,并不會多次創建服務,服務只能被創建一次, 多次開啟只會重復調用onstartCommand,服務銷毀的之后會調用ondestroy方法。
開啟服務,服務后會一直在后臺運行著,與開啟服務的組件activity沒有關系了。
4.本地服務中的方法調用:本地服務的調用一般用的不多,大家可以將遠程服務調用的代碼好好寫寫。
5.遠程服務調用:
5.1.第一部分--支付寶:編寫支付寶的應用程序.需要有個服務.服務與早上寫的類似.A)publicclassAlipayServiceextendsServiceB)自動的會覆蓋onBind的方法C)編寫一個私有的內部類,去繼承一個由aidl文件生成的接口的Stub內部類。打開生成的.java類,發現里面有一個內部類Stub,繼承了Binder,實現了IAlilpayNeixian的接口。AIDL)讓編寫的私有的內部類(內線)去繼承Stub類//內線類去調用 pay的方法,從而完成支付
private class AlipayNeixianextends IAlipayNeixian.Stub{
@Override
public boolean callPay(Stringaccount, double money) { returnpay(account,money); } } )
在onBind方法中return內線的實例對象
@Override
publicIBinder onBind(Intent intent){
System.out.println("onBind服務被綁定了...");
returnnewAlipayNeixian();
}
編寫服務中最終要被調用到的方法pay方法
publicbooleanpay(Stringaccount,doublemoney){
System.out.println( account +"帳號,支付了 "+money);
returntrue; }
到清單文件中,配置AlipayService,由于一會需要讓美團可以去激活這個服務,所以需要配置隱式意圖。
<!--配置隱式意圖-><serviceandroid:name="cn.itcast.alipay.AlipayService">
<intent-filter><actionandroid:name="cn.itcast.ALIPAY"/></intent-filter></service>
5.2. 第二部分---美團:由于aidl用于規定兩個不同應用程序之間通信的一個規則,所以這里需要將支付寶中的那個aidl文件直接copy過來. 注意,需要帶包名copy A)編寫布局文件 B)編寫布局文件中按鈕點擊的邏輯. C)調用服務中的方法編寫具體的邏輯綁定服務.
public voidbind(View v){ // Intent intent = new Intent(this,AlipayS) Intentintent = new Intent(); intent.setAction("cn.itcast.ALIPAY"); mConn = newMyServiceConnection(); //綁定服務 bindService(intent, mConn,BIND_AUTO_CREATE); }
// Connecetion內部類的邏輯private classMyServiceConnection implements ServiceConnection{ @Override public voidonServiceConnected(ComponentName name, IBinder service) { //之前是強轉,現在就不用了. mNeixian = IAlipayNeixian.Stub.asInterface(service); } @Override public voidonServiceDisconnected(ComponentName name) { } } 6. 關于aidl技術:Aidl--- android inteface definition language ---安卓接口定義語言.主要用于規定進程間通信的規則. 在編寫aidl文件的時候,注意寫法與寫接口很類似. 首先寫接口,寫完后把public這樣的訪問修飾符干掉. 其余照搬過來. 擴展名記得要改成.aidl ,這些寫好了之后,刷新,會自動的生成 .java類在gen的目錄下.例如: 如果aidl文件的方法中的接收的參數,還有返回值是8種基本數據類型或者String類型的數據,那么可以直接寫.但是如果接收的參數或者返回值的類型是復雜的類型(對象類型的數據),這個時候對應的對象數據類型的類必須要去實現Parceable的接口或者Serializable的接口. 關于aidl文件更多的內容,請參考 官方文檔. 7. 綁定服務的生命周期(了解): 8. 混合開啟服務(了解): 開啟服務服務可以一直在后臺運行, 但是不能直接調用服務中的方法綁定服務服務不可以一直在后臺運行,但是可以調用服務中的方法. 既可以長期的在后臺運行,又可以調用服務中的方法,那么就會自然而然想到混合開啟. 混合開啟請嚴格按照如下的順序去編程 ====多媒體編程====多媒體:多種媒體的一個集合... 圖形,聲音,視頻,傳感器,照相機,動畫.... 9. 圖形處理相關:9.1. 顯示普通的小圖片://讓圖片顯示到ImageView中 Bitmap bitmap =BitmapFactory.decodeFile("/mnt/sdcard/bb.jpg"); mIv_pic.setImageBitmap(bitmap);9.2. 顯示大圖片(重要):大圖片,由于占用的內存空間比較大,很多時候需要進行縮放處理.縮放處理,需要找到合適的縮放比 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.需要知道手機屏幕的寬高信息.
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, 寬高都變為原來的1/4,那么就變成了1/16 Bitmapbitmap = BitmapFactory.decodeFile("/mnt/sdcard/big.jpg",opts); 10. 常規的圖片的處理:圖片可以縮放,旋轉,平移, 倒影,鏡面10.1. 核心的代碼:
//顯示處理后的圖 //參考了現實生活中畫畫臨摹的過程來實現的. //這個bitmap目前是一個空白的bitmap ,什么都沒有, //只是有了寬高,以及配置信息. Bitmap createBitmap =Bitmap.createBitmap(orginalBitmap.getWidth(), orginalBitmap.getHeight(),orginalBitmap.getConfig()); //畫布--- Canvas Canvas canvas = new Canvas(createBitmap); Matrix matrix = new Matrix(); //矩陣 Paint paint = new Paint(); //畫筆 canvas.drawBitmap(orginalBitmap, matrix, paint); //顯示處理后的圖 mIv_processed.setImageBitmap(createBitmap); 10.2. 處理:l 縮放://寬高各變為原來的60%// matrix.setScale(0.6f,0.6f); l 平移:matrix.setTranslate(100,0); //向x軸正方向平移100像素l 旋轉:matrix.setRotate(40); //旋轉40度 //圍繞著圖片的中心旋轉90度matrix.setRotate(90,createBitmap.getWidth()/2,createBitmap.getHeight()/2); l 鏡面:在 x軸的值變為負值之后,再進行平移.matrix.setScale(-1, 1);matrix.postTranslate(createBitmap.getWidth(),0); l 倒影:matrix.setScale(1, -1);matrix.postTranslate(0,createBitmap.getHeight()); 具體的參考代碼 作業:1.服務的5種優先級.2.服務開啟后會一直在后臺運行..3.美圖調用支付寶4.圖形顯示大圖片.獲得圖片的寬高. 屏幕的寬高.5.效果...
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。