android開發 -- Notification 狀態列 訊息推送
這裡推薦下另一片文章: Android 通知欄Notification的整合 全面學習 (一個DEMO讓你完全瞭解它)
http://blog.csdn.net/vipzjyno1/article/details/25248021/
Notification用於在狀態列顯示資訊。這些資訊一般來源於app的訊息推送,或應用的一些功能控制(如播放器)
Notification的兩種檢視
普通檢視
借用官方的圖片說明一下Notification檢視中包括的內容
1. 內容標題
2. 大圖示(Bitmap)
3. 正文內容
4. 附加資訊
5. 小圖示
6. Notification的推送時間
大檢視
除了上圖中標出的第7點外,其他的基本和普通檢視中的一樣。
其中第7點可顯示為一下幾種內容
1. 顯示大圖片
在詳情區域可以顯示一張最大為256dp的圖片
2. 顯示長文字
在詳情區域顯示長文字
3. inbox style(因為不知道中文怎樣才能說得準確,這裡用英文表達)
inbox style在詳情區域顯示多行文字.
4. 大內容標題
允許使用者為擴充套件檢視定義另一個標題。
5. 摘要文字
允許使用者在詳情區域新增一行額外的文字
建立標準的Notification
以下三項式建立一個標準的Notification的先決條件
1. 小圖示, 通過setSmallIcon()方法設定
2. 標題, 通過setContentTitle()方法設定
3. 內容文字, 通過setContentText()方法設定
我們這裡不通過呼叫Notification構造方法的方式建立Notification,因為這種方法已經不推薦使用。
我們使用通過NotificationCompat.Builder類建立Notification。
程式的主佈局文字中只有一個id為btnShow的按鈕,點選這個按鈕顯示Notification,下面為簡單的示例demo;
import android.app.Notification;
import android.app.NotificationManager;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private Notification mNotification;
private NotificationManager mNotificationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnShow = (Button) findViewById(R.id.btnShow);
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotification = new NotificationCompat.Builder(this)
// 設定小圖示
.setSmallIcon(R.drawable.ic_launcher)
// 設定標題
.setContentTitle("you have a meeting")
// 設定內容
.setContentText("you have a meeting at 3:00 this afternoon")
.build();
btnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mNotificationManager.notify(0, mNotification);
}
});
}
}
完整的Notification例項
上面程式碼中的例子並不完整,只是演示了一個可以正常執行的例項
說它不完整是因為Notification到來的時候狀態列只有圖示,沒有文字,也沒有聲音提示,使用者體驗並不好。
當我們不設定LargeIcon的時候,系統就會使用當前設定的小圖示作為大圖示使用,小圖示位置(位置5)則置空。
下面的程式碼是比較完整的Notification示例
import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
public class MainActivity extends BarActivity {
private Notification mNotification;
private NotificationManager mNotificationManager;
private PendingIntent mResultIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnShow = (Button) findViewById(R.id.btnShow);
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
/*
* 取得PendingIntent, 並設定跳轉到的Activity,
*/
Intent intent = new Intent(this, UpdateActivity.class);
mResultIntent = PendingIntent.getActivity(this, 1, intent,
Intent.FLAG_ACTIVITY_NEW_TASK);
btnShow.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
Bitmap largeIcon = BitmapFactory.decodeResource(
MainActivity.this.getResources(), R.drawable.luffy);
mNotification = new NotificationCompat.Builder(getBaseContext())
// 設定大圖示
.setLargeIcon(largeIcon)
// 設定小圖示
.setSmallIcon(R.drawable.ic_launcher)
// 設定小圖示旁的文字資訊
.setContentInfo("1")
// 設定狀態列文字標題
.setTicker("你的系統有更新")
// 設定標題
.setContentTitle("系統更新")
// 設定內容
.setContentText("發現系統更新,點選檢視詳情")
// 設定ContentIntent
.setContentIntent(mResultIntent)
// 設定Notification提示鈴聲為系統預設鈴聲
.setSound(
RingtoneManager.getActualDefaultRingtoneUri(
getBaseContext(),
RingtoneManager.TYPE_NOTIFICATION))
// 點選Notification的時候使它自動消失
.setAutoCancel(true).build();
mNotificationManager.notify(0, mNotification);
}
});
}
}
使用自定義佈局統一Notification的顯示效果
佈局檔案程式碼
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:attr/colorBackground">
<ImageView
android:id="@+id/largeIcon"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@drawable/luffy"
android:contentDescription="largeIcon" />
<TextView
android:id="@+id/contentTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/largeIcon"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:text="系統更新"/>
<TextView
android:id="@+id/contentText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/contentTitle"
android:layout_below="@+id/contentTitle"
android:layout_marginTop="5dp"
android:text="發現系統更新,點選檢視詳情"
android:textSize="12sp"/>
<TextView
android:id="@+id/when"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="5dp"
android:text="11:00"/>
<ImageView
android:id="@+id/smallIcon"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_alignRight="@+id/when"
android:layout_alignTop="@+id/contentText"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/contentInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/smallIcon"
android:layout_toLeftOf="@+id/smallIcon"
android:text="資訊"
android:textSize="12sp" />
</RelativeLayout>
程式程式碼
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.media.RingtoneManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.widget.Button;
import android.widget.RemoteViews;
public class MainActivity extends Activity {
private Notification mNotification;
private NotificationManager mNotificationManager;
private PendingIntent mResultIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnShow = (Button) findViewById(R.id.btnShow);
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
/*
* 取得PendingIntent, 並設定跳轉到的Activity,
*/
Intent intent = new Intent(this, UpdateActivity.class);
mResultIntent = PendingIntent.getActivity(this, 1, intent,
Intent.FLAG_ACTIVITY_NEW_TASK);
btnShow.setOnClickListener(new View.OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
RemoteViews customView = new RemoteViews(getPackageName(),
R.layout.customerviews);
mNotification = new NotificationCompat.Builder(getBaseContext())
// 設定小圖示
.setSmallIcon(R.drawable.ic_launcher)
// 設定狀態列文字標題
.setTicker("你的系統有更新")
//設定自定義佈局
.setContent(customView)
// 設定ContentIntent
.setContentIntent(mResultIntent)
// 設定Notification提示鈴聲為系統預設鈴聲
.setSound(
RingtoneManager.getActualDefaultRingtoneUri(
getBaseContext(),
RingtoneManager.TYPE_NOTIFICATION))
// 點選Notification的時候自動移除
.setAutoCancel(true).build();
/*
* 當API level 低於14的時候使用setContent()方法是沒有用的
* 需要對contentView欄位直接賦值才能生效
*/
if (Build.VERSION.SDK_INT < 14) {
mNotification.contentView = customView;
}
mNotificationManager.notify(0, mNotification);
}
});
}
}
上面的佈局檔案中的內容是硬編碼的,也可以通過RemoteViews類中的setXXX方法動態設定內容。
這樣程式便更加靈活
更新Notification的內容
因為我們建立的Notification是通過一個Id分別的,因此只要在使用NotificationManager的notify()方法的時候使用
相同的Id就可以更新這個Notification的內容
當然在使用notify()方法之前我們還是要建立一個Notification例項。
【轉】http://www.bkjia.com/Androidjc/961705.html