編輯:高級開發
對於特別重要的要提供給用戶的消息,需要有更持久性的方法。 Anotification是一種消息可以顯示在設備的頂部的通知欄或狀態欄中。
要看到通知的細節,選擇圖標顯示通知抽屜裡有詳細的有關通知。模擬器虛擬設備工作,按一下向下拖動狀態欄將它展開,將顯示詳細信息如下。這將是64 sp高的普通視圖。
上述擴大的形式可以放到一個大的視圖,有關通知的更多細節。可以添加最多六行的通知。下面的截圖顯示了這樣的通知。
使用簡單的方法來創建一個通知。按照以下步驟在應用程序創建一個通知:
作為第一步創建一個通知構造器,使用NotificationCompat.Builder.build()。使用通知Builder來設置屬性,如各種通知其小型和大型圖標,標題,優先級等。
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
在創建Builder對象之後,可以按要求使用生成器創建通知對象。這是強制性的,以至少下列設置:
一個小圖標,由 setSmallIcon() 設置
一個標題,由setContentTitle() 設置
詳細內容由 setContentText() 設置
mBuilder.setSmallIcon(R.drawable.notification_icon); mBuilder.setContentTitle("Notification Alert, Click Me!"); mBuilder.setContentText("Hi, This is Android Notification Detail!");
通知有很多可選的屬性,可以設置。要更多地了解它們,請參考 NotificationCompat.Builder 文檔。
這是一個可選的部分,並要求如果要附加一個動作的通知。動作可以讓用戶直接從通知到應用程序中的活動,在那裡它們可以在一個或多個事件,或做進一步的工作。
動作定義通過PendingIntent 在應用程序中的活動意圖。要關聯PendingIntent 手勢請調用適當NotificationCompat.Builder 方法。例如,如果想開始活動,當用戶點擊通知文本通知抽屜 PendingIntent 調用setContentIntent()。
PendingIntent對象表示應用程序的執行一個動作,在以後的時間裡查看應用程序是否正在運行。
堆棧builder對象將包含一個人工後退堆棧活動。確保向後導航的活動在應用程序的主屏幕。
Intent resultIntent = new Intent(this, ResultActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(ResultActivity.class); // Adds the Intent that starts the Activity to the top of the stack stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent);
最後,調用NotificationManager.notify() 發送通知,通知對象傳遞到系統。通知之前,確保調用NotificationCompat.Builder.build()方法生成器對象。這種方法結合了所有的選擇,設置並返回一個新的Notificationobject。
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // notificationID allows you to update the notification later on. mNotificationManager.notify(notificationID, mBuilder.build());
NotificationCompat.Builder類可以更容易控制標志,以及幫助構建典型通知布局。以下是 NotificationCompat.Builder類的一些重要的和最常用的方法的一部分。
以下示例顯示 Android 的通知功能,NotificationCompat.Builder類已在Android4.1中引入。
以下是修改主要活動文件src/com.yiibai.notificationdemo/MainActivity.java 的內容。這個文件可以包括每個生命周期基本方法。
package com.example.notificationdemo; import android.os.Bundle; import android.app.Activity; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.TaskStackBuilder; import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private NotificationManager mNotificationManager; private int notificationID = 100; private int numMessages = 0; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startBtn = (Button) findViewById(R.id.start); startBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { displayNotification(); } }); Button cancelBtn = (Button) findViewById(R.id.cancel); cancelBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { cancelNotification(); } }); Button updateBtn = (Button) findViewById(R.id.update); updateBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { updateNotification(); } }); } protected void displayNotification() { Log.i("Start", "notification"); /* Invoking the default notification service */ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("New Message"); mBuilder.setContentText("You've received new message."); mBuilder.setTicker("New Message Alert!"); mBuilder.setSmallIcon(R.drawable.woman); /* Increase notification number every time a new notification arrives */ mBuilder.setNumber(++numMessages); /* Creates an explicit intent for an Activity in your app */ Intent resultIntent = new Intent(this, NotificationView.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(NotificationView.class); /* Adds the Intent that starts the Activity to the top of the stack */ stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); /* notificationID allows you to update the notification later on. */ mNotificationManager.notify(notificationID, mBuilder.build()); } protected void cancelNotification() { Log.i("Cancel", "notification"); mNotificationManager.cancel(notificationID); } protected void updateNotification() { Log.i("Update", "notification"); /* Invoking the default notification service */ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("Updated Message"); mBuilder.setContentText("You've got updated message."); mBuilder.setTicker("Updated Message Alert!"); mBuilder.setSmallIcon(R.drawable.woman); /* Increase notification number every time a new notification arrives */ mBuilder.setNumber(++numMessages); /* Creates an explicit intent for an Activity in your app */ Intent resultIntent = new Intent(this, NotificationView.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(NotificationView.class); /* Adds the Intent that starts the Activity to the top of the stack */ stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); /* Update the existing notification using same notification ID */ mNotificationManager.notify(notificationID, mBuilder.build()); } }
以下是修改的主活動文件的內容 src/com.yiibai.notificationdemo/NotificationView.java.
package com.example.notificationdemo; import android.os.Bundle; import android.app.Activity; public class NotificationView extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notification); } }
下面文件 res/layout/activity_main.xml 的內容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/start" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_note"/> <Button android:id="@+id/cancel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/cancel_note" /> <Button android:id="@+id/update" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/update_note" /> </LinearLayout>
下面是 res/layout/notification.xml 文件的內容:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="400dp" android:text="Hi, Your Detailed notification view goes here...." /> </LinearLayout>
下面文件 res/values/strings.xml 的內容中定義兩個新的常量:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">NotificationDemo</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="start_note">Start Notification</string> <string name="cancel_note">Cancel Notification</string> <string name="update_note">Update Notification</string> </resources>
下面是 AndroidManifest.xml 文件的內容:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yiibai.notificationdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="17" /> <applicationandroid:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.yiibai.notificationdemo.MainActivity" android:label="@string/app_name" > <intent-filter> <actionandroid:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".NotificationView" android:label="Details of notification" android:parentActivityName=".MainActivity"> <meta-dataandroid:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"/> </activity> </application> </manifest>
我們嘗試運行NotificationDemo 應用程序。AVD安裝的應用程序,並啟動它,如果一切設置和應用都沒有問題,它會顯示以下模擬器窗口:
現在單擊“Start Notification”通知按鈕,會看到在上面的一條消息“New Message Alert!”將短暫顯示後,將有下面的屏幕左上角有一個小圖標。
現在,讓我們展開視圖,長按小圖標,一秒鐘後它會顯示日期信息,這是時間的時候,應該釋放鼠標拖動狀態欄的情況下。會看到狀態欄將擴大,會得到以下畫面:
現在,讓我們嘗試在圖像上點擊圖標,這將啟動新的活動,已設置使用的意圖,將有以下屏幕:
接下來,可以點擊“Detail of notification”,將帶回到主屏幕,可以嘗試使用更新通知按鈕,將更新現有的通知和數量將增加1,但如果發送通知,新的通知ID會繼續增加在堆棧中,會看到他們在屏幕上單獨列示。
下面的代碼片斷演示了如何改變的通知,上面代碼中創建使用收件箱大視圖樣式。要更新 displayNotification() 方法來顯示這個功能:
protected void displayNotification() { Log.i("Start", "notification"); /* Invoking the default notification service */ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("New Message"); mBuilder.setContentText("You've received new message."); mBuilder.setTicker("New Message Alert!"); mBuilder.setSmallIcon(R.drawable.woman); /* Increase notification number every time a new notification arrives */ mBuilder.setNumber(++numMessages); /* Add Big View Specific Configuration */ NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); String[] events = new String[6]; events[0] = new String("This is first line...."); events[1] = new String("This is second line..."); events[2] = new String("This is third line..."); events[3] = new String("This is 4th line..."); events[4] = new String("This is 5th line..."); events[5] = new String("This is 6th line..."); // Sets a title for the Inbox style big view inboxStyle.setBigContentTitle("Big Title Details:"); // Moves events into the big view for (int i=0; i < events.length; i++) { inboxStyle.addLine(events[i]); } mBuilder.setStyle(inboxStyle); /* Creates an explicit intent for an Activity in your app */ Intent resultIntent = new Intent(this, NotificationView.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(NotificationView.class); /* Adds the Intent that starts the Activity to the top of the stack */ stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); /* notificationID allows you to update the notification later on. */ mNotificationManager.notify(notificationID, mBuilder.build()); }
現在,如果嘗試運行應用程序,然後會發現下面的結果視圖的擴展形式:
蘋果的iphone 有語音識別用的是Google 的技術,做為Google 力推的android 自然會將其核心技術往android 系統裡面植入,並結合google
android 3.0 SDK已經正式發布了,android前面幾個版本已經證明它足夠成功了,但是在Andriod的全球成功後面是手機制造商的愛與恨的關系。Andrio
之前我們曾向您介紹過在android中實現service動態更新UI界面,在UI設計中需要利用很多圖庫相冊軟件,而Gallery 是國外一個免費開源的、功能非常強大、有
廣播接收器(Broadcast)簡單地從其他應用程序或系統響應廣播消息。這些消息有時稱為事件或意圖。例如,應用程序也可以發起廣播,以讓其他應用程序知道某些數據已經被下載到