Android开发学习之路--Notification之初体验
一般当我们收到短信啊,微信啊,或者有些app的提醒,我们都会在通知栏收到一天简单的消息,然后点击消息进入到app里面,其实android中有专门的Notification的类可以完成这个工作,这里就实现下这个功能。
首先新建NotificationTest工程,然后添加一个按钮,用来触发通知,然后编写代码如下:
package com.example.jared.notificationtest; import android.app.NotificationManager;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button sendNotificationBtn; private int mId = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendNotificationBtn = (Button)findViewById(R.id.sendNotification);
sendNotificationBtn.setOnClickListener(new myOnClickListener());
} private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.sendNotification:
setSendNotificationBtn();
break;
default:
break;
}
}
} public void setSendNotificationBtn () {
NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("My Notification")
.setContentText("Hello Notification");
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(mId, notification.build());
}
}
这里了用了NotificatonCompat.Builder来创建一个简单的Notification,setSmallIcon是指定其中的图标,setContentTitle方法是指定标题,setContentText指定内容,然后通过getSystemService获取通知的管理类,通过notify方法发送通知,其中mId是一个id号,每一个通知有其独特的通知号,不能重复。
运行效果如下所示:
接着我们来实现点击通知后跳转到对应的Activity中,然后消除这条通知。再创建一个Activity,布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.jared.notificationtest.Notification">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="欢迎点击通知事件!"
android:layout_margin="20dp"
android:textSize="20dp"/>
</LinearLayout>
这里就一个textview用来显示下信息,接着编写代码如下:
package com.example.jared.notificationtest; import android.app.NotificationManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; public class Notification extends AppCompatActivity { private int mId = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notification);
NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
manager.cancel(mId);
}
}
这里进入到Activity后就把通知清除掉,接着就是修改MainActivity代码:
package com.example.jared.notificationtest; 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.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button sendNotificationBtn; private int mId = 1;
private int numMessage = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendNotificationBtn = (Button)findViewById(R.id.sendNotification);
sendNotificationBtn.setOnClickListener(new myOnClickListener());
} private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.sendNotification:
setSendNotificationBtn();
break;
default:
break;
}
}
} public void setSendNotificationBtn () {
NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("My Notification")
.setContentText("Hello Notification")
.setNumber(++numMessage); Intent intent = new Intent(this, Notification.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
notification.setContentIntent(pendingIntent); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(mId, notification.build());
}
}
这里又添加了setNumber方法,主要是显示来了几条通知,比如微信中就需要知道,然后实例化了一个intent,再实例化一个pendingIntent,获取activity,在NotificationCompat.Builder里setContentIntent,之后就可以达到我们的效果,运行并点击通知如下所示:
如上所示收到了6条通知,然后点击后通知也消除了。
一般在下载歌曲啊,图片啊的时候,会有进度条表示下载的过程,这里来模拟实现下这个功能,修改MainAcitivy代码如下:
package com.example.jared.notificationtest; 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.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private Button sendNotificationBtn; private int mId = 1;
private int numMessage = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendNotificationBtn = (Button)findViewById(R.id.sendNotification);
sendNotificationBtn.setOnClickListener(new myOnClickListener());
} private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.sendNotification:
setSendNotificationBtn();
break;
default:
break;
}
}
} public void setSendNotificationBtn () {
final NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Music Download")
.setContentText("burning.mp3")
.setNumber(++numMessage); Intent intent = new Intent(this, Notification.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
notification.setContentIntent(pendingIntent); final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
new Thread(
new Runnable(){
@Override
public void run() {
for(int cnt=0; cnt<=100; cnt++){
notification.setProgress(100, cnt, false);
manager.notify(mId, notification.build());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
Log.d(TAG, "Sleep failure");
}
}
notification.setContentText("Download complete");
notification.setProgress(0, 0, false);
manager.notify(mId, notification.build());
}
}
).start();
}
}
这里通过setProgress方法来实现,这里开了一个Thread,当下载完成后重新设置下内容。运行结果如下:
图1显示进度条在走,图2完成了下载功能。
一般收到通知,手机都会有一段声音,加上震动,那么接下来来实现这个功能。上图,如果下载完成后,就放一段音乐并且震动,修改代码如下:
package com.example.jared.notificationtest; import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button; import java.io.File; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private Button sendNotificationBtn; private int mId = 1;
private int numMessage = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendNotificationBtn = (Button)findViewById(R.id.sendNotification);
sendNotificationBtn.setOnClickListener(new myOnClickListener());
} private class myOnClickListener implements View.OnClickListener {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.sendNotification:
setSendNotificationBtn();
break;
default:
break;
}
}
} public void setSendNotificationBtn () {
final NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Music Download")
.setContentText("burning.mp3")
.setNumber(++numMessage); Intent intent = new Intent(this, Notification.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
notification.setContentIntent(pendingIntent); final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
new Thread(
new Runnable(){
@Override
public void run() {
for(int cnt=0; cnt<=100; cnt++){
notification.setProgress(100, cnt, false);
manager.notify(mId, notification.build());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Log.d(TAG, "Sleep failure");
}
}
notification.setContentText("Download complete");
notification.setProgress(0, 0, false);
Uri soundUri = Uri.fromFile(new File("/system/media/audio/animationsounds/bootSound.ogg"));
notification.setSound(soundUri);
long[] vibrates = {0, 1000, 1000, 1000};
notification.setVibrate(vibrates);
manager.notify(mId, notification.build());
}
}
).start();
}
}
这里加上了setSound和setVibrate方法,并且需要在AndroidManifest中添加权限:
<uses-permission android:name="android.permission.VIBRATE"/>
这里的歌曲名是通过adb shell查看系统的存在的音乐:
下载到手机运行后就可以观察效果。
当然还可以控制led灯,不知为啥led灯的效果一直没有,网上翻阅很多资料也没找到问题所在,若有朋友知道,麻烦告知一二不甚感激。
notification.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
long[] vibrates = {0, 1000, 1000, 1000};
notification.setVibrate(vibrates);
notification.setLights(Color.GREEN, 1000, 1000);
关于Notification基本上就学到这里了。
Android开发学习之路--Notification之初体验的更多相关文章
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android开发学习之路--Service之初体验
android最后一个组件便是service了,终于学习到最后一个组件了,从年前的开发环境的搭建,到现在学到最后一个组件花了三周的时间,期间记录的点点滴滴,照着书本学习编写的代码都受益匪浅,这里要感谢 ...
- Android开发学习之路--React-Native之初体验
近段时间业余在学node.js,租了个阿里云准备搭建后端,想用node.js,偶尔得知react-native可以在不同平台跑,js在iOS和android上都可以运行ok,今天就简单学习下rea ...
- Android开发学习之路--RxAndroid之初体验
学了一段时间android,看了部分的项目代码,然后想想老是学基础也够枯燥乏味的,那么就来学习学习新东西吧,相信很多学java的都听说过RxJava,那么android下也有RxAndroid. Rx ...
- Android开发学习之路--传感器之初体验
说到传感器,还是有很多的,有加速度啊,光照啊,磁传感器等等.当然android手机之所以称为智能手机,少不了这几款传感器的功劳了.下面就学习下了,这里主要学习光照,加速度和磁. 新建工程emSenso ...
- Android开发学习之路--Camera之初体验
顾名思义Camera就是拍照和录像的功能,像微信里面,我们想拍照传一下照片,就可以通过camera来拍照,然后存储照片,发送给好友.那么微信的app里面是不会直接通过camera api来实现的,因为 ...
- Android开发学习之路--UI之初体验
之前都是学习Activity,对于布局都没有做过学习,这里就简单学习下吧.下面看下Android Studio下有哪些控件: 这里分为Widgets,Text Fields,Containers,Da ...
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
随机推荐
- [Project] Simulate HTTP Post Request to obtain data from Web Page by using Python Scrapy Framework
1. Background Though it's always difficult to give child a perfect name, parent never give up trying ...
- Python【第三课】 函数基础
本篇内容 函数基本语法及特性 嵌套函数 递归函数 匿名函数 高阶函数 内置函数 1.函数的基本语法及特性 1.1 函数概念 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提 ...
- Python-闭包详解
在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个 ...
- 【Tensorflow系列】使用Inception_resnet_v2训练自己的数据集并用Tensorboard监控
[写在前面] 用Tensorflow(TF)已实现好的卷积神经网络(CNN)模型来训练自己的数据集,验证目前较成熟模型在不同数据集上的准确度,如Inception_V3, VGG16,Inceptio ...
- Linux常用命令大全(归类)
最近都在和Linux打交道,这方面基础比较薄弱的我只好买了本鸟哥的书看看,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因, ...
- 如何用cmd通过sublime打开文件?
sublime 提供了专门的命令工具subl.exe,就在它的安装目录之下,讲安装目录配置到系统环境变量中就OK了.具体如下: 1.找到sublime安装路径 如我的默认路径:C:\Program F ...
- opencv之人脸识别
最近在做一个类似于智能广告投放的项目,简单思路是利用opencv获取摄像头图像,然后调用接口或利用其他一些离线模型进行人脸属性识别,进而投放广告.本篇先简单介绍利用opecv进行人脸识别. # -*- ...
- 初识Spring Boot框架(二)之DIY一个Spring Boot的自动配置
在上篇博客初识Spring Boot框架中我们初步见识了SpringBoot的方便之处,很多小伙伴可能也会好奇这个Spring Boot是怎么实现自动配置的,那么今天我就带小伙伴我们自己来实现一个简单 ...
- javaweb异常提示信息统一处理(使用springmvc,附源码)
一.前言 后台出现异常如何友好而又高效地回显到前端呢?直接将一堆的错误信息抛给用户界面,显然不合适. 先不考虑代码实现,我们希望是这样的: (1)如果是页面跳转的请求,出现异常了,我们希望跳转到一个异 ...
- ejabberd编译更新脚本
ejabberd编译更新脚本 (金庆的专栏 2016.8) 用rebar编译ejabberd源码,然后复制编译所得beam文件到ejabberd安装目录, 调用ejabberdctl热更新. call ...