文章轉載只能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處:http://blog.sina.com.cn/flowingflying或做者@愷風Wei-傻瓜與非傻瓜html
廣播接受可用於本地,也能夠用於不一樣的進程(應用)間。廣播還經常使用於後臺服務,當接收器收到某個廣播消息時,一般會在通知欄中提示用戶,用戶點擊通知,能夠進入某個Activity中進行處理。android
小例子瀏覽器
接收器應用爲本小例子,發送廣播應用利用上一學習的小例子。app
關於通知,能夠參考Android學習筆記(五五):通知Notification(下)。ide
public class NotificationReceiver extends BroadcastReceiver{
private static int NOTIFY_ID = 1000;
private static final String tag = "NotificationReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Utils.logThreadSignature(tag);
Log.d(tag,"intent = " + intent);
String message = intent.getStringExtra("message");
Log.d(tag,message);
sendNotification(context,message);
}
private void sendNotification(Context context, String message){
//【1】獲取Notification 管理器的參考
NotificationManager notifyMgr= (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
//【2】設置通知。PendingIntent表示延後觸發,是在用戶下來狀態欄並點擊通知時觸發,觸發時PendingIntent發送intent,本例爲打開瀏覽器到指定頁面。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
Notification notification = new Notification.Builder(context)
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Hello")
.setContentTitle("Title")
.setContentText("Content text")
.setContentIntent(pi)
.build();
notification.flags |= Notification.FLAG_AUTO_CANCEL; //點擊後刪除,若是是FLAG_NO_CLEAR則不刪除,FLAG_ONGOING_EVENT用於某事正在進行,例如電話,具體查看參考。
//【3】發送通知到通知管理器。第一個參數是這個通知的惟一標識,經過這個id能夠在之後cancel通知,更新通知(發送一個具備相同id的新通知)。這個id在應用中應該是惟一的。
notifyMgr.notify(NOTIFY_ID, notification);
}
}學習
XMLui
在AndroidManifest.xml中一樣要進行receiver的聲明,標明所關注的廣播。咱們的小例子無需有activity,只需receiver便可。在安裝是會顯示:google
因爲在manifest中以告知系統所關心的廣播,無需有一個App正在運行,一樣也能夠正確地實現觸發。spa
建立本身的Content View風格:RemoteView.net
上面咱們使用了系統缺省的Content View。有時咱們但願自行定義content view的風格,如圖所示,由一個Textview和一個Button組成。
咱們首先定義本身的layout,在res/layout/中加入相關的xml文件,本例爲content_view.xml,以下:
相關的notification生成代碼以下:
private void sendNotification2(Context context, String message){
NotificationManager notifyMgr= (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
//建立RemoteViews對象。參數1爲包名,參數2爲對應的layout文件ID。 而後設置remoteViews中的text,icon等等。home page中的widget views也是remote views,咱們將在之後學習。
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.content_view);
//對當中的TextView進行設置
remoteViews.setTextViewText(R.id.title, "My Custom Title");
remoteViews.setTextColor(R.id.title, Color.RED);
//對當中的非TextView,例如Button進行設置,參數2對應方法名稱,本例button.setText(),所以取「setText」,參數3對應傳遞到button.setText(value)中的value。
remoteViews.setCharSequence(R.id.button, "setText", "My custom content text");
Notification notification = new Notification.Builder(context)
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Hello")
.setContent(remoteViews) //在notification中設置content view
.setContentIntent(pi)
.build();
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notifyMgr.notify(NOTIFY_ID + 1, notification);
}
前面,咱們使用了通知管理器,實際上咱們能夠在收到廣播時直接經過startActivity開啓activity,但要帶有下面的flag:Intent.FLAG_ACTIVITY_NEW_TASK,Inetent.FLAG_FROM_BACKGROUND,或者Intent.FLAG_ACTIVITY_SINGLETOP。
相關連接: 個人Android開發相關文章
轉自:http://blog.csdn.net/flowingflying/article/details/6212512