編輯:關於Android編程
對於通知(Notification)相信沒有人陌生,只是不知道指的是什麼罷了。Notification是顯示在手機狀態欄的一種全局效果通知(手機狀態欄位於手機屏幕的最上方,用於顯示了手機當前的網絡狀態,電池狀態,時間等)。
在Android中Notification的使用也比較方便,Android為它提供了完整的套路,和AlertDialog(提示彈窗)類似,從布局到功能都有具體設定,開發者只需要填入內容和事件即可。
Notification有兩種視覺風格:標准視圖(Normal view)和大視圖(Big view)。標准視圖在Android中各版本是通用的,但是對於大視圖僅支持Android4.1+的版本。標准視圖是一個高度為64dp的通知,大視圖是一個細節部分高度為256dp的通知,當然寬度都是充滿屏幕寬的。
要想使用Notification首先要獲取通知管理器NotificationManager,獲取的方法也是固定的
NotificationManagernotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
以標准視圖通知為例,同AlertDialog類似的,API16之後建立Notification的時候需要借助其中的內部類Builder為其設置屬性,那種直接使用Notification類建立的方式已經過時了。我們可以為Notification設定如下屬性
setContentText():設置通知內容
setSamllIcon():為通知設置小圖標,如果不設置大圖標,小圖標則不顯示,大圖標顯示小圖標的圖片
setContentTitle():設置通知標題
以上三項在Notification中必不可少,所以必須設置,如果不設置會報錯。
setTicker():設置通知在狀態欄裡面的標題,即收到通知時在沒有下拉的情況下顯示幾秒鐘
setLargeIcon():為通知設置大圖標,使用BitmapFactory創建圖片。即使設置了大圖標,狀態欄仍然顯示小圖標。
setWhen(System.currentTimeMillis())設置時間(當前系統時間),默認也是這個時間,所以一般不需要設置。
setAutoCancel():設置點擊通知後,自動移除通知
setContentInfo()設置通知信息,位置在時間下面小圖標左邊
setDefaults():設置通知為默認音效、振動、閃屏,值為:
Notification.DEFAULT_SOUND:使用默認聲音
Notification.DEFAULT_VIBRATE:設置默認振動
Notification.DEFAULT_LIGHTS:設置使用默認LED燈閃爍
Notification.DEFAULT_ALL:設置使用默認聲音,振動,閃光燈
如果單個設置提示效果最後設置的會覆蓋前面的,所以只能設置其中一個。
setSound(Uri.parse("file:///sdcard/apple.mp3")):設置自定義聲音
setVibrate(newlong[]{1000,5000,1000,3000}):設置自定義振動,時長的單位是毫秒,數組中數字的含義依次是[靜止時長,震動時長,靜止時長,震動時長]
setLights(int argb, int onMs, int offMs):設定前置LED燈的閃爍速率,持續毫秒數,停頓毫秒數
注意:需要添加閃光燈和振動器的權限
android.permission.FALSHLIGHT
android.permission.VIBRATE
setProgress(int max,int progress,booleanindeterminate)設置進度條,max最大數,progress設定當前的進度,indeterminate設定是否是一個確定進度值的進度條,有進度(false),循環滾動(ture)。
setContentIntent():設置點擊通知後將要啟動的程序組件對應的PendingIntent(延時意圖)。
pendingIntent是一種特殊的Intent,主要的區別在於Intent的執行立刻的,而pendingIntent的執行不是立刻的。
完成設定以後通過Notification.Builder.build()方法獲取到Notificationg對象,再通過通知管理器notify()方法來啟動通知。這裡需要設定一個id和Notification,如果不同Notification使用相同的id後來的Notification在出現前會移除先來的Notification。
大視圖通知與標准視圖通知大體相同,它需要借助NotificationCompat.Style完成設置,然後使用NotificationCompat.Builder.setStyle()方法為Builder設置Style,再通過Notification.Builder.build()方法獲取到Notificationg對象,再通過通知管理器notify()方法來啟動通知。大視圖通知分為三種
NotificationCompat.BigPictureStyle, 在細節部分顯示一個位圖。
NotificationCompat.BigTextStyle,在細節部分顯示一個大的文本塊。
NotificationCompat.InboxStyle,在細節部分顯示一段行文本。
它們有不同的方法為它們添加細節,與標准視圖不同的是,標准視圖無論顯示多少條都是一樣的樣式,大視圖同時顯示兩條會將先出現一條隱藏細節信息僅顯示時間和大圖標。
我們知道可以通過左右滑動移除通知,也可以通過NotificationManaget.cancle()方法來移除通知,參數為整型的id,通過id來標記Notification。
一下做一個關於標准視圖通知和大視圖通知的全面的測試
布局文件如下
activity_main.xml
activity_second.xml
類文件如下
MainActivity.java
import android.app.Activity; import android.app.Notification; import android.app.Notification.Builder; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.view.View; import android.view.Window; public class MainActivity extends Activity { //通知管理器 private NotificationManager notificationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //實例化 notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); } public void sendNormal(View v){ Notification.Builder builder = new Builder(this);//獲取Notification的內部類Builder,通過Builder來為Notification設置各區域的內容 //通知有六個區域需要設置,以下三個必須設置(標題,內容,小圖標),否則報錯 builder.setSmallIcon(R.drawable.cocktail);//只設置小圖標不會顯示小圖標,而是把小圖標在大圖標的位置顯示 builder.setContentText("國慶期間,蘇州昆山巴城鎮出現“超人”,有目擊者稱他來自氪星,氪星是DC漫畫中超人的故鄉。");//內容 builder.setContentTitle("昆山驚現氪星人");//標題 builder.setDefaults(Notification.DEFAULT_SOUND);//設置提示音,這裡是系統提示音 builder.setDefaults(Notification.DEFAULT_LIGHTS);//呼吸燈提示,需要在配置文件中設置權限 builder.setDefaults(Notification.DEFAULT_VIBRATE);//震動,需要在配置文件中設置權限 //以上三條只有最後一條生效,也就是說這三種屬性只能出現一種 builder.setTicker("趣聞收鑒");//剛收到通知時在手機頂部顯示一下的內容 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.chihuahua_bone); builder.setLargeIcon(bitmap);//設置大圖標,必須是位圖 builder.setContentInfo("趣聞");//設置小圖標旁邊的消息 builder.setWhen(System.currentTimeMillis());//設置小圖標上面顯示的時間,不設置會顯示系統時間,這裡也是系統時間 //PandingIntent與Intent的區別在於PandingIntent是延遲意圖,並非像Intent一般啟動就執行,而是等用戶點擊後才執行 PendingIntent pIntent = PendingIntent.getActivity(this, 1, //請求碼 new Intent(this,SecondActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);//設置事件為廣播刷新後覆蓋原信息 builder.setContentIntent(pIntent);//設置意圖 builder.setAutoCancel(true);//設置自動移除,即點擊後移除 Notification build = builder.build();//獲取Notification notificationManager.notify(1,build);//執行通知,需要設置ID } public void sendBig(View v){ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.chihuahua_bone);//設置小圖標,同上 builder.setContentTitle("大視圖的標題1");//設置標題,同上 builder.setDefaults(Notification.DEFAULT_ALL);//設置全部提示效果 NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); inboxStyle.setBigContentTitle("大視圖的標題2");//這裡再設置一次標題會覆蓋之前設置的 inboxStyle.addLine("大視圖的第一段文字");//增加文字段 inboxStyle.addLine("大視圖的第二段文字"); inboxStyle.addLine("大視圖的第三段文字"); inboxStyle.addLine("大視圖的第四段文字"); inboxStyle.addLine("大視圖的第五段文字"); inboxStyle.setSummaryText("www.briup.com");//設置總結文字,顯示在最下面 builder.setStyle(inboxStyle); Notification build = builder.build(); notificationManager.notify(2, build);//同上,ID如果設置相同只能顯示一個通知,如果已經有了一個會先移除再顯示新的 } public void cancle(View v){ notificationManager.cancel(2);//通過ID移除通知 } public void progress(View v){ Notification.Builder builder = new Notification.Builder(this); builder.setSmallIcon(R.drawable.chihuahua_bone); builder.setContentTitle("Loading..."); builder.setContentText("DownLoading"); builder.setProgress(100, 0, true); builder.setAutoCancel(true); Notification build = builder.build(); notificationManager.notify(3,build); } }
SecondActivity.java
import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import android.view.View; import android.view.Window; public class SecondActivity extends Activity { private NotificationManager notificationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_second); notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); } public void picture(View v){ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.cocktail); NotificationCompat.BigPictureStyle picture = new NotificationCompat.BigPictureStyle(); picture.setBigContentTitle("BigPicture"); picture.setSummaryText("www.briup.com");//顯示在標題下面 Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.chihuahua_bone); picture.bigPicture(b); builder.setStyle(picture); Notification build = builder.build(); notificationManager.notify(1, build); } public void text(View v){ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.cocktail); NotificationCompat.BigTextStyle text = new NotificationCompat.BigTextStyle(); text.setBigContentTitle("BigText"); text.setSummaryText("www.briup.com");//顯示在最下面 String cs = "那是一個科技高度發達,變異生物橫行的時代。作為萬獸之靈的人類成為了變異的中心,同時也迎來了一個時代的終結,一個世界的終結。變異的人類獲得了不凡的能力,某種程度上,這代表著一種進化。很快擁有超能力的人類開始與正常人類格格不入,人類之間的分歧日益變大,矛盾愈演愈烈,大小沖突發生在世界各地,由於變異人類的數量較少,總是被人類軍隊暴力鎮壓。逐漸的,變異的人類開始結盟,而只有具有相同特性的變異人類才願意作為同盟,畢竟混亂的年代沒有共同的利益也就沒有信任。傳說中具有永生能力的狼人陣營和吸血鬼陣營是兩大最強聯盟,它們自稱“狼啃族”和“吸血鬼皇室”。由於天生就是宿敵,在和人類保持對峙的同時,兩大陣營亦在暗自較勁。"; text.bigText(cs); builder.setStyle(text); Notification build = builder.build(); notificationManager.notify(2, build); } }
配置文件如下
當然了,關於通知在實際開發中都是在一定條件下被動的彈出來的,而不是像上面這樣主動點擊,以上只是一個練習Notification的測試。
本文介紹MediaPlayer的使用。MediaPlayer可以播放音頻和視頻,另外也可以通過VideoView來播放視頻,雖然VideoView比MediaPlayer
項目包 src --java源代碼 gen文件夾 -- 資源文件,修改後自動生成 ---R.java
MainActivity:package com.ruru.dialogproject; import android.app.Activity; import andr
效果圖實現代碼public class ScrollBanner extends LinearLayout { private TextView mBannerTV