Android学习笔记 通知Notification

Notification是Android系统为通知用户某些进程发生改变时用到的工具类。Android手机在收到短信是都会在屏幕上方出现短信息的缩略内容,以及其他的消息通知或者是推送信息都将首先以通知的形式告诉用户。这是怎么实现的呢?接下来就来看看Notification是怎么实现的。


一个简单的通知可分为三步来定义:

1、创建Notification Buider:

创建Notifiction时,可以用NotificationCompat.Builder对象来指定Notification的UI内容,一个NotificationCompat.Builder对象至少包含以下内容,

一个小的ICON 用setSmallIcon()方法设置:

一个标题  setContetnTitle();

setAutoCancel()为true是点击通知后该通知会自动消失

setTicker("")是接收到通知时手机屏幕上方弹幕提示的内容

<span style="white-space:pre">		</span>NotificationCompat.Builder builder = new NotificationCompat.Builder(
				this);
		builder.setSmallIcon(R.drawable.img_smile); // 设置通知显示图标
		builder.setContentTitle("饿了么");
		builder.setContentText("你有新的饿了么订单,请及时处理");
		builder.setAutoCancel(true);  //点击通知后消失
		builder.setTicker("你有新的饿了么订单,请及时处理");  //通知出现时让其滚动显示这段内容
2、设置Notification的action(行为),也就是当点击通知是需要跳转的什么地方或是做什么。比如说当收到短信时点击通知栏里的该短信就会打开短信,查看短信的详细内容。这里实现的是启动一个activity,需要定义一个PendingIntent,它包含了一个启动activity的Intent对象。

/* 通知行为,点击通知时启动actvity 行为必须放在发送通知之前*/
		Intent intent = new Intent(this, MusicActivity.class);
		int requestCode = 1; // 请求码,跟activity有回传值启动请求码一致
		PendingIntent pendingIntent = PendingIntent.getActivity(this,
				requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
		builder.setContentIntent(pendingIntent);  //点击时启动activity

3、发送通知、

/* 发送通知 */
		NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
		int notificationId = 1; // 作为通知的唯一标识id,当多次发送时会去比照这个id若有这个id并且通知还没取消,则不会再次发送。
		// Notification notification = builder.getNotification(); // 这个方法过时了
		Notification notification = builder.build();
		manager.notify(notificationId, notification);
发送通知用到一个NotificationManager对象调用notify()方法发送通知。只有发送通知才用到了Notification对象。是通过前面的NotificationCompat.Builder对象的build()方法的到notification对象。

这样一个简单的通知就完成了。效果图是点击按钮就发送通知。



二、更新通知。

在发送通知时定义了一个int型的notificationId。这个是该通知的唯一标识,不改变该Id,改变NotificationCompat.Builder对象的icon,contentTitle以及contentText等,再次调用notify方法就可以刷新通知了。

<span style="white-space:pre">		</span>NotificationCompat.Builder builder = new NotificationCompat.Builder(
				this);
		builder.setSmallIcon(R.drawable.img_person); // 设置通知显示图标
		builder.setContentTitle("刷新饿了么");
		builder.setContentText("刷新饿了么++你有新的饿了么订单,请及时处理");
		builder.setAutoCancel(true);  //点击通知后消失
		builder.setTicker("刷新饿了么——————你有新的饿了么订单,请及时处理");  //通知出现时让其滚动显示这段内容
		
		
		int notificationId = 1; // 统一唯一标识id就可以刷新通知
		// Notification notification = builder.getNotification(); // 这个方法过时了
		Notification notification = builder.build();
		manager.notify(notificationId, notification);

效果图:点击按钮是刷新通知,而不是再发一条通知。




三、清空通知:

NotificationManager类里定义了清空通知的方法。

cancel(int id);清除对应id通知     cancel(String tag, int id);      cancelAll();清除所有通知。很简单,看名字就知道是什么意思。

四、导航通知。

1、常规activity:点击通知,启动的是该应用工作流中的某一个activity.

点击通知,查看了通知内容后,在点击返回键时是直接退出到主界面。但是很多时候我们需要指定点按退出键之后的界面。比如当接收到短信通知时,点击短信通知,浏览完短信后点击back按钮退回到的是消息列表界面。实现这个需求只需在通知行为上做改变。用到一个TaskStackBuilder 类来指定跳转的activity,并在mainfest文件中设置该activity的父activity.。

Intent intent = new Intent(this, MusicActivity.class);

stackBuilder.addParentStack(MusicActivity.class);

这两个方法中的参数是同一个activity

<span style="white-space:pre">		</span>Intent intent = new Intent(this, MusicActivity.class);
		TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);  //得到返回栈
		stackBuilder.addParentStack(MusicActivity.class);  //向返回栈中压入activity,这里注意不是压入的父activity,而是点击通知启动的activity
		stackBuilder.addNextIntent(intent);
		
		int requestCode = 1; // pendingIntent 是由stackBuilder工厂得到
		PendingIntent pendingIntent = stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_CANCEL_CURRENT);
		builder.setContentIntent(pendingIntent);  //点击时启动activity

