概述

通知(Notification)就是程序在不影响用户操作的情况下,通过手机顶部弹出消息告诉用户的一种信息通知方式,而且能够通过下拉通知操作抽屉通知,实现Notification与活动、通知和服务通信。比如:通知与活动相互通信,活动通过NotificationManager发送通知(创建通知),而抽屉通知里面的操作则通过发送广播事件传递信息,此时活动仅仅要已经注冊过该广播事件的接收器,那么就能接收到通知的信息,从而实现通知和活动交互。

样例(通知和活动同步音乐播放和暂停)

<?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" > <FrameLayout android:layout_width="match_parent"
android:layout_height="match_parent"> <ImageView android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/bg"
android:scaleType="fitXY"/> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/play_over"
android:layout_gravity="center"
android:clickable="true"
android:id="@+id/imageView"
android:background="@drawable/img_bg"/> </FrameLayout> </LinearLayout>
<?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="64dp"
android:background="#e0e0e0"
android:orientation="horizontal"> <ImageView
android:id="@+id/imageView1"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@drawable/sc"/> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"> <ImageView
android:id="@+id/image_control"
android:clickable="true"
android:padding="4dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/play_over"/> <TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/image_control"
android:padding="4dp"
android:text="Sweet Child O' Mine"
android:singleLine="true"
android:textAppearance="?android:attr/textAppearanceMedium"/> <TextView
android:id="@+id/tv_nowTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/image_control"
android:text="00:00"
android:layout_alignParentBottom="true"/> <TextView
android:id="@+id/tv_totallTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:text="00:00"/> </RelativeLayout> </LinearLayout>
package com.liujun.activity;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask; import com.liujun.liujunmusicnotification.R; import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.RemoteViews; public class MainActivity extends Activity { private MediaPlayer mediaPlayer;//媒体播放器 private NotificationManager notificationManager;//通知管理器 private ImageView imageView;//播放音乐图片button private boolean isPlaying=false;//是否正在播放音乐 //意图
public static final String PLAYMUSIC_INTENT="PLAYMUSIC_INTENT";
public static final String PAUSEMUSIC_INTENT="PAUSEMUSIC_INTENT"; //通知标识ID
public static final int NOTIFICATION_ID=1; //时间计时器
private Timer timer; private MyBroadCastRecever recever; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mian_activity); //实例化媒体播放器
mediaPlayer=MediaPlayer.create(this, R.raw.sc); //实例化通知管理器
notificationManager=(NotificationManager) this.getSystemService(NOTIFICATION_SERVICE); timer=new Timer(); imageView=(ImageView) this.findViewById(R.id.imageView);
imageView.setOnClickListener(onClickListener); //注冊接收通知栏发送的广播事件
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(PAUSEMUSIC_INTENT);
intentFilter.addAction(PLAYMUSIC_INTENT); recever=new MyBroadCastRecever(); this.registerReceiver(recever, intentFilter);
} OnClickListener onClickListener=new OnClickListener() { @Override
public void onClick(View v) { if (!isPlaying) {//没有播放音乐 //開始播放音乐
playMusic(); //更改图片背景
imageView.setImageResource(R.drawable.pause_over); //更改标志
isPlaying=true; }else {//正在播放音乐 //暂停播放音乐
pauseMusic(); //更改图片背景
imageView.setImageResource(R.drawable.play_over); //更改标志
isPlaying=false; } //发送通知栏
activitySendNotification(); }
}; /**
* 播放音乐
*/
protected void playMusic() { if (mediaPlayer==null) { mediaPlayer=MediaPlayer.create(MainActivity.this, R.raw.sc);
} if (timer==null) { timer=new Timer(); } //开启计时器任务,每一个一秒 更新抽屉通知音乐播放进度
timer.schedule(new MyTimerTask(), 0, 1000); //播放音乐
mediaPlayer.start(); } //时间任务,更新抽屉通知,播放进度(注意:每次调用必须又一次new)
private class MyTimerTask extends TimerTask{ @Override
public void run() { //活动端发送通知
activitySendNotification();
} } /**
* 发送通知
*/
protected void activitySendNotification() { //通知构建器
NotificationCompat.Builder builder=new NotificationCompat.Builder(this); //设置小图标
builder.setSmallIcon(R.drawable.favorite); //载入自己定义远程布局
RemoteViews remoteView=(RemoteViews) new RemoteViews(this.getPackageName(), R.layout.my_notification); //设置不能够拉动取消抽屉通知
builder.setOngoing(true); //设置标题
remoteView.setTextViewText(R.id.tv_title, "Sweet Child O' Mine"); //当前播放时间(注意:当进入界面播放音乐时退出界面,不是暂停时退出界面,那么就有可能在程序运行
//onDestroy()方法时将mediaPlayer释放并置空了,而此段代码是在子线程中的,与主线程不同步退出,
//那么就导致mediaPlayer为空,从而报错)
if (mediaPlayer==null) {
return;
} Date currentDate=new Date(mediaPlayer.getCurrentPosition()); //总时长
Date totalDate=new Date(mediaPlayer.getDuration()); SimpleDateFormat simpleDateFormat=new SimpleDateFormat("mm:ss"); //设置当前播放时间进度
remoteView.setTextViewText(R.id.tv_nowTime, simpleDateFormat.format(currentDate)); //设置歌曲总时长
remoteView.setTextViewText(R.id.tv_totallTime, simpleDateFormat.format(totalDate)); Log.i("liujun", "是否正在播放音乐:--"+isPlaying); if (isPlaying) {//正在播放音乐 //显示能够暂停图片
remoteView.setImageViewResource(R.id.image_control, R.drawable.pause_over); }else { //显示能够播放图片
remoteView.setImageViewResource(R.id.image_control, R.drawable.play_over);
} //通知栏,交互互动
notificationToActivity(remoteView,isPlaying); //载入视图布局
builder.setContent(remoteView); //创建通知
Notification notification=builder.build(); //发送通知
notificationManager.notify(NOTIFICATION_ID, notification); } /**
* 通知栏交互活动
* @param isPlaying
*/
private void notificationToActivity(RemoteViews remoteView,boolean isPlaying) { Intent intent=new Intent(); if (isPlaying) {//正在播放音乐 //试图暂停播放音乐
intent.setAction(PAUSEMUSIC_INTENT); //更改图片
remoteView.setImageViewResource(R.id.image_control, R.drawable.pause_over); /* //更新标志
isPlaying=false;*/ }else {//没有播放音乐 //试图播放音乐
intent.setAction(PLAYMUSIC_INTENT); //更改图片
remoteView.setImageViewResource(R.id.image_control, R.drawable.play_over); /*//更新标志
isPlaying=true;*/
} //发送广播,更新Activity
PendingIntent pendingIntent=PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); remoteView.setOnClickPendingIntent(R.id.image_control, pendingIntent); } //广播接收器(接收通知发送的广播事件)
private class MyBroadCastRecever extends BroadcastReceiver{ @Override
public void onReceive(Context context, Intent intent) { if (intent.getAction()==PLAYMUSIC_INTENT) {//通知端播放音乐 //播放音乐
playMusic(); //是否播放正在播放音乐标志
isPlaying=true; //更改图片标志
imageView.setImageResource(R.drawable.pause_over); }else if(intent.getAction()==PAUSEMUSIC_INTENT){//通知端暂停音乐 //暂停音乐
pauseMusic(); //是否播放正在播放音乐标志
isPlaying=false; //更改图片标志
imageView.setImageResource(R.drawable.play_over); } //上面更新活动的信息,这时又要发送通知
activitySendNotification(); } } /**
* 暂停播放音乐
*/
protected void pauseMusic() { if (mediaPlayer!=null&&mediaPlayer.isPlaying()) { mediaPlayer.pause();
} //暂停发送通知
if (timer!=null) {
timer.cancel();
timer=null;
} } @Override
protected void onDestroy() { super.onDestroy(); this.unregisterReceiver(recever); //释放资源
if (mediaPlayer!=null) { mediaPlayer.release(); mediaPlayer=null;
} //是否通知栏
notificationManager.cancel(NOTIFICATION_ID); } }

