android 双击退出 Notitfcation 通知
- 一、双击退出
- 二、 Notitfcation 通知
- 1,介绍
- 2,基本用法
- ①普通通知
- ②进度条通知
- ③交互通知(点击跳转页面)
- 3,属性
- 4,PendingIntent
- 三、自定义通知
一、双击退出
原理:
当按下BACK键时,会被onKeyDown捕获
判断是BACK键,则执行exit方法
判断用户两次按键的时间差是否在一个预期值之内
是的话直接直接退出,不是的话提示用户再按一次后退键退出
//设定一个long类型的数据
long exitTime;
//重新onkeyDown方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//判断用户是否点击返回键
if (keyCode == KeyEvent.KEYCODE_BACK) {
//判断用户两次按钮的世界是否在一个预期值之内,是退出,不是提示
if (System.currentTimeMillis() - exitTime > 2000) {
//提示语
Toast.makeText(this, "再次点击退出", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
//返回true时 表示已经处理该事件
return true;
}
} else {
//结束当前Activity
finish();
}
return super.onKeyDown(keyCode, event);
}
二、 Notitfcation 通知
1,介绍
2,基本用法
①普通通知
创建一个NotificationManager来对通知进行管理
通过调用Context.getSystemService(NOTIFICATION_SERVICE)方法获取到NotificationManager实例对象
创建通知构建者 设置属性 然后发送通知
//创建NotificationManager 通知管理器
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//创建通知构造者
Notification.Builder builder = new Notification.Builder(this);
//设置属性 setSamllIcon该属性必须设置
builder.setSmallIcon(R.mipmap.ic_launcher); //必须设置
builder.setContentTitle("我是标题");
builder.setContentText("我是内容");
//创建对象.发送的就是这个对象
Notification build = builder.build();
//发送通知 参数:通知的id 通知对象
manager.notify(1, build);
②进度条通知
这里用进度条模拟下载安装过程
//进度条通知
private void Notitfcation2() {
//创建NotificationManager 通知管理器
final NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
//创建构造者
final Notification.Builder builder = new Notification.Builder(this);
//设置属性 setSamllIcon该属性必须设置
builder.setSmallIcon(R.mipmap.ic_launcher);//设置小图标
builder.setContentTitle("我是标题");
//计时器
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
int progress;
@Override
public void run() {
//模拟下载过程
builder.setContentText("正在下载,当前进度" + progress);
//设置进度条 参数:最大值 当前进度 是否模糊
//builder.setProgress(100,50,true);
builder.setProgress(100, progress, false);//确定的进度条
progress += 20;
manager.notify(6, builder.build());
if (progress == 100) {
//模拟安装过程
builder.setContentText("正在安装");
builder.setProgress(0, 0, true);//安装模糊
manager.notify(6, builder.build());
try {
Thread.sleep(3000);//模拟安装过程
} catch (InterruptedException e) {
e.printStackTrace();
}
//安装完成取消顶部通知 停止计时器
manager.cancel(6);
timer.cancel();
}
}
}, 0, 1000);
}
③交互通知(点击跳转页面)
//交互通知 (跳转页面)
private void Notitfcation3() {
//构造管理者
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//意图对象
Intent intent = new Intent(this, Main2Activity.class);
//当点击通知栏的信息时,才发送intent上下文 请求码,多个请求码不一样即可 intent flags 可写0;
PendingIntent activity = PendingIntent.getActivity(this, 0, intent,0);
Notification.Builder builder = new Notification.Builder(this);
//设置属性
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentTitle("我是标题");
builder.setContentText("我是内容");
builder.setAutoCancel(true); //点击消息通知取消
//设置意图对象
builder.setContentIntent(activity);
Notification notification = builder.build();
//发送通知
manager.notify(1,notification);
}
3,属性
属性 | 意思 |
setAutoCancel(boolean boolean) | 设置点击通知后自动清除通知 |
setContent(RemoteView view) | 设置自定义通知 |
setContentTitle(String string) | 设置通知的标题内容 |
setContentText(String string) | 设置通知的正文内容 |
setContentIntent(PendingIntent intent) | 设置点击通知后的跳转意图 |
setWhen(long when) | 设置通知被创建的时间 |
setSmallIcon(int icon) | 设置通知的小图标 |
setLargeIcon(Bitmap icon) | 设置通知的大图标(下拉系统状态栏时就能看见) |
setPriority(int pri) | 设置通知的重要程度 |
setStyle(Style style) | 设置通知的样式(设置长文字、大图片等) |
setVisibility(int defaults) | 设置默认 |
setLight(int argb, int onMs, int offMs) | 设置呼吸闪烁效果 |
setSound(Uri sound) | 设置通知音效 |
setVibrate(long[] pattern) | 设置震动效果,数组包含手机静止时长和震动时长 |
4,PendingIntent
说明
PendingIntent 是一种特殊的 Intent ,字面意思可以解释为延迟的 Intent ,用于在某个事件结束后执行特定的 Action 。从上面带 Action 的通知也能验证这一点,当用户点击通知时,才会执行。
PendingIntent 是 Android 系统管理并持有的用于描述和获取原始数据的对象的标志(引用)。也就是说,即便创建该PendingIntent对象的进程被杀死了,这个PendingItent对象在其他进程中还是可用的。
日常使用中的短信、闹钟等都用到了 PendingIntent
三、自定义通知
其实就是加载一个布局. 加载布局用到了 RemoteViews 代码中有详细注释.
RemoteViews设置的布局文件并不支持所有的View,以下是RemoteViews所支持的View:
布局
FrameLayout,LinearLayout,RelativeLayout,GridLayout
组件
Button,ImageView,ImageButton,TextView,ProgressBar,ListView,GridView,StackView,ViewStub,AdapterViewFlipper,ViewFlipper,AnalogClock,Chronometer
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img"
android:src="@mipmap/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv1"
android:text="标题文本"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/tv2"
android:text="内容文本"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
//自定义通知
private void Notitfcation4() {
//构造管理者
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//创建构造者
Notification.Builder builder = new Notification.Builder(this);
//设置普通通知属性(会被替换掉)
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentText("内容");
builder.setContentTitle("头部");
//RemoteViews是可以在别的进程(系统进程)中显示的View,并且提供了一组跨进程更新它界面的操作
//所在包名 布局id
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_notification);
//设置属性
//都是两个参数,第一个参数相当于findViewById,第二个是设置一个值.
remoteViews.setTextViewText(R.id.tv1, "简简单单自定义");
remoteViews.setTextViewText(R.id.tv2, "通知也可以自定义");
remoteViews.setImageViewResource(R.id.img, R.mipmap.ic_launcher);
//创建对象.发送的就是这个对象
builder.setCustomContentView(remoteViews);
Notification build = builder.build();
//发送通知 参数:通知的id 通知对象
manager.notify(1, build);
}