mainfest文件文件中设置父Activity:

 <activity
            android:name="music.mediaplayer.MusicActivity"
            android:label="播放音乐">
            <meta-data 
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.call.MainActivity"/>
         </activity>
API14之间可以用

<meta-data 
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.call.MainActivity"/>指定父activity

API14之后  Android:parentActivityName="  指定的父activity  "   来指定父activity

整个按钮监听代码:

<span style="white-space:pre">		</span>NotificationCompat.Builder builder = new NotificationCompat.Builder(
				this);
		builder.setSmallIcon(R.drawable.meituan_image8); // 设置通知显示图标
		builder.setContentTitle("导航通知");
		builder.setContentText("导航通知,点击通知启动activity返回时不返回到主界面,返回到指定的parentactivity界面");
		builder.setAutoCancel(true);  //点击通知后消失
		builder.setTicker("导航通知,点击通知启动activity返回时不返回到主界面,返回到指定的parentactivity界面");  //通知出现时让其滚动显示这段内容
		
		/* 通知行为,点击通知时启动actvity 行为必须放在发送通知之前*导航通知就需要建立返回栈并在xml文件中指定父activity*/
		Intent intent = new Intent(this, MusicActivity.class);
		TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);  //得到返回栈
		stackBuilder.addParentStack(MusicActivity.class);  //向返回栈中压入activity,这里注意不是压入的父activity,而是点击通知启动的activity
		stackBuilder.addNextIntent(intent);
		
		int requestCode = 1; // pendingIntent 是由stackBuilder工厂得到
		PendingIntent pendingIntent = stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_CANCEL_CURRENT);
		builder.setContentIntent(pendingIntent);  //点击时启动activity

		/* 发送通知 */
	//	NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//  启动这个服务可以定义为全局
		int notificationId = 11; // 作为通知的唯一标识id,当多次发送时会去比照这个id若有这个id并且通知还没取消,则不会再次发送。
		// Notification notification = builder.getNotification(); // 这个方法过时了
		Notification notification = builder.build();
		manager.notify(notificationId, notification);




2、特殊activity。启动的是通知特有的activity。完全跟应用工作流无关的activity。

当正在打游戏操作时,接受到某些通知,点击通知跳转activity后点按返回键,我们希望的是退回游戏界面。而不是主界面或是其他界面。那么只需注册该activity不需要指定返回父类就可以实现。


五、下载通知。

每当下载应用和其他东东时,通知栏都有一个下载进度条。NotificationCompat.Builder类也提供了setProgress(max, progress, false)方法将进度条加载到通知中。第一个参数是进度条的最大值。第二个是参数是当前进度。第三个参数是设置进度条是否为确定型进度条或者不确定型进度条。

<span style="white-space:pre">		</span>new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i = 1;i <= 100;i++){
					builder.setProgress(100, i, false);
					manager.notify(notificationId, builder.build());  //builder.build()这个参数必须在这里定义
					try {
						Thread.sleep(200);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				builder.setContentText("下载完成");
				builder.setProgress(0, 0, false);  // 下载完成让进度条消失
				manager.notify(notificationId, builder.build());
			}
		}).start();
测试时模拟了一个线程来加载进度。方法全部代码如下:

public void dowlendNotification(){
		final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
		builder.setSmallIcon(R.drawable.img_buetyful);
		builder.setContentTitle("下载通知");
		builder.setContentText("正在下载xxxx");
		builder.setTicker("开始下载xxxxxxx");
		builder.setAutoCancel(true);
		
		final int notificationId = 100;
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i = 1;i <= 100;i++){
					builder.setProgress(100, i, false);
					manager.notify(notificationId, builder.build());  //builder.build()这个参数必须在这里定义
					try {
						Thread.sleep(200);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				builder.setContentText("下载完成");
				builder.setProgress(0, 0, false);  // 下载完成让进度条消失
				manager.notify(notificationId, builder.build());
			}
		}).start();
	}