Notification和Activity交互的更多相关文章

  1. android开发之使用Messenger实现service与activity交互

    service与activity交互的方式有多种,这里说说使用Messenger来实现两者之间的交互. Service程序 public class MessengerService extends ...

  2. Fragment与Activity交互(使用接口)

    在Fragment中: 1. // 定义一个回调接口,该Fragment所在Activity需要实现该接口// 该Fragment将通过该接口与它所在的Activity交互 { public void ...

  3. 多个Activity交互的生命周期:

    一.多个Activity交互的生命周期: A Activity打开B Activity的时候:        A Activity                    B Activity     ...

  4. 深入分析:Fragment与Activity交互的几种方式(一,使用Handler)

    这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...

  5. Android Activity交互及App交互

    Android交互--------->Intent Activity之间----->Explicit Intent App之间--------->Implicit Intent

  6. Android基础——Fragment与Activity交互

    今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看 ...

  7. Android Fragment与Activity交互的几种方式

    这里我不再详细介绍那写比较常规的方式,例如静态变量,静态方法,持久化,application全局变量,收发广播等等. 首先我们来介绍使用Handler来实现Fragment与Activity 的交互. ...

  8. Android系统编程入门系列之界面Activity交互响应

    在上篇文章中已经了解到界面Activity的绘制完全依赖其加载的视图组件View,不仅如此,用户的每次触摸操作都可以在界面Activity内接收并响应,也可以直接传递给其中的某个视图View响应.本文 ...

  9. 深入分析:Fragment与Activity交互的几种方式(三,使用接口)

    第一步:我们需要在Fragment中定一个接口,并确保我们的容器Activity实现了此接口: public interface onTestListener { public void onTest ...

随机推荐

  1. OSPF理论总结

    OSPF学习总结一.OSPF协议的报文类型: 1. Hello 报文:主要用来发现.建立和维护邻居关系. 2. DD报文:数据库的描述报文,主要用来两台路由器的数据库同步. 3. LSR报文:链路状态 ...

  2. grails的controller和action那点事---远程调试groovy代码

    最近由于项目需要,用到了grails,这玩意确实好用,生产率高有类型python的速度与简洁.仅第一印象,用的还不深入,说的不对请轻拍. 遇到的几个问题: 1. groovy远程调试 玩Java的应该 ...

  3. Objective-C之成魔之路【16-使用文件】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 语言的设计 ...

  4. adt-bundle更新eclipse,以及搭建android环境

    曾经开发一直去android官网下载adt-bundle的.里面已经包括了eclipse和android SDK,搭建android环境特别方便,仅仅须要3步:1.下载并安装jdk(也就是jar se ...

  5. Linux进程同步之记录锁(fcntl)

    记录锁相当于线程同步中读写锁的一种扩展类型,可以用来对有亲缘或无亲缘关系的进程进行文件读与写的同步,通过fcntl函数来执行上锁操作.尽管读写锁也可以通过在共享内存区来进行进程的同步,但是fcntl记 ...

  6. Welcome Docker to SUSE Linux Enterprise Server【水平有限,中英对比,求纠错】

      原文:Welcome Docker to SUSE Linux Enterprise Server Lightweight virtualization is a hot topic these ...

  7. 仿CSDN Blog返回页面顶部功能

    只修改了2个地方: 1,返回的速度-->改成了慢慢回去.(原来是一闪而返回) 2,返回顶部图标出现的时机-->改成了只要不在顶部就显示出来.(原来是向下滚动500px后才显示) 注意:JS ...

  8. I深搜

    <span style="color:#330099;">/* I - 深搜 基础 Time Limit:1000MS Memory Limit:10000KB 64b ...

  9. BST树,B树、B-树、B+树、B*树

    BST树,B树.B-树.B+树.B*树 二叉搜索树(BST): 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树 ...

  10. win7,win8取得管理员权限 .reg文件

    Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\runas] @="获取管理员所有权" " ...