編輯:關於Android編程
Android的Notification是android系統中很重要的一個機制, 產品人員常常利用通知欄的方式,跟用戶進行弱溝通。擁有推送通知的app要比沒有此類功能的app活躍率要高很多。另外類似於墨跡天氣,清理大師等 app,也會將通知欄常駐,利用自定義的布局,方便用戶及時快捷的查看所需的信息和使用快捷的功能。所以Notification的使用,也在開發當中, 使用的越來越頻繁。今天我就來跟大家分享一下Notification的常用事項。
我不了解大家平時怎麼使用Notification,我常常看到有些人的代碼是這樣寫的:
Notificationnotification=newNotification(notificationIcon,notificationTitle,when);
notification.defaults=Notification.DEFAULT_ALL;
Intentintent=newIntent(MainActivity.this,SecondActivity.class);
PendingIntentpendingIntent=PendingIntent.getActivity(MainActivity.this,0,intent,0);
notification.setLatestEventInfo(this,"測試展開title","測試展開內容",pendingIntent);
具體的代碼我就不貼全了,因為大家如果注意IDE的提示的話,就會發現,其實這是一種不推薦 的用法,API的支持已經過時了。最新的Notification的用法,是推薦使用V4包下的NotificationCompat.Builder, 利用它,進行各種設置,具體的用法先別著急,我們慢慢道來。
NotificationCompat.BuildernotifyBuilder=newNotificationCompat.Builder(
this);
首先,我們需要先初始化一個notifyBuilder,然後利用它的各種set方法,進行相關設置,具體的設置,我們參考下圖:
圖示中的序號1,叫做
notifyBuilder.setContentTitle("ThisisMyNotification");
圖示中的序號3,叫做
notifyBuilder.setContentText("HelloWorld");
圖示中的需要5,叫做利用下面的方法來設置:
這三個參數的設定是必須的,每次調用Notification,必須得設定這三個參數。除去這三個以外,另外的2,4,6區域,分別是Large Icon,Content Info,Time,設置方法如下所示:
Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.bigicon);
notifyBuilder.setLargeIcon(bitmap);
//這裡用來顯示右下角的數字
notifyBuilder.setNumber(10);
notifyBuilder.setWhen(System.currentTimeMillis());
以上就是關於Notification的基本設置,下面,我們繼續看看其它方面的設置,直接上代碼:
//將AutoCancel設為true後,當你點擊通知欄的notification後,它會自動被取消消失
notifyBuilder.setAutoCancel(true);
//將Ongoing設為true那麼notification將不能滑動刪除
//notifyBuilder.setOngoing(true);
//從Android4.1開始,可以通過以下方法,設置notification的優先級,優先級越高的,通知排的越靠前,優先級低的,不會在手機最頂部的狀態欄顯示圖標
notifyBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
//notifyBuilder.setPriority(NotificationCompat.PRIORITY_MIN);
notifyBuilder.setTicker("Hi,Notificationishere");
//Uriuri=
//Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.cat);
//Uriuri=Uri.parse("file:///mnt/sdcard/cat.mp3");
//notifyBuilder.setSound(uri);
//Notification.DEFAULT_ALL:鈴聲、閃光、震動均系統默認。
//Notification.DEFAULT_SOUND:系統默認鈴聲。
//Notification.DEFAULT_VIBRATE:系統默認震動。
//Notification.DEFAULT_LIGHTS:系統默認閃光。
//notifyBuilder.setDefaults(Notification.DEFAULT_ALL);
NotificationManagermNotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(NOTIFY_ID,notifyBuilder.build());
如上面的注釋所示,如果你想點擊完notification後,該通知自動消失,那麼你就需要調用setAutoCancel(boolean b)這個方法,並且將其設為true,如果你想讓你的通知欄常駐,用戶無法滑動刪除,也不能通過手機的清除鍵 刪除,類似於墨跡天氣等app的通知欄,那麼你可以設置setOngoing方法,也設為true,這樣,通知欄只能通過代碼調用cancel方法才能消失,很霸道地,有木有!另外,從Android4.1時代開始,系統允許設置Notification的優先級,對於優先級高的通知,會排在 通知欄的前面,並在會在手機最上端的Status Bar顯示一個圖標,如果優先級設定的較低,那麼就會被系統顯示在通知欄的後面,並且Status Bar不再顯示相應的圖標,設置優先級的方法,就是調用setPriority(int p)。另外,當啟動通知欄的時候,我們常常可以在手機最上端的Status Bar上面,會閃現一段提示語,用來提醒用戶,這段提示語具體顯示的文字,就是靠setTicker()這個方法來實現的。除此之外,我們還可以設置,推送通知時的鈴聲、震動效果,閃光燈效果等等,具體的我就不一一列舉了,參考上面的示例代碼即可,需要注意 一點的是,設置通知的鈴聲,除去調用系統自帶的外,還有兩種方式,分別是調用SD卡中的聲音文件和項目工程自帶的聲音文件,這兩種方式都需要用到Uri的 地址,具體如何獲取這兩種的Uri,我已經在上面的代碼中,寫的很詳細了,大家可以參考上面的代碼,在自己的項目中實驗一下。
說了這麼多,還有最重要的一點沒有講,那就是在你設置完notification的各 種屬性後,你需要啟動這個notification,否則就前功盡棄了,啟動的方法,如上面的示例代碼所示,你需要先獲取一個 NotificationManager的實例,然後調用notify的方法,notifyBuilder.build()這個方法,可以實例化一個 notification的實例,另外,你還需要為這個notification分配一個獨一無二的的id號,將來notification的更新和刪 除,都是依靠這個id號來做索引對應的。
有時候,我們會涉及到這麼一個需求,那就是,產品設計,希望我們能夠監聽 notification的銷毀,意思就是說,當用戶手動滑動通知將其刪除或者通過手機的刪除按鈕將其清空時,我們希望可以捕獲到這一信息,並作出相應的 處理。比如說,我們在通知欄發送了一個通知,用來更新一個資源的下載進度,當用戶刪除這個通知後,我們希望可以監聽到這一變化,作出相應的處理,比如取消 下載,比如重新下載等等,那麼,應該如何監聽取消的行為呢?請看代碼:
IntentdeleteIntent=newIntent(this,DeleteService.class);
intdeleteCode=(int)SystemClock.uptimeMillis();
PendingIntentdeletePendingIntent=PendingIntent.getService(this,
deleteCode,deleteIntent,PendingIntent.FLAG_UPDATE_CURRENT);
notifyBuilder.setDeleteIntent(deletePendingIntent);
我 們給notifyBuilder設置一個DeleteIntent,這裡指向了一個service,當刪除的行為發生後,系統就會啟動這個 service,我們就可以在這個service中,做相應的邏輯處理了,當然,這裡我只是舉了一個例子,用來啟動service,大家也可以將 Intent指向一個Activity或者一個廣播,不過PendingIntent.getService()這個方法,就需要換成 PendingIntent.getActivity()或者PendingIntent.getBroadCast()這兩個方法。
上面的內容,我們大概了解了如何給notification設定顯示的內容,和如何監 聽銷毀的行為。但是常常,我們會發現,除了以上功能外,我們經常遇見的情形時,當我們點擊了一個notification後,就會自動打開一個頁面,展示 出信息來源的具體頁面,接下來,我們就針對這種情況,來看看代碼是如何控制的。
剛剛提到的自動跳轉頁面的功能,看似很簡單的一個邏輯,其實也包含了各種邏輯處理情況,其中最主要的是有兩種:
一:當我們處在手機桌面主屏的時候,突然來了一條郵箱的信息,來了一 封新郵件,我們點擊通知欄,系統會為我們打開最新收到的郵件,當我們看完郵件後,按返回鍵,我們並不會馬上回到手機桌面的主屏上,而是先返回到收件箱界 面,然後再返回到郵件APP的主界面,然後再返回到手機桌面的主屏上,它是按照郵件APP的頁面隊列返回的。
二:還是舉剛才那個例子,當我們收到新郵件的通知後,我們點擊打開新收到的郵件,當我們閱讀完之後,我們想要點擊返回鍵,立刻返回到我們剛剛所處的界面,繼續進行剛才還在進行的任務。
這兩種情況,在產品設計中,常常出現,所以我們也要想辦法去實現,那麼如何去實現這兩種情況呢,我們一個一個來看。
首先請看第一種情況的代碼:
IntentnotifyIntent=newIntent(this,NotifyRegularActivity.class);
TaskStackBuilderstackBuilder=TaskStackBuilder.create(this);
stackBuilder.addParentStack(NotifyRegularActivity.class);
stackBuilder.addNextIntent(notifyIntent);
//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode
intrequestCode=(int)SystemClock.uptimeMillis();
PendingIntentresultPendingIntent=stackBuilder.getPendingIntent(
requestCode,PendingIntent.FLAG_UPDATE_CURRENT);
notifyBuilder.setContentIntent(resultPendingIntent);
我們繼續貼上AndroidManist.xml的配置代碼:
android:name="com.example.notificationtest.MainActivity"
android:label="@string/app_name">
android:name="com.example.notificationtest.OtherActivity"
android:label="OtherActivity"
android:parentActivityName="com.example.notificationtest.MainActivity">
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.notificationtest.MainActivity"/>
android:name="com.example.notificationtest.NotifyRegularActivity"
android:label="NotifyRegularActivity"
android:parentActivityName="com.example.notificationtest.OtherActivity">
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.notificationtest.OtherActivity"/>
好,我們來分析一下上面的代碼。首先我們設置了一個Intent,將其指向 NotifyRegularActivity,然後我們用到了TaskStackBuilder,它可以用來控制界面返回的導航堆棧。
TaskStackBuilderstackBuilder=TaskStackBuilder.create(this);
stackBuilder.addParentStack(NotifyRegularActivity.class);
stackBuilder.addNextIntent(notifyIntent);
我們利用這段代碼,首先實例化了一個TaskStackBuilder,然後調用addParentStack()和addNextIntent(), 設置它的返回堆棧和跳轉頁面,跳轉頁面的Intent很好理解,跟大家平時的設置方式是一樣的,那麼它的返回堆棧是如何控制的呢?這就需要上面xml配置 文件的配置了,大家請看,在上面的配置文件中,一共有三個Activity,分別是MainActivity,OtherActivity,和 NotifyRegularActivity,其中NotifyRegularActivity就是我們點擊通知欄後,要自動跳轉的界面。在配置文件當 中,
我們給後面兩個Activity,設置了這麼一個屬性android:parentActivityName,它指的就是該activity的返回路徑,因為剛剛我們在調用addParentStack()這個方法的時候,設置的參數是NotifyRegularActivity.class所以根據上面配置文件的配置內容,那麼它的返回堆棧的順序就是:
需要注意的是,為了向下兼容版本,我們在設置android:parentActivityName這個屬性的時候,還需要在配置文件中,為每個Activity進行如下設置:
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.notificationtest.MainActivity"/>
具體的value的指向,就需要你自己設定了,總之,它指向了該activity的返回頁面。對TaskStackBuilder設置完成之後,我們再通過下面的代碼獲取PendingIntent,,然後賦值給notifyBuilder即可:
//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode
intrequestCode=(int)SystemClock.uptimeMillis();
PendingIntentresultPendingIntent=stackBuilder.getPendingIntent(
requestCode,PendingIntent.FLAG_UPDATE_CURRENT);
notifyBuilder.setContentIntent(resultPendingIntent);
這裡有兩點需要注意一下:
1:PendingIntent.FLAG_UPDATE_CURRENT這個參數一般有四種選擇分別是:
FLAG_CANCEL_CURRENT:如果構建的PendingIntent已經存在,則取消前一個,重新構建一個。
FLAG_NO_CREATE:如果前一個PendingIntent已經不存在了,將不再構建它。
FLAG_ONE_SHOT:表明這裡構建的PendingIntent只能使用一次。
FLAG_UPDATE_CURRENT:如果構建的PendingIntent已經存在,那麼系統將不會重復創建,只是把之前不同的傳值替換掉。
如果沒有特殊要求的話,我們常常會使用FLAG_UPDATE_CURRENT這個參數來構造PendingIntent,但是這樣常常會引發第二個問題,什麼問題呢?呵呵~
2:如上所述我們使用 FLAG_UPDATE_CURRENT這個參數後,常常會發現,我們點擊通知欄後,系統沒有響應,時靈時不靈的,很是憂郁,這是為什麼呢?原來使用 FLAG_UPDATE_CURRENT這個參數後,系統不會重新創建新的PendingIntent,這樣一來,如果你傳遞的Intent的 extra參數沒有變化的話,那麼系統就會認為你沒有發送新的PendingIntent,這樣就不會重新響應你的點擊事件。一般情況下,為了能夠區分每 次的PendingIntent不一樣,我們常常會在構造Intent的時候,設置不同的Action或者Extra值,這樣一來,及時是使用 FLAG_UPDATE_CURRENT這個參數,系統也會因為傳值參數的變化而去響應每次的點擊跳轉事件。不過這種解決方法還是有些麻煩,有時候,我們 根本不需要傳遞額外的Aciton或者參數值,這該怎麼辦呢?哈哈,解決代碼已經在上面的代碼中寫出來了,在stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_UPDATE_CURRENT)這個方法中,我們注意到第一個參數,這裡,我們只要為這個參數設置一個獨一無二的標識,那麼剛剛提到的點擊無響應的問題就迎刃而解了,我平時的設置辦法就是利用這段代碼:
intrequestCode=(int)SystemClock.uptimeMillis();
獲取發布通知時的時間,將它作為requestCode,這樣就可以避免這些問題了。不過如果你要是使用FLAG_CANCEL_CURRENT這個參數的話,就會每次都創建一個新的,那麼剛剛提到的這兩個問題,也都不存在了,具體怎麼用,看你實際的業務要求了。
上面的講解,我們就可以解決剛剛討論的第一種情形了,下面我們來說一下,第二種情形,也就是點擊返回鍵後,直接返回剛剛任務所處的界面,看看這個如何實現。來,看代碼:
IntentnotifyIntent=newIntent(this,NotifySpecialActivity.class);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|Intent.FLAG_ACTIVITY_CLEAR_TASK);
//CreatesthePendingIntent
//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode
intrequestCode=(int)SystemClock.uptimeMillis();
PendingIntentpendIntent=PendingIntent.getActivity(this,requestCode,
notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT);
notifyBuilder.setContentIntent(pendIntent);
繼續看配置文件的設置:
android:name="com.example.notificationtest.NotifySpecialActivity"
android:excludeFromRecents="true"
android:label="NotifySpecialActivity"
android:launchMode="singleTask"
android:taskAffinity="">
在代碼中,我們設置NotifySpecialActivity為我們要跳轉的界面,然後在xml的配置文件中,我們重點設置了這三個屬性:android:excludeFromRecents="true",android:launchMode="singleTask",android:taskAffinity="",第一個屬性的設置,是將該界面從最近任務欄當中移除,防止用戶通過最近任務欄而進入到該界面,這樣一來,只能通過通知來的點擊來進入。第二種屬性的設置就很常見了,是為了防止該界面存在的情況下,重復創建該Activity,第三屬性是為了配置代碼中的這段來設置的:
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|Intent.FLAG_ACTIVITY_CLEAR_TASK);
這樣的作用是為此次跳轉界面的行為重新分配一個任務堆棧,而不從屬於其它的任務堆棧,這樣的話,當我們點擊返回鍵後,就可以直接返回到剛剛用戶所處的任務界面了。由於這裡我們不再使用TaskStackBuilder,所以最後需要調用PendingIntent.getActivity(this, requestCode,notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT)這個方法來構造一個PendingIntent,然後賦值給notifyBuilder。這樣,剛剛討論過的第二種情形,我們就可以解決了,相比較第一種來說,這種解決方式更為簡潔,不過處理的業務邏輯也不一樣,大家斟酌而定。
Notificaton在平時的產品設計中,常常用來顯示跟網絡交互的進度,我們常常的做法是在通知欄上面,顯示一個進度條,用來更新交互的進度,這個的實現方式很簡單,主要依賴於mBuilder.setProgress()這個方法,具體的做法可以參考下面的代碼:
finalNotificationManagermNotifyManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
finalNotificationCompat.BuildermBuilder=newNotificationCompat.Builder(
this);
mBuilder.setContentTitle("PictureDownload")
.setContentText("Downloadinprogress")
.setSmallIcon(R.drawable.small);
newThread(newRunnable(){
@Override
publicvoidrun(){
intincr;
for(incr=0;incr<=100;incr+=5){
//mBuilder.setProgress(100,incr,false);
mBuilder.setProgress(0,0,true);
mNotifyManager.notify(NOTIFY_ID,mBuilder.build());
try{
Thread.sleep(1*1000);
}catch(InterruptedExceptione){
}
}
mBuilder.setContentText("Downloadcomplete").setProgress(0,0,
false);
mNotifyManager.notify(NOTIFY_ID,mBuilder.build());
}
}
//Startsthethreadbycallingtherun()methodinitsRunnable
).start();
}
在代碼中,我們開啟了一個線程,裡面進行20次for循環,每次循環都會調用setProgress這個方法,因為每次調用的NOTIFY_ID都是相同的,所以系統會根據這個ID來更新notification的進度而不會重新創建一個新的Notification。setProgress這個方法一共有兩種方法,一種是這樣的:
mBuilder.setProgress(100,incr,false);
第一個參數指的的是進度的總長度,第二個參數是目前進行的長度,然後將第三個參數設為false,我們可以看到的效果就如下圖:
我們可以看見進度條的確切位置和進度情況。還有一種使用方法是這樣的:
mBuilder.setProgress(0,0,true);
將前兩個參數都設為0,然後將最後這個參數設為true,這樣的進度條效果是一種連續模糊的,適合進行時間不確定的網絡連接,效果圖如下:
最後,當我們的任務完成後,我們需要取消進度條的顯示,這時候我們需要調用如下方法:
mBuilder.setContentText("Downloadcomplete").setProgress(0,0,
false);
設置一個任務完成後的文本描述,然後將setProgress的前兩個參數都設為0,最後一個參數設為false,這樣進度條就不會在通知欄上面顯示了,效果圖:
Notification的進度條的使用方法就是這些,如果大家平時用的不多,最好還是根據上面貼出的源代碼,自己聯系一遍,稍候我也會把本次工程的源代碼打包,上傳到CSDN的資源庫中,供大家參考。
上面跟大家介紹的,都是Notification的一種常規樣式,自從Android4.1之後,谷歌引入了一種新的樣式,叫做Big View,效果就是相對於傳統的Notification,它的顯示區域更大,顯示的內容也更多一些。關於Big View,谷歌支持了三種模式,分別是:
Big text style還有newNotificationCompat.Builder(
this).setSmallIcon(R.drawable.small)
.setContentTitle("Picturetracker")
.setContentText("Picturereceived");
NotificationCompat.BigPictureStylepicStyle=newNotificationCompat.BigPictureStyle();
Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.bigpic);
picStyle.bigPicture(bitmap);
mBuilder.setStyle(picStyle);
NotificationManagermNotifyManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
mNotifyManager.notify(NOTIFY_ID,mBuilder.build());
首先我們實例化一個NotificationCompat.BigPictureStyle,然後讀取要展示的圖片資源,調用picStyle.bigPicture(bitmap)這個方法設置圖片,最後調用notifyBuilder的mBuilder.setStyle(picStyle)方法,設置好BIG VIEW的樣式,就OK了,代碼簡單的令人發指,我就不多解釋了,大家參考上面的示例代碼即可。
接下來,我們再看看Inbox style這種樣式是如何設置的:
NotificationCompat.BuildermBuilder=newNotificationCompat.Builder(
this).setSmallIcon(R.drawable.small)
.setContentTitle("Inboxtracker")
.setContentText("Inboxreceived");
NotificationCompat.InboxStyleinboxStyle=newNotificationCompat.InboxStyle();
String[]events=newString[6];
events[0]="Hellomyoneworld";
events[1]="Hellomytwoworld";
events[2]="Hellomythreeworld";
events[3]="Hellomyfourworld";
events[4]="Hellomyfiveworld";
events[5]="Hellomysixworld";
inboxStyle.setBigContentTitle("Inboxtrackerdetails:");
for(inti=0;iinboxStyle.addLine(events[i]);
}
inboxStyle.setBigContentTitle("Thersaresixmessages");
inboxStyle.setSummaryText("It‘ssoeasy,right?");
mBuilder.setStyle(inboxStyle);
NotificationManagermNotifyManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
mNotifyManager.notify(NOTIFY_ID,mBuilder.build());
唉,代碼是不是再簡單不過了,我都不好意思班門弄斧的介紹這段代碼了。主要聲明一下三個方法的使用吧,inboxStyle.addLine(),這個方法是用來設置下圖中黃色區域的文字,inboxStyle.setBigContentTitle("Thers are six messages")這個方法是用來設置紅色區域的文字內容,inboxStyle.setSummaryText("It‘s so easy,right?")是用來設置綠色區域的內容顯示,其他的基本設置在之前的內容中,都已經介紹了很多了,我就不重復介紹了。
通過上面的學習,想必大家已經對Notification有了一個比較全面的了解了,最後, 我再給大家介紹一種自定義 Notification布局的用法。自定義Notification布局的app有很多,比如像墨跡天氣,Clean Master等等,利用自定義布局,將用戶所需信息和快捷功能,多樣化的展示在通知欄上面,給大家看一下Clean Master的截圖:
其實要是實現這種自定義布局的Notification,非常簡單,我們這就給大家展示代碼設置和布局配置:
先看看java代碼:
NotificationCompat.BuildermBuilder=newNotificationCompat.Builder(this);
RemoteViewsremoteView=newRemoteViews(getPackageName(),R.layout.remote);
remoteView.setTextViewText(R.id.text,"CustomText");
remoteView.setTextViewText(R.id.btn,"CustomButton");
remoteView.setImageViewResource(R.id.image,R.drawable.ic_launcher);
IntentnotifyIntent=newIntent(this,NotifySpecialActivity.class);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|Intent.FLAG_ACTIVITY_CLEAR_TASK);
//CreatesthePendingIntent
//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode
intrequestCode=(int)SystemClock.uptimeMillis();
PendingIntentpendIntent=PendingIntent.getActivity(this,requestCode,
notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT);
remoteView.setOnClickPendingIntent(R.id.btn,pendIntent);
mBuilder.setSmallIcon(R.drawable.small);
mBuilder.setContent(remoteView);
NotificationManagermNotifyManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
mNotifyManager.notify(NOTIFY_ID,mBuilder.build());
再來看看xml布局文件是什麼樣的:
android:layout_height="64dp">
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:gravity="center"/>
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:gravity="center"/>
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:gravity="center"/>
我們首先利用下面這行代碼去解析上面的布局文件
RemoteViewsremoteView=newRemoteViews(getPackageName(),R.layout.remote);
然後根據每個控件的id號進行資源設置:
remoteView.setTextViewText(R.id.text,"CustomText");
remoteView.setTextViewText(R.id.btn,"CustomButton");
remoteView.setImageViewResource(R.id.image,R.drawable.ic_launcher);
我們也可以為這些控件單獨設置點擊事件,比如設置Button的點擊事件:
remoteView.setOnClickPendingIntent(R.id.btn,pendIntent);
上面第二個參數pendingIntent的獲取,在之前的講解中,已經介紹了好幾種方式了,這裡我們隨便選擇一種來實現了:
IntentnotifyIntent=newIntent(this,NotifySpecialActivity.class);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|Intent.FLAG_ACTIVITY_CLEAR_TASK);
//CreatesthePendingIntent
//當設置下面PendingIntent.FLAG_UPDATE_CURRENT這個參數的時候,常常使得點擊通知欄沒效果,你需要給notification設置一個獨一無二的requestCode
intrequestCode=(int)SystemClock.uptimeMillis();
PendingIntentpendIntent=PendingIntent.getActivity(this,requestCode,
notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT);
最後,我們要調用下面這段代碼,將自定義的RemoteView設置給notifyBuilder,然後調用發送通知的方法就OK了。
mBuilder.setContent(remoteView);
最後的最後,需要再給大家介紹兩個方法,那就是通過代碼來取消Notification,咱不能只管殺不管埋啊,哈哈~
NotificationManagercancelNotificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
cancelNotificationManager.cancel(NOTIFY_ID);
cancelNotificationManager.cancelAll();
cancelNotificationManager.cancel(NOTIFY_ID)這個方法是根據之前發布通知時,分配的ID號,來取消對應的通知欄。cancelNotificationManager.cancelAll()這個方法是取消所有之前發布過的通知欄,比較暴力一點哈。
在Android客戶端應用開發中,往往需要短信驗證碼或者隨機驗證碼來限制用戶的操作或者認證。短信驗證碼是為了對用戶進行認證,主要通過Http協議等通信協議實現;隨機驗證碼
項目意義:對於2016年Google I/O大會上提出的Instant Apps,即用戶不需下載app,就可以運行app的這個新鮮的理念聰明你的可能會聯想到H5App,w
背景:新年之際,微信微博支付寶紅包是到處飛,但是,自己的手速總是比別人慢一點最後導致紅包沒搶到,紅包助手就應運而生。需求:收到紅包的時候進行提醒,然後跳轉到紅包的界面方便
Android提供了常見的音頻、視頻的編碼、解碼機制。借助於多媒體類MediaPlayer的支持,開發人員可以很方便在在應用中播放音頻、視頻。本篇博客主要講解在An