若是不确定型只需在builder.setProgress(0, 0, true)形式就可以了。



六、bigView型

都见过闹钟通知吧,闹钟通知下面还有两个按钮,确定和取消按钮以及各个按钮所携带的图标。这是通过builder.setStyle(new NotificationCompat.BigTextStyle().bigText("睡你麻痹起来嗨"));setStyle来设置的。当然点击按钮事件也是可以关联到服务或是其他activity的。这些都是通过Intent意图来关联的。这里是实现的是通过Intent关联服务、传递一个mp3的路径并启动服务让其播放音乐

。通过pendingIntent来实现action。

<span style="white-space:pre">		</span>NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
		builder.setSmallIcon(R.drawable.meituan_image8);
		builder.setContentTitle("闹钟");
		//builder.setContentText("睡你麻痹起来嗨");
		builder.setTicker("睡你麻痹起来嗨");
		builder.setAutoCancel(true);
		builder.setStyle(new NotificationCompat.BigTextStyle().bigText("睡你麻痹起来嗨"));
		
		
		Intent playIntent = new Intent(this,PlayerService.class);
		playIntent.setAction("aaaa");  //必须设置action才能传不同的参数
		playIntent.putExtra("MUSIC_STATE", 11);
		playIntent.putExtra("MUSIC_PATH", "file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + "/a.mp3");
		PendingIntent playPendingIntent = PendingIntent.getService(this, 10, playIntent, PendingIntent.FLAG_CANCEL_CURRENT);
		builder.addAction(R.drawable.img_person, "播放", playPendingIntent);   //设置下面两个按钮显示的图标以及内容
		
		Intent pauseIntent = new Intent(this,PlayerService.class);
		pauseIntent.putExtra("MUSIC_STATE", 1);
		pauseIntent.setAction("bbbb");//这里也要设置action而且不能刚上面的一样
		PendingIntent pausePendingIntent = PendingIntent.getService(this, 10, pauseIntent, PendingIntent.FLAG_CANCEL_CURRENT);
		builder.addAction(R.drawable.img_smile, "暂停", pausePendingIntent);
		int id = 1002;
		manager.notify(id, builder.build());
这里需要注意的是每一个按钮对应的Intent都需要设置一个action,就是这里的playIntent.setAction("aaaa");和pauseIntent.setAction("bbbb")。若不设置就传不了参数到服务。PendingIntent 类中的PendingIntent.getService(this, 10, pauseIntent, PendingIntent.FLAG_CANCEL_CURRENT);就可以启动服务。这是startservice方式启动的。

七、自定义Notification

自定义Notification在开发中应用非常广泛。最常见的就是后台播放音乐时的通知。Android采用了RemoteViews来解析布局文件并加载到通知上。具体如下:

<span style="white-space:pre">		</span>NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
		builder.setSmallIcon(R.drawable.adapter_homework_icon);  //自定义Notification必须至少设置这项才会发送成功
		RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.my_notification_layout);   //xml资源布局文件
		builder.setContent(remoteViews);
		int id = 111;
		manager.notify(id, builder.build());
xml布局上按钮的监听事件是通过remoteViews.setOnClickPendingIntent(viewId, pendingIntent)方法来实现的。viewId是xml布局中对应控件的id.    pendingIntent是Intent意图对象构造而来的pendingIntent上面已有提到。

这里注意自定义Notification里必须设置setSmallIcon();属性。不然就通知就不能发送。



最后贴上所有测试代码:

主activity:

package notification;

import music.mediaplayer.MusicActivity;
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.os.Environment;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.TaskStackBuilder;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.RemoteViews;

import com.example.call.R;

