Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android實戰教程--第三十八話《自定義通知NotifiCation》

Android實戰教程--第三十八話《自定義通知NotifiCation》

編輯:關於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;
	}

它讓我們自定義布局,並且對布局中的數據做了數據展示與事件處理。相信它的意思很簡單的就能體會。

 

我們把自定義的布局也要整理出來:

 



    
    
    
    
    
    
        
        
        
        
    
    
    
    
    

還差一點,我們給通知上邊的按鈕添加了點擊事件,事件目的是啟動另一個Activity,所以要到這個activity獲取這些數據,做一個土司處理。

 

另一個活動中的代碼:

 

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();
	}
}
事件結果就是打印顯示一行土司。

 

運行看看自定義通知吧!效果圖如下:

\

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved