編輯:關於Android編程
上一篇小案例,完成了一個普通的通知,點擊通知啟動了一個活動。但是那裡的通知沒有加入些“靓點”,這一篇就給它加入自定義的布局,完成自定義的通知。
應用:比如QQ音樂為例,當點擊音樂播放的時候,手機屏幕上方就會展示播放音樂的通知,這個通知不僅僅擁有布局,而且響應點擊事件,能完成上一曲下一曲的切換。今天這個小案例,就以此為背景展開。
首先,主活動布局不需要改變,還是放置兩個按鈕用於開啟、關閉服務。
主活動中的代碼做了了較大改變,如下:
package com.example.notification;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RemoteViews;
public class MainActivity extends Activity {
private Button btShow;
private Button btCancel;
private NotificationManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btShow = (Button) findViewById(R.id.show);
btCancel = (Button) findViewById(R.id.cancel);
btShow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 展示通知
showNotificationNewAPI();
}
});
btCancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 關閉通知
cancelNotification();
}
});
}
/**新API展示通知*/
public void showNotificationNewAPI(){
/**獲取通知對象*/
manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//自定義布局的通知
Notification notification = showCustomViewNotification();
//開啟通知,第一個參數類似代表該通知的id,標記為1
manager.notify(1, notification);
}
/**自定義布局的通知
* @return */
private Notification showCustomViewNotification() {
NotificationCompat.Builder builder = new Builder(getApplicationContext());
builder.setSmallIcon(R.drawable.notification_music_playing)//設置通知顯示的圖標
.setTicker("ticker")//設置通知剛剛展示時候瞬間展示的通知信息
.setWhen(System.currentTimeMillis())//設置通知何時出現,System.currentTimeMillis()表示當前時間顯示
/**以上三種方式必須設置,少一項都不發展示通知*/
.setOngoing(true)//設置滑動通知不可刪除
.setContent(getRemoteView());//給通知設置內容,這個內容為自定義的布局
return builder.build();
}
/**獲取自定義通知使用的布局View*/
private RemoteViews getRemoteView(){
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_layout);
//設置標題
remoteViews.setTextViewText(R.id.tv_title, "愛你一萬年");
//設置歌手名
remoteViews.setTextViewText(R.id.tv_arties, "劉德華");
//設置點擊事件
remoteViews.setOnClickPendingIntent(R.id.ll_root, getPaddingIntent());
remoteViews.setOnClickPendingIntent(R.id.ivnext, getNextPaddingIntent());
remoteViews.setOnClickPendingIntent(R.id.ivpre, getPrePaddingIntent());
return remoteViews;
}
/**獲取PendingIntent*/
private PendingIntent getPaddingIntent() {
//真正的意圖
Intent intent = new Intent(this, DemoActivity.class);
intent.putExtra("msg", "我是從通知欄啟動的!");
// 延遲意圖,用於啟動活動、服務、發送廣播等。攜帶真正的意圖對象
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
/**獲取下一曲的Paddingintent*/
private PendingIntent getNextPaddingIntent() {
// 真正的意圖
Intent intent = new Intent(this, DemoActivity.class);
intent.putExtra("msg", "我是從通知欄啟動的!點擊了下一曲按鈕");
// 延遲意圖,用於啟動活動、服務、發送廣播等。攜帶真正的意圖對象
PendingIntent pendingIntent = PendingIntent.getActivity(this, 1,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
/**獲取上一曲的paddingintent*/
private PendingIntent getPrePaddingIntent() {
// 真正的意圖
Intent intent = new Intent(this, DemoActivity.class);
intent.putExtra("msg", "我是從通知欄啟動的!點擊了上一曲按鈕");
// 延遲意圖,用於啟動活動、服務、發送廣播等。攜帶真正的意圖對象
PendingIntent pendingIntent = PendingIntent.getActivity(this, 2,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
/**取消通知*/
public void cancelNotification(){
manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//1表示我要取消標記的通知
manager.cancel(1);
}
}
代碼已經寫得很想詳細了。。。很顯然主要是下面這個方法為核心:
private RemoteViews getRemoteView(){
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_layout);
//設置標題
remoteViews.setTextViewText(R.id.tv_title, "愛你一萬年");
//設置歌手名
remoteViews.setTextViewText(R.id.tv_arties, "劉德華");
//設置點擊事件
remoteViews.setOnClickPendingIntent(R.id.ll_root, getPaddingIntent());
remoteViews.setOnClickPendingIntent(R.id.ivnext, getNextPaddingIntent());
remoteViews.setOnClickPendingIntent(R.id.ivpre, getPrePaddingIntent());
return remoteViews;
}
我們把自定義的布局也要整理出來:
另一個活動中的代碼:
package com.example.notification;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class DemoActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.demo);
String content = getIntent().getStringExtra("msg");
Toast.makeText(getApplicationContext(), content, 0).show();
}
}
事件結果就是打印顯示一行土司。
運行看看自定義通知吧!效果圖如下:

viewpager+fragment的懶加載
正文 進入正題,主要講解viewpager+fragment實現微信滑動切換頁面的功能,並且附帶切換效果,功能其實並不難,只是需要把知識點關聯起來1.分析用到的知識點(1
Android動畫之二:View Animation
如上一篇博客《Android動畫之一:Drawable Animation》所說,android動畫主要分為三大部分,上一篇博客已經講解Drawable Animatio
一步一步學android控件(之一) —— 開始篇
android 控件眾多 , 額 , 具體多少個呢? 貌似有那麼幾十個吧,也沒做個統計,嘿嘿!...... 有木有朋友感覺寫了那麼長時間的android代碼,有
Android 接口回調實例
Android接口回調方法處處涉及到,比如常用的Button點擊事件就是一個接口回調,可見掌握熟練使用接口回調方法的重要性。接口回調的簡單解釋就是:比如我這個類實現了一個