public class NotificationActivity extends Activity implements OnClickListener{
	private Button mSendBtn,mUpdateBut,mCleanBtn,mNavigationBtn;
	NotificationManager manager;
	private Button mDowlendBtn ,mUnDowlendBtn,mBigViewBtn,mMyNotificationBtn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.notification_main_layout);
		mSendBtn = (Button) findViewById(R.id.notification_btn);
		mUpdateBut = (Button) findViewById(R.id.notification_update_btn);
		mCleanBtn = (Button) findViewById(R.id.notification_clean_btn);
		mNavigationBtn = (Button) findViewById(R.id.notification_navigation_btn);
		mDowlendBtn = (Button) findViewById(R.id.notification_dowlend_btn);
		mUnDowlendBtn = (Button) findViewById(R.id.notification_unknowdowlend_btn);
		mBigViewBtn = (Button) findViewById(R.id.notification_bigView_btn);
		mMyNotificationBtn = (Button) findViewById(R.id.notification_myself_btn);
		mSendBtn.setOnClickListener(this); 
		mMyNotificationBtn.setOnClickListener(this); 
		mBigViewBtn.setOnClickListener(this); 
		mUnDowlendBtn.setOnClickListener(this); 
		mNavigationBtn.setOnClickListener(this); 
		mCleanBtn.setOnClickListener(this); 
		mUpdateBut.setOnClickListener(this); 
		mDowlendBtn.setOnClickListener(this); 
		manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);  //这个可以共用
			
	}
	
	@Override
	public void onClick(View v) {
		switch(v.getId()){
		case R.id.notification_btn:
			sendNotification();
			break;
		case R.id.notification_update_btn:
			updateNotification();
			break;
		case R.id.notification_clean_btn:
			cleanNotification();
			break;
		case R.id.notification_navigation_btn:
			navigationNotification();
			break;
		case R.id.notification_dowlend_btn:
			dowlendNotification();
			break;
		case R.id.notification_unknowdowlend_btn:
			unknowDowlendNotification();
			break;
		case R.id.notification_bigView_btn:
			bigViewNotification();
			break;
		case R.id.notification_myself_btn:
			myNotification();
			break;
		}
	}
	
	/*发送通知*/
	public void sendNotification() {
		/* 构造通知显示界面 */
		NotificationCompat.Builder builder = new NotificationCompat.Builder(
				this);
		builder.setSmallIcon(R.drawable.img_smile); // 设置通知显示图标
		builder.setContentTitle("饿了么");
		builder.setContentText("你有新的饿了么订单,请及时处理");
		builder.setAutoCancel(true);  //点击通知后消失
		builder.setTicker("你有新的饿了么订单,请及时处理");  //通知出现时让其滚动显示这段内容
		
		/* 通知行为,点击通知时启动actvity 行为必须放在发送通知之前*/
		Intent intent = new Intent(this, MusicActivity.class);
		int requestCode = 1; // 请求码,跟activity有回传值启动请求码一致
		PendingIntent pendingIntent = PendingIntent.getActivity(this,
				requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
		builder.setContentIntent(pendingIntent);  //点击时启动activity

		/* 发送通知 */
	//	NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
		int notificationId = 1; // 作为通知的唯一标识id,当多次发送时会去比照这个id若有这个id并且通知还没取消,则不会再次发送。
		// Notification notification = builder.getNotification(); // 这个方法过时了
		Notification notification = builder.build();
		manager.notify(notificationId, notification);
	}

	/*刷新通知*/
	public void updateNotification(){
		/*设置通知界面*/
		NotificationCompat.Builder builder = new NotificationCompat.Builder(
				this);
		builder.setSmallIcon(R.drawable.img_person); // 设置通知显示图标
		builder.setContentTitle("刷新饿了么");
		builder.setContentText("刷新饿了么++你有新的饿了么订单,请及时处理");
		builder.setAutoCancel(true);  //点击通知后消失
		builder.setTicker("刷新饿了么——————你有新的饿了么订单,请及时处理");  //通知出现时让其滚动显示这段内容
		
		
		int notificationId = 1; // 统一唯一标识id就可以刷新通知
		// Notification notification = builder.getNotification(); // 这个方法过时了
		Notification notification = builder.build();
		manager.notify(notificationId, notification);
	}
	
	/*清除通知*/
	public void cleanNotification(){
		manager.cancel(1);
	}
	
	/*通知导航1、常规activity(工作流中的axtivity) 2、特殊activity,工作流之外的activity*/
	public void navigationNotification(){
		NotificationCompat.Builder builder = new NotificationCompat.Builder(
				this);
		builder.setSmallIcon(R.drawable.meituan_image8); // 设置通知显示图标
		builder.setContentTitle("导航通知");
		builder.setContentText("导航通知,点击通知启动activity返回时不返回到主界面,返回到指定的parentactivity界面");
		builder.setAutoCancel(true);  //点击通知后消失
		builder.setTicker("导航通知,点击通知启动activity返回时不返回到主界面,返回到指定的parentactivity界面");  //通知出现时让其滚动显示这段内容
		
		/* 通知行为,点击通知时启动actvity 行为必须放在发送通知之前*导航通知就需要建立返回栈并在xml文件中指定父activity*/
		Intent intent = new Intent(this, MusicActivity.class);
		TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);  //得到返回栈
		stackBuilder.addParentStack(MusicActivity.class);  //向返回栈中压入activity,这里注意不是压入的父activity,而是点击通知启动的activity
		stackBuilder.addNextIntent(intent);
		
		int requestCode = 1; // pendingIntent 是由stackBuilder工厂得到
		PendingIntent pendingIntent = stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_CANCEL_CURRENT);
		builder.setContentIntent(pendingIntent);  //点击时启动activity

		/* 发送通知 */
	//	NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);//  启动这个服务可以定义为全局
		int notificationId = 11; // 作为通知的唯一标识id,当多次发送时会去比照这个id若有这个id并且通知还没取消,则不会再次发送。
		// Notification notification = builder.getNotification(); // 这个方法过时了
		Notification notification = builder.build();
		manager.notify(notificationId, notification);
	}
	
	/*确定型下载通知*/
	public void dowlendNotification(){
		final NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
		builder.setSmallIcon(R.drawable.img_buetyful);
		builder.setContentTitle("下载通知");
		builder.setContentText("正在下载xxxx");
		builder.setTicker("开始下载xxxxxxx");
		builder.setAutoCancel(true);
		
		final int notificationId = 100;
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				for(int i = 1;i <= 100;i++){
					builder.setProgress(100, i, false);
					manager.notify(notificationId, builder.build());  //builder.build()这个参数必须在这里定义
					try {
						Thread.sleep(200);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				builder.setContentText("下载完成");
				builder.setProgress(0, 0, false);  // 下载完成让进度条消失
				manager.notify(notificationId, builder.build());
			}
		}).start();
	}
	
	/*不确定型下载通知*/
	public void unknowDowlendNotification(){
		NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
		builder.setSmallIcon(R.drawable.img_buetyful);
		builder.setContentTitle("下载通知");
		builder.setContentText("正在下载xxxx");
		builder.setTicker("开始下载xxxxxxx");
		builder.setAutoCancel(true);
		builder.setProgress(0, 0, true);  // true false 决定是确定型seekbar还是不确定型seekbar
		int notificationId = 101;
		manager.notify(notificationId, builder.build());
	}
	
	/*bigView通知*/
	public void bigViewNotification(){
		NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
		builder.setSmallIcon(R.drawable.meituan_image8);
		builder.setContentTitle("闹钟");
		//builder.setContentText("睡你麻痹起来嗨");
		builder.setTicker("睡你麻痹起来嗨");
		builder.setAutoCancel(true);
		builder.setStyle(new NotificationCompat.BigTextStyle().bigText("睡你麻痹起来嗨"));
		
		
		Intent playIntent = new Intent(this,PlayerService.class);
		playIntent.setAction("aaaa");  //必须设置action才能传不同的参数
		playIntent.putExtra("MUSIC_STATE", 11);
		playIntent.putExtra("MUSIC_PATH", "file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + "/a.mp3");
		PendingIntent playPendingIntent = PendingIntent.getService(this, 10, playIntent, PendingIntent.FLAG_CANCEL_CURRENT);
		builder.addAction(R.drawable.img_person, "播放", playPendingIntent);   //设置下面两个按钮显示的图标以及内容
		
		Intent pauseIntent = new Intent(this,PlayerService.class);
		pauseIntent.putExtra("MUSIC_STATE", 1);
		pauseIntent.setAction("bbbb");//这里也要设置action而且不能刚上面的一样
		PendingIntent pausePendingIntent = PendingIntent.getService(this, 10, pauseIntent, PendingIntent.FLAG_CANCEL_CURRENT);
		builder.addAction(R.drawable.img_smile, "暂停", pausePendingIntent);
		int id = 1002;
		manager.notify(id, builder.build());
	}
	
	/*自定义通知显示栏*/
	public void myNotification(){
		
		NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
		builder.setSmallIcon(R.drawable.adapter_homework_icon);  //自定义Notification必须至少设置这项才会发送成功
		RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.my_notification_layout);   //xml资源布局文件
		
		builder.setContent(remoteViews);
		int id = 111;
		manager.notify(id, builder.build());
	}
}


service:

package notification;

import java.io.IOException;

import mylog.Mylog;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class PlayerService extends Service {
	MediaPlayer mMediaPlayer ;
	@Override
	public void onCreate() {
		super.onCreate();
		mMediaPlayer = new MediaPlayer();
	}
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		String path = intent.getStringExtra("MUSIC_PATH");
		
		if(intent.getIntExtra("MUSIC_STATE", 0)  == 1){
			pauseMusic();
		}else{
			pauseMusic();
			playMusic(path);
		}
			
		
		return super.onStartCommand(intent, flags, startId);
	}
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	
	public void pauseMusic(){
		if(mMediaPlayer.isPlaying()){
			mMediaPlayer.pause();
		}else{
			mMediaPlayer.start();
		}
	}
	
	/*播放音乐*/
	public void playMusic(String path){
		if(mMediaPlayer != null){
			try {
				mMediaPlayer.reset();
				mMediaPlayer.setDataSource(path);
				mMediaPlayer.prepare();
				mMediaPlayer.start();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}


主布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <Button 
        android:id="@+id/notification_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="点击发送通知"/>
    
    <Button 
        android:id="@+id/notification_update_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="刷新通知"/>
    
    <Button 
        android:id="@+id/notification_clean_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="清除通知"/>
    
    <Button 
        android:id="@+id/notification_navigation_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="导航通知"/>
    
    <Button 
        android:id="@+id/notification_dowlend_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="确定型下载通知"/>
    
    <Button 
        android:id="@+id/notification_unknowdowlend_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="不确定型下载通知"/>
    
    <Button 
        android:id="@+id/notification_bigView_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="bigView通知"/>
    
    <Button 
        android:id="@+id/notification_myself_btn"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="自定义通知显示拦"/>
    

</LinearLayout>

自定义notification xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mp3_btn_linearLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:gravity="center_vertical"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/play_mode_img"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="3dp"
        android:layout_weight="1"
        android:clickable="true"
        android:src="@drawable/play_list_mode_sequent_normal" />

    <ImageView
        android:id="@+id/mp3_lastMusic_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:clickable="true"
        android:src="@drawable/landscape_player_btn_pre_normal" />

    <ImageView
        android:id="@+id/mp3_puseMusic_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:clickable="true"
        android:src="@drawable/landscape_player_btn_play_normal" />

    <ImageView
        android:id="@+id/mp3_nextMusic_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:clickable="true"
        android:src="@drawable/landscape_player_btn_next_normal" />


</LinearLayout>





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android常驻通知(Notification)是指在用户状态栏中一直显示的通知图标和文本内容,不会因为用户操作或应用进程被销毁而消失。常驻通知通常用于实时监测、后台服务、音乐播放等需要持续提醒用户的场景。 常驻通知的实现步骤如下: 1. 首先,需要创建一个Notification对象,包括通知图标、标题、内容等信息。 2. 然后,创建一个PendingIntent,用于定义用户点击通知后的操作,比如打开应用的某个Activity或执行某个Service。 3. 创建一个NotificationChannel(通知渠道),用于定义通知的重要程度,包括声音、震动等设置。 4. 将Notification对象与PendingIntent关联,并将其设置为常驻通知的优先级。 5. 最后,调用NotificationManager的notify方法,将通知显示在用户的状态栏上。 需要注意的是,常驻通知存在一些使用限制和最佳实践: 1. 用户可以通过设置中的通知管理来关闭或打开特定应用的常驻通知。 2. 常驻通知不适合用于广告或频繁推送的内容,以免打扰用户。 3. 为了避免误导用户,常驻通知的图标和文本内容应与应用的实际情况相符。 4. 如果需要更新通知的内容或操作,可以使用NotificationManager的notify方法进行更新,并保持通知id不变。 总之,常驻通知Android提供的一个重要功能,可以实现持续提醒用户和后台监测的需求。但应用开发者需要注意使用场景和用户体验,遵循Android的最佳实践,以确保用户对常驻通知的接受和理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值