編輯:關於Android編程
首先我們來對這三種消息提示機制來一個直觀的認識,分別是AlertDialog Toast、Notification<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20150509/201505090844483.png" title="\" />
接下來分別介紹這三種機制各自對應的使用場景和用法
使用場景:AlertDialog在應用內的使用還是很常見的,常用於讓用戶做出某種選擇,而這種選擇一定是簡單的交互,如果是復雜的就應該用另一個Activity來承接而非AlertDialog,基本用法和高級主題:請參考我以前寫過的這篇文章,介紹的很詳細:http://blog.csdn.net/qwm8777411/article/details/45420451
使用場景:首先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是那些不可見的應用程序組件(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
:
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通常用於需要立即注意和處理的事件,一般不常用
為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的界限。通知既可以是視覺上的,也可以是聽覺上的,或者使用設備的振動功能。可以使用各種方法來自定義通知以便向用戶傳遞更豐富的信息。不過需要特別注意的是通知要適當而且數量要事宜,否則用戶將對應用程序感到厭煩。
不廢話,先上圖,看看效果 這是用ExpandableListView來實現時間軸效果,原理比較簡單,以月份為第一級,以天為第二級來實現的。
前段時間,有一位網友發私信給我(@伍歌),問我做過磁場傳感器可以做過指南針嗎?其實我第一節裡面已經說過了,磁場傳感器可以做,只是算法比較麻煩,最簡單的指南針使用方向傳感器
概述 本篇博客是對developer.android.com/上的Training課程的簡單翻譯,若是覺得翻譯出來的理解有困難,請點擊下方鏈接查看原文! 關
超詳細解析定位坐標—LatLng定位中用得最多的是坐標(也就是經緯度),那麼我們首先搞清楚什麼是坐標:LatLng 類:地理坐標基本數據結構。 描述