Android中Notification的使用
来源:互联网 发布:mysql insert安装教程 编辑:程序博客网 时间:2024/05/22 03:31
本人入行时间短,自知能力有限,写博客只是为了方便以后工作项目开发中的实用,毕竟都是自己在实际项目开发中亲身实现的功能。另一方面本人工作中只是个小小的码农,也没多少时间好好整理,等闲暇下来会定期不定期的好好修改,毕竟写的不是很专业,可能只有自己能看懂吧。
如想学到更多有关notification的有关用法,本人推荐以下博客:
http://blog.csdn.net/vipzjyno1/article/details/25248021/
http://www.cnblogs.com/travellife/p/Android-Notification-xiang-jie.html
http://www.itnose.net/detail/6169442.html
本人的博客很简单,就是简单整理了一些平时经常看到的Notification的用法。
首先需要创建一个NotificationManager来管理通知:
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);为了保证程序在所有的Android系统版本上都能正常工作,推荐使用support-v4库中的NotificationCompat类创建Notification,
Notification notification = new NotificationCompat.Builder(getApplication()).build();
1.普通样式通知栏NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);Notification notification = new NotificationCompat.Builder(getApplication()).setContentTitle("普通样式通知栏")//通知栏的标题.setContentText("我是一个普通样式通知栏!")//通知栏的内容.setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知自动取消 .setTicker("你有新的通知!")//通知首次出现在通知栏,带上升动画效果.setPriority(NotificationCompat.PRIORITY_MAX)//设置通知的优先级.setDefaults(Notification.DEFAULT_ALL)//给通知添加声音、闪光灯和震动效果,不过单独设置震动效果需要添加系统权限.setWhen(System.currentTimeMillis())//指定通知产生的时间,会在通知信息里显示.setSmallIcon(R.drawable.alarm_tick)//设置通知的小图标,显示在系统状态栏上.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.alarm_tick))//设置通知的大图标,当下拉系统状态栏时显示.build();manager.notify(1, notification);//让通知显示出来
2.常驻样式通知栏
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);PendingIntent pi = PendingIntent.getActivity(getApplication(), 0, getIntent(), 0);//执行跳转动作,getBroadcast、getService等Notification notification = new NotificationCompat.Builder(getApplication()).setContentTitle("常驻样式通知栏")//通知栏的标题.setContentText("使用cancel方法才可以去掉!")//通知栏的内容.setTicker("常驻通知来了!")//通知首次出现在通知栏,带上升动画效果.setContentIntent(pi)//执行跳转动作.setDefaults(Notification.DEFAULT_ALL)//给通知添加声音、闪光灯和震动效果,不过单独设置震动效果需要添加系统权限.setWhen(System.currentTimeMillis())//指定通知产生的时间,会在通知信息里显示.setSmallIcon(R.drawable.alarm_tick)//设置通知的小图标,显示在系统状态栏上.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.alarm_tick))//设置通知的大图标,当下拉系统状态栏时显示.build();notification.flags = Notification.FLAG_ONGOING_EVENT;//在顶部常驻manager.notify(1, notification);//让通知显示出来
常驻样式通知栏关键代码就是notification.flags = Notification.FLAG_ONGOING_EVENT;只有通过调用cancel方法才能清除。
manager.cancel(id);是清除一个特定的ID对应的通知;manager.cancelAll();是清除你发的所有通知。
3.跳转到指定Activity样式的通知栏
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);Intent resultIntent = new Intent(getApplication(), PlanActivity.class);PendingIntent pi = PendingIntent.getActivity(getApplication(), 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);//执行跳转动作,Notification notification = new NotificationCompat.Builder(getApplication()).setContentTitle("界面跳转样式通知栏")//通知栏的标题.setContentText("我可以跳转到其他Activity界面!")//通知栏的内容.setTicker("开始跳转Activity界面了!")//通知首次出现在通知栏,带上升动画效果.setContentIntent(pi)//执行跳转动作.setDefaults(Notification.DEFAULT_ALL)//给通知添加声音、闪光灯和震动效果,不过单独设置震动效果需要添加系统权限.setWhen(System.currentTimeMillis())//指定通知产生的时间,会在通知信息里显示.setSmallIcon(R.drawable.alarm_tick)//设置通知的小图标,显示在系统状态栏上.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.alarm_tick))//设置通知的大图标,当下拉系统状态栏时显示.build();manager.notify(1, notification);//让通知显示出来
跳转Activity界面样式通知栏关键还是靠PendingIntent类,getBroadcast()方法和getService()方法是类同的。
4.下载安装APK样式通知栏
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);Intent apkIntent = new Intent();apkIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);apkIntent.setAction(android.content.Intent.ACTION_VIEW);Uri uri = Uri.parse("file://" + "/sdcard/solitaire.apk");apkIntent.setDataAndType(uri, "application/vnd.android.package-archive");PendingIntent pi = PendingIntent.getActivity(getApplication(), 0, apkIntent, 0);//执行跳转动作,Notification notification = new NotificationCompat.Builder(getApplication()).setContentTitle("安装APK样式通知栏")//通知栏的标题.setContentText("安装APK程序!")//通知栏的内容.setTicker("点击安装APK程序了!")//通知首次出现在通知栏,带上升动画效果.setContentIntent(pi)//执行跳转动作.setDefaults(Notification.DEFAULT_ALL)//给通知添加声音、闪光灯和震动效果,不过单独设置震动效果需要添加系统权限.setWhen(System.currentTimeMillis())//指定通知产生的时间,会在通知信息里显示.setSmallIcon(R.drawable.alarm_tick)//设置通知的小图标,显示在系统状态栏上.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.alarm_tick))//设置通知的大图标,当下拉系统状态栏时显示.build();manager.notify(1, notification);//让通知显示出来
关键代码就是Uri uri = Uri.parse("file://" + "/sdcard/solitaire.apk");
apkIntent.setDataAndType(uri, "application/vnd.android.package-archive");
只要找准需要安装程序的路径和设置是安装程序的意图就可以了。
4.进度条样式通知栏
import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Context;import android.os.Bundle;import android.support.v4.app.NotificationCompat;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.xly.base.commons.BaseActivity;import com.xly.main.R;public class MainActivity extends BaseActivity implements OnClickListener{private Button start;private Button stop;private Button cancel;private NotificationManager manager;/** 通知的ID */int notifyId = 102;/** 通知的进度条数值 */int progress = 0;private NotificationCompat.Builder mBuilder;/** 下载线程是否暂停 */public boolean isPause = false;private DownloadThread downloadThread;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.progress);manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);initNotify();start = (Button) findViewById(R.id.start);stop = (Button) findViewById(R.id.stop);cancel = (Button) findViewById(R.id.cancel);start.setOnClickListener(this);stop.setOnClickListener(this);cancel.setOnClickListener(this);}private void initNotify() {mBuilder = new NotificationCompat.Builder(this);PendingIntent pi = PendingIntent.getActivity(getApplication(), 0, getIntent(), 0);mBuilder.setWhen(System.currentTimeMillis())////指定通知产生的时间,会在通知信息里显示.setContentIntent(pi).setPriority(Notification.PRIORITY_DEFAULT)//设置优先级.setOngoing(false)//true表示该通知正在进行.setDefaults(Notification.DEFAULT_VIBRATE)//设置为震动效果.setSmallIcon(R.drawable.alarm_tick)//设置状态栏图标.setTicker("开始下载");// 通知首次出现在通知栏,带上升动画效果的}/* * 开始下载 */public void startDownloadNotify(){isPause = false;//下载线程没有暂停if (downloadThread != null && downloadThread.isAlive()) {//线程执行过程中不用做任何操作}else{//线程没有执行就创建新线程并启动线程downloadThread = new DownloadThread();downloadThread.start();}}/* * 暂停下载 */public void stopDownloadNotify(){isPause = true;mBuilder.setContentTitle("下载已暂停");setNotify(progress);}/* * 取消下载 */public void cancelDownloadNotify(){if (downloadThread != null) {downloadThread.interrupt();}downloadThread = null;mBuilder.setContentTitle("下载已取消!").setProgress(0, 0, false);manager.notify(notifyId, mBuilder.build());}/** * 设置下载进度 */public void setNotify(int progress) {mBuilder.setProgress(100, progress, false); //第一个参数为进度的最大值,第二个参数代表进度的当前值,,第三个参数代表是否为确定样式manager.notify(notifyId, mBuilder.build());}/** * 下载线程 */class DownloadThread extends Thread {@Overridepublic void run() {int now_progress = 0;while (now_progress <= 100) {if(downloadThread == null){break;}if (!isPause) {progress = now_progress;mBuilder.setContentTitle("下载中......");now_progress += 10;}try {Thread.sleep(1000);//休眠1s} catch (InterruptedException e) {}}if(downloadThread != null){mBuilder.setContentTitle("下载完成!")// 下载完成移除进度条.setProgress(0, 0, false);manager.notify(notifyId, mBuilder.build());}}}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.start:startDownloadNotify();break;case R.id.stop:stopDownloadNotify();break;case R.id.cancel:cancelDownloadNotify();break;}}}
5.自定义样式通知栏
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);//设定RemoteViewsRemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_view);remoteViews.setImageViewResource(R.id.notification_icon, R.drawable.alarm_tick);remoteViews.setTextViewText(R.id.notification_title, "今日头条");remoteViews.setTextViewText(R.id.notification_content, "金州勇士官方宣布球队已经解雇了主帅马克-杰克逊,随后宣布了最后的结果。");remoteViews.setViewVisibility(R.id.notification_time, View.VISIBLE);//显示设置Notification notification = new NotificationCompat.Builder(getApplication()).setContent(remoteViews)//把自定义的视图放到通知里.setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示.setTicker("你有新的消息!").setPriority(Notification.PRIORITY_MAX)//设置通知的优先级.setOngoing(false)//设置为不是正在进行的,true为正在进行 ,效果和.flag一样.setSmallIcon(R.drawable.alarm_tick).build();//把通知显示出来manager.notify(1, notification);
自定义的界面布局为:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/notification_icon" android:layout_width="50dp" android:layout_height="50dp" android:layout_margin="5dp" android:contentDescription="@null" android:src="@drawable/alarm_tick" /><LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:id="@+id/notification_title" style="@style/NotificationTitle" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="标题" android:textSize="15sp" /> <TextView android:id="@+id/notification_time" style="@style/NotificationTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="15:49" android:textSize="12sp" /> </LinearLayout> <TextView android:id="@+id/notification_content" android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/NotificationContent" android:layout_marginTop="1dp" android:text="内容" android:textSize="12sp" /></LinearLayout></LinearLayout>
里面用到的style为:
<style name="NotificationContent"> <item name="android:textColor">?android:attr/textColorPrimary</item></style><style name="NotificationTitle"> <item name="android:textColor">?android:attr/textColorPrimary</item> <item name="android:textStyle">bold</item></style>
其实跟普通样式通知栏相比,就是设置了RemoteViews组件。
6.自定义带按钮样式通知栏(音乐播放样式的通知栏)
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.os.Bundle;import android.support.v4.app.NotificationCompat;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.RemoteViews;import android.widget.Toast;import com.xly.base.commons.BaseActivity;import com.xly.main.R;public class MainActivity extends BaseActivity implements OnClickListener{private Button start;/** Notification 的ID */int notifyId = 101;/** NotificationCompat 构造器*/NotificationCompat.Builder mBuilder;/** 是否在播放*/public boolean isPlay = false;/** 通知栏按钮广播 */public ButtonBroadcastReceiver bReceiver;/** 通知栏按钮点击事件对应的ACTION */public final static String ACTION_BUTTON = "com.notifications.intent.action.ButtonClick";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.progress);bReceiver = new ButtonBroadcastReceiver();IntentFilter filter = new IntentFilter();filter.addAction(ACTION_BUTTON);registerReceiver(bReceiver, filter);start = (Button) findViewById(R.id.start);start.setOnClickListener(this);}@Overridepublic void onClick(View v) {NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);mBuilder = new NotificationCompat.Builder(getApplication());//设定RemoteViewsRemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_view);remoteViews.setImageViewResource(R.id.song_icon, R.drawable.alarm_tick);remoteViews.setTextViewText(R.id.song_singer, "叶时伟");remoteViews.setTextViewText(R.id.song_name, "屌丝的梦想");/* * API3.0 以上的时候才会显示按钮 * 如果版本号低于(3。0),那么不显示按钮 */if(BaseTools.getSystemVersion() <= 9){remoteViews.setViewVisibility(R.id.ll_button, View.GONE);} else {remoteViews.setViewVisibility(R.id.ll_button, View.VISIBLE);}//点击的事件处理Intent buttonIntent = new Intent(ACTION_BUTTON);/* 上一首按钮 */buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PREV_ID);PendingIntent intentPrev = PendingIntent.getBroadcast(this, 1, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);remoteViews.setOnClickPendingIntent(R.id.prev, intentPrev);/* 播放/暂停按钮 */buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_PALY_ID);PendingIntent intentPlay = PendingIntent.getBroadcast(this, 2, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);remoteViews.setOnClickPendingIntent(R.id.play, intentPlay);/* 下一首按钮 */buttonIntent.putExtra(INTENT_BUTTONID_TAG, BUTTON_NEXT_ID);PendingIntent intentNext = PendingIntent.getBroadcast(this, 3, buttonIntent, PendingIntent.FLAG_UPDATE_CURRENT);remoteViews.setOnClickPendingIntent(R.id.next, intentNext);mBuilder.setContent(remoteViews)//把自定义的视图放到通知里.setWhen(System.currentTimeMillis())// 通知产生的时间,会在通知信息里显示.setTicker("你有新的消息!").setPriority(Notification.PRIORITY_MAX)//设置通知的优先级.setOngoing(false)//设置为不是正在进行的,true为正在进行 ,效果和.flag一样.setSmallIcon(R.drawable.alarm_tick);//把通知显示出来manager.notify(1, mBuilder.build());}public final static String INTENT_BUTTONID_TAG = "ButtonId";/** 上一首 按钮点击 ID */public final static int BUTTON_PREV_ID = 1;/** 播放/暂停 按钮点击 ID */public final static int BUTTON_PALY_ID = 2;/** 下一首 按钮点击 ID */public final static int BUTTON_NEXT_ID = 3;/** * 广播监听按钮点击时间 */public class ButtonBroadcastReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if(action.equals(ACTION_BUTTON)){//通过传递过来的ID判断按钮点击属性或者通过getResultCode()获得相应点击事件int buttonId = intent.getIntExtra(INTENT_BUTTONID_TAG, 0);switch (buttonId) {case BUTTON_PREV_ID:Toast.makeText(getApplicationContext(), "上一首", Toast.LENGTH_SHORT).show();break;case BUTTON_PALY_ID:String play_status = "";if(isPlay){play_status = "开始播放";}else{play_status = "已暂停";}//showButtonNotify();Toast.makeText(getApplicationContext(), play_status, Toast.LENGTH_SHORT).show();break;case BUTTON_NEXT_ID:Toast.makeText(getApplicationContext(), "下一首", Toast.LENGTH_SHORT).show();break;default:break;}}}}@Overrideprotected void onDestroy() {if (bReceiver != null) {unregisterReceiver(bReceiver);}super.onDestroy();}}用到的界面布局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/song_icon" android:layout_width="50dp" android:layout_height="50dp" android:layout_margin="5dp" android:contentDescription="@null" android:src="@drawable/alarm_tick" /><LinearLayout android:layout_width="0dp" android:layout_weight="1" android:layout_margin="5dp" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/song_singer" style="@style/NotificationTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="歌手" android:textSize="15sp" /> <TextView android:id="@+id/song_name" style="@style/NotificationContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="歌名" android:textSize="12sp" /></LinearLayout><LinearLayout android:id="@+id/ll_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_gravity="center_vertical" android:layout_marginLeft="5dp" > <ImageButton android:id="@+id/prev" style="@style/btn_style" android:src="@drawable/prev" /> <ImageButton android:id="@+id/play" style="@style/btn_style" android:src="@drawable/play" /> <ImageButton android:id="@+id/next" style="@style/btn_style" android:src="@drawable/next" /></LinearLayout></LinearLayout>用到的style资源如下:
<style name="btn_style"> <item name="android:layout_width">48dip</item> <item name="android:layout_height">48dip</item> <item name="android:layout_gravity">center|right</item> <item name="android:background">?android:listChoiceBackgroundIndicator</item></style>判断版本的类如下:
import android.content.Context;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;public class BaseTools {/** * 获取当前应用版本号 * @param context * @return version * @throws Exception */public static String getAppVersion(Context context) throws Exception {// 获取packagemanager的实例PackageManager packageManager = context.getPackageManager();// getPackageName()是你当前类的包名,0代表是获取版本信息PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(),0);String versionName = packInfo.versionName;return versionName;}/** * 获取当前系统SDK版本号 */public static int getSystemVersion(){/*获取当前系统的android版本号*/int version= android.os.Build.VERSION.SDK_INT;return version;}}
- Android中Notification的使用
- Android中Notification的使用
- Android中Notification的使用
- Android中使用Notification
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中Notification的使用以及自定义
- Android中通知的使用-----Notification详解
- android中通知栏notification的使用
- Android开发中Notification的使用
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android中通知的使用-----Notification详解
- Android 中Notification和NotificationManager的使用
- Notification,Android中通知的使用
- L1-048. 矩阵A乘以B
- java基本数据类型和引用数据类型
- Android Studio中JNI NDK开发(一)
- CSS overflow 属性
- java equals重写判断一个类的两个对象(摘自java从入门到精通)
- Android中Notification的使用
- 数据结构专题——线段树线段树
- debug.keystore的默认值
- 学习play_数据交互
- 172
- Linux命令之chmod
- ArcGIS中QueryTask,FindTask,IndentifyTask 之间的区别
- 名企笔试:搜狗2016研发工程师笔试(矩阵元素相乘)2017-03-13 算法爱好者
- 科目二考试