Android訊息提示:AlertDialog、Toast、Notification的使用
首先我們來對這三種訊息提示機制來一個直觀的認識,分別是AlertDialog Toast、Notification
接下來分別介紹這三種機制各自對應的使用情境和用法
AlertDialog
使用情境:AlertDialog在應用內的使用還是很常見的,常用於讓使用者做出某種選擇,而這種選擇一定是簡單的互動,如果是複雜的就應該用另一個Activity來承接而非AlertDialog,基本用法和進階主題:請參考我以前寫過的這篇文章,介紹的很詳細:http://blog.csdn.net/qwm8777411/article/details/45420451
Toast的使用
使用情境:首先Toast有兩個顯著的特點:
1,Toast提示訊息不會獲得焦點;
2,Toast提示訊息過一段時間會自動消失。
基於以上兩點,Toast常用於提示一些不需要和使用者互動的簡單訊息,
基本用法:既可以建立簡單的用於文本提示的Toast,也可以建立自訂View的Toast
使用簡單Toast的基本步驟:
1,通過Toast的靜態方法makeText()建立一個Toast對象2,調用Toast的其他方法設定屬性3,調用show()方法將它顯示出來;
它的使用比較簡單,大部分用來顯示簡單的文本提示;如果應用需要顯示諸片、列表之類的複雜提示、一般使用對話方塊來完成。當然可以通過setView()方法實現定製的Toast視圖;
顯示文本的簡單Toast
Toast toast=ToastmakeText(context,簡訊,Toast.LENGTH_SHORT); toast.show();
自訂View的Toast:
Toast toast=new Toast(Context context); toast.setGravity(Gravity.CENTER,0,0);//設定顯示位置 toast.setView(R.layout.toast_view);//設定視圖 toast.setDuration(Toast.LENGTH_SHORT);//設定顯示時間長度 toast.show();
Notification的使用
**使用情境:**Notification是那些不可見的應用程式組件(BroadcastReceiver、Service、非使用中的Activity)的首選機制用來提醒使用者,需要他們注意的事件已經發生。也可以用來指示持續啟動並執行後台Service。
Notification是應用程式提醒使用者發生某些事件的一種方式,無需某個Activity可見,Notification是由NotificationManager進行處理的;當前包括以下功能:
顯示狀態列表徵圖 :
燈光閃爍
讓手機震動
發出聲音提醒
在通知托盤中使用互動式操作來廣播Intent
使用Notification的基本步驟:
1,建立NotificationManager
NotificationManager nm= (NotificationManager)getSystemService(SEREVICE_NOTIFICATION);
2,一般方法建立Notification
int icon=R.drawable.icon; String ticker=一條新訊息; Long when=System.currentTimeMillis; //分別對應通知顯示的表徵圖,ticker文字和顯示順序按時間排列 Notification notification=new Notification(icon,ticker,when);
3,使用Notification Builder建立Notification
Notification還有另外一種建立方法,Notification Builder是在Android 3.0引入的,簡化了上述過程;
Notification.Builder builder=new Notification.Builder(Context context); builder.setSmallcon(R.drawable.icon); builder.setDefaults(); NotificationManager manager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE); /* *此處的ID值作為Notification的唯一標示, */ manager.notify(int id,builder.build());//觸發Notification
通過以上步驟我們已經可以建立一個Notification並且顯示在通知欄中,但還有幾點需要注意:
//也可以通過以下方法設定Notification屬性 setLastEventInfo(context,string ticker,string content,PendingIntent intent); //如果ID相同的話將被更新而不是重建(例如連續下載) manager.notify(ID,notification); //更新通知:通知不應該一直在通知欄裡,需要複用或者更新通知,可以使用一個計數器 setNumber(4); //清除通知: manager.cancel(ID); //或者使用 builder.setAutoCancel(true);
使用自訂View的Notification:
RemoteView:RemoteView view=new RemoteView(getPackageName(),R.layout.remote);//自訂的視圖notification.setView(view);
有了上面的知識我們來實現一個綜合練習,實現的效果:
MainActivity.java
:<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">public class MainActivity extends ActionBarActivity implements View.OnClickListener { private Button simpleToast,customToast; private Button simpleNotification,customNotification; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); simpleToast= (Button) findViewById(R.id.simple_toast); customToast= (Button) findViewById(R.id.custom_toast); simpleNotification= (Button) findViewById(R.id.simple_notification); customNotification= (Button) findViewById(R.id.custom_notification); simpleToast.setOnClickListener(this); customToast.setOnClickListener(this); simpleNotification.setOnClickListener(this); customNotification.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.simple_toast: simpleToast(); break; case R.id.custom_toast: customToast(); break; case R.id.simple_notification: simpleNotification(); break; case R.id.custom_notification: customNotification(); break; } } public void simpleToast(){ // 顯示一個簡單的文本資訊 Toast toast=Toast.makeText(MainActivity.this, This is a simple Toast, Toast.LENGTH_SHORT); toast.show(); } public void customToast(){ Toast toast=new Toast(MainActivity.this); // 設定Toast的顯示位置 toast.setGravity(Gravity.BOTTOM, 0, 0); // 設定Toast的視圖,這裡我們添加一張圖片 LinearLayout layout=new LinearLayout(getApplicationContext()); layout.setOrientation(LinearLayout.VERTICAL); ImageView imageView=new ImageView(getApplicationContext()); imageView.setImageResource(R.mipmap.touxiang);//設定一張圖片 layout.addView(imageView,new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT)); toast.setView(layout); // 設定顯示時間長度 toast.setDuration(Toast.LENGTH_SHORT); toast.show(); } public void simpleNotification(){ // 擷取NotificationManager執行個體 NotificationManager manager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE); // 構造Notification.Builder 對象 NotificationCompat.Builder builder=new NotificationCompat.Builder(MainActivity.this); // 設定Notification表徵圖 builder.setSmallIcon(R.mipmap.ic_launcher); //builder.setLargeIcon(myIcon); // 設定Notification tickertext builder.setTicker(A new Message); // 設定通知的題目 builder.setContentTitle(A new notification); // 設定通知的內容 builder.setContentText(This is content text); builder.setContentInfo(Info); // 設定通知可以被自動取消 builder.setAutoCancel(true); // 設定通知欄顯示的Notification按時間排序 builder.setWhen(System.currentTimeMillis()); // 設定其他物理屬性,包括通知提示音、震動、螢幕下方LED燈閃爍 builder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));//這裡設定一個本地檔案為提示音 builder.setVibrate(new long[]{1000,1000,1000,1000}); builder.setLights(Color.RED,0,1); // 設定該通知點擊後將要啟動的Intent,這裡需要注意PendingIntent的用法,構造方法中的四個參數(context,int requestCode,Intent,int flags); Intent intent=new Intent(MainActivity.this,AnotherActivity.class); PendingIntent pi=PendingIntent.getActivity(MainActivity.this,0,intent,0); builder.setContentIntent(pi); // 執行個體化Notification Notification notification=builder.build();//notify(int id,notification對象);id用來標示每個notification manager.notify(1,notification); } public void customNotification(){ NotificationManager manager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder builder=new NotificationCompat.Builder(MainActivity.this); builder.setTicker(音樂現正播放); builder.setSmallIcon(R.mipmap.ic_launcher); builder.setWhen(System.currentTimeMillis()); builder.setAutoCancel(true); // 設定自訂RemoteView RemoteViews view=new RemoteViews(getPackageName(),R.layout.remote_view); builder.setContent(view); PendingIntent pi=PendingIntent.getActivity(MainActivity.this,1,new Intent(MainActivity.this,AnotherActivity.class),0); builder.setContentIntent(pi); builder.setOngoing(true); manager.notify(2, builder.build()); } }
通過上面的練習我們已經基本掌握了Notification的用法,下面是常用的一些進階主題:
builder.setLargeIcon(Bitmap 對象); //設定一個大圖片 builder.setProgress(Max,value,false);//設定通知顯示為一個進度條 手動設定setContentView(RemoteView對象)時;必須同時設定setContentIntent 要觸發一個Notification,需要把它和一個整型的引用ID傳遞給Notification Manager的notify方法。如果已經使用一個Notification Builder構造,可以使用builder。getNotification(); 要更新一個Notification就需要把相同的ID傳給Notification Manager,既可以傳入一個相同的Notification對象,又可以傳入一個不同的,只要ID值相同,新的Notification就會替換原來的,要更新Notification而不引起相關聯的閃燈、音頻、和震動,可以使用NotificationBuilder.setOnlyAlertOnce(true);另外可以使用Notificationmanager.flags=Notification.FLAG_ONLY_ALERT_ONCE; 通常是點擊操作後取消通知:單擊後自動取消自己setAutoCancel(true); 也可以使用NotificationManager manager.cancel(ID);
配置持續和連續的Notification:
通過Notification的FLAG_INSISTENT 和 FLAG_ONGOING_EVENT標誌,可以將Notification配置成連續的和不連續的。
標記為持續的Notification可以表示那些當前進行中的事件(如正在下載)
使用builder.setOngoing(true); 也可以使用Notification.flags=FLAG_ONGOING_EVENT,前台service必須具有連續的Notification(音樂播放?)
連續的Notification會一直重複音頻、震動和閃屏,直到取消為止。這些Notification通常用於需要立即注意和處理的事件,一般不常用
可以通過notification.flags=Notification.FLAG_INSISTENET,不推薦第三方應用使用,所以builder中無此方法
為RemoteView中的View附加單擊監聽器:
需要傳入關聯的View資源ID和當view點擊後的PendingIntent
Intent i=new Intent(BUTTON_CLICK);PendingIntent pi=PendingIntent.getActivity(MyActivity.this,2.i,0); notification.contentView.setOnClickPendingIntent(R.id.status_progress,pi); //單擊Notification布局中任何沒有採用這種方式綁定的地區將會觸發Notification的內容Intent
總結:設計有用的通知:
Android平台的通知功能非常強健,以至於你有可能過度使用,下面是一些良好的建議:
* 只有在應用不處於前台是使用通知,否則使用Toast和AlertDialog* 允許使用者選擇他想要的通知類型和頻率,以及在什麼情況下觸發通知* 經常性地清理通知以避免向使用者提供過時的訊息* 在不確定的情況下,使用柔和的通知語言* 確保在通知的Ticker文字,標題和本文包含有用的訊息,並且運行有意義的Intent;
通知架構雖然輕量但卻很強大,不過,諸如鬧鐘和股票監控器這樣的軟體可能會需要提供超越通知架構的功能,在這種情況下,它們可能會使用後台服務並且在特定事件到達時使用自己完整的Activity,應用程式可以使用通知來與使用者互動,而超越其自身Activity的界限。通知既可以是視覺上的,也可以是聽覺上的,或者使用裝置的震動功能。可以使用各種方法來自訂通知以便向使用者傳遞更豐富的資訊。不過需要特別注意的是通知要適當而且數量要事宜,否則使用者將對應用程式感到厭煩。