双击退出
代码
//双击退出
@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时,表示已经完整地处理了这个事件,并不希望其他的回调方法再次进行处理,而当返回false时,
// 表示并没有完全处理完该事件,更希望其他回调方法继续对其进行处理,
return true;
}else{
finish(); //结束当前activity
}
}
return super.onKeyDown(keyCode, event);
}
简单通知
代码
public void click(View view) {
//创建构造者
Notification.Builder builder = new Notification.Builder(this);
//设置属性 setSamllIcon该属性必须设置
builder.setSmallIcon(R.mipmap.ic_launcher); //必须设置
builder.setContentTitle("国庆将至"); //建议设置
builder.setContentText("国庆假期倒计时:1天"); //建议设置
//通知的列表模式样式
// Notification.InboxStyle inboxStyle = new Notification.InboxStyle();
// inboxStyle.addLine("坐公交走");
// inboxStyle.addLine("拼车走");
// builder.setStyle(inboxStyle);
//通知的大图模式样式
Notification.BigPictureStyle bigPictureStyle = new Notification.BigPictureStyle();
bigPictureStyle.bigPicture(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));
builder.setStyle(bigPictureStyle);
builder.setPriority(Notification.PRIORITY_MAX);//设置优先级为最高
builder.setDefaults(Notification.DEFAULT_ALL);
// Intent intent = new Intent(MainActivity.this, MainActivity.class);
// PendingIntent activities = PendingIntent.getActivity(MainActivity.this, 100, intent,0);
// builder.setContentIntent(activities);
builder.setAutoCancel(true);
//创建对象
Notification build = builder.build();
//获取通知管理器,负责发通知、清除通知等
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//参数一:id 通知的id(稍后介绍意义) 参数二:通知对象
notificationManager.notify(1,build);
}
进度条通知
代码
public void click1(View view) {
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("软件下载"); //建议设置
timer = new Timer();
timer.schedule(new TimerTask() {
int progress = 0;
@Override
public void run() {
builder.setContentText("正在下载,当前进度"+progress);
builder.setProgress(100,progress,false);//下载过程使用精确进度条来显示进度
progress+=20;//步长值
manager.notify(1,builder.build());
if(progress==100) {
//进度达到100进入安装过程
builder.setContentText("正在安装");
builder.setProgress(0, 0, true);//安装过程使用模糊进度条
manager.notify(1, builder.build());
try {
Thread.sleep(3000);//线程休眠,模拟安装过程
} catch (InterruptedException e) {
e.printStackTrace();
}
//服务结束,timer结束
manager.cancel(1);
timer.cancel();
}
}
},1,1000);
}
多条通知
代码
private void groupNotification() {
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification.Builder mBuilder0 = new Notification.Builder(this);
Notification.Builder mBuilder1 = new Notification.Builder(this);
Notification.Builder mBuilder2 = new Notification.Builder(this);
Notification.Builder mBuilder3 = new Notification.Builder(this);
//消息分组属性,group相同才能分到一组
mBuilder0.setGroup("2");
mBuilder0.setSmallIcon(R.mipmap.ic_launcher);
//被设置setGroupSummary为true的消息会隐藏内容,其内容会显示另外分组成员信息.
mBuilder0.setGroupSummary(true);
mBuilder0.setContentText("有志者");
mBuilder0.setContentTitle("事竟成");
mBuilder1.setSmallIcon(R.mipmap.ic_launcher);
mBuilder1.setContentText("一二三四五");
mBuilder1.setContentTitle("上山打老虎");
mBuilder2.setGroup("2");
mBuilder2.setSmallIcon(R.mipmap.ic_launcher);
mBuilder2.setContentText("苦心人");
mBuilder2.setContentTitle("天不负");
mBuilder3.setGroup("2");
mBuilder3.setSmallIcon(R.mipmap.ic_launcher);
mBuilder3.setContentText("卧薪尝胆");
mBuilder3.setContentTitle("踏高薪路");
manager.notify(0,mBuilder0.build());
manager.notify(1,mBuilder1.build());
manager.notify(2,mBuilder2.build());
manager.notify(3,mBuilder3.build());
}
自定义通知
代码
private void userNotification() {
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentText("内容");
builder.setContentTitle("头部");
/**
* RemoteViews是可以在别的进程(系统进程)中显示的View,并且提供了一组跨进程更新它界面的操作
* 两个参数,第一个布局所在包名
* 第二个是布局Id
* 布局文件是自己创建的,随便一个线性布局,加一个textView和ImageView即可
*/
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_layout);
//不能直接设置,依靠方法来修改控件内容:两个参数 控件ID、控件内容
remoteViews.setTextViewText(R.id.t1,"为啥推人小女孩儿?");
remoteViews.setTextViewText(R.id.t2,"她扒拉我!");
remoteViews.setImageViewResource(R.id.pic,R.mipmap.ic_launcher);
builder.setCustomContentView(remoteViews);
Notification build = builder.build();
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(2,build);
}
整体代码
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:gravity="center"
>
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
android:text="Day3:双击退出与Notitfcation 通知"
android:textSize="25sp"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="双击退出"
android:layout_marginTop="40dp"
android:onClick="click"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送一个简单通知"
android:onClick="click"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送一个进度条通知"
android:onClick="click1"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="多条通知"
android:onClick="click2"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="自定义通知"
android:onClick="click3"
/>
</LinearLayout>
MainActivity:
package com.example.myapplication;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
private long exitTime = 0;
private Notification.Builder builder;
private NotificationManager manager;
private Timer timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//双击退出
@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时,表示已经完整地处理了这个事件,并不希望其他的回调方法再次进行处理,而当返回false时,
// 表示并没有完全处理完该事件,更希望其他回调方法继续对其进行处理,
return true;
}else{
finish(); //结束当前activity
}
}
return super.onKeyDown(keyCode, event);
}
public void click(View view) {
//创建构造者
Notification.Builder builder = new Notification.Builder(this);
//设置属性 setSamllIcon该属性必须设置
builder.setSmallIcon(R.mipmap.ic_launcher); //必须设置
builder.setContentTitle("国庆将至"); //建议设置
builder.setContentText("国庆假期倒计时:1天"); //建议设置
//通知的列表模式样式
// Notification.InboxStyle inboxStyle = new Notification.InboxStyle();
// inboxStyle.addLine("坐公交走");
// inboxStyle.addLine("拼车走");
// builder.setStyle(inboxStyle);
//通知的大图模式样式
Notification.BigPictureStyle bigPictureStyle = new Notification.BigPictureStyle();
bigPictureStyle.bigPicture(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));
builder.setStyle(bigPictureStyle);
builder.setPriority(Notification.PRIORITY_MAX);//设置优先级为最高
builder.setDefaults(Notification.DEFAULT_ALL);
// Intent intent = new Intent(MainActivity.this, MainActivity.class);
// PendingIntent activities = PendingIntent.getActivity(MainActivity.this, 100, intent,0);
// builder.setContentIntent(activities);
builder.setAutoCancel(true);
//创建对象
Notification build = builder.build();
//获取通知管理器,负责发通知、清除通知等
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//参数一:id 通知的id(稍后介绍意义) 参数二:通知对象
notificationManager.notify(1,build);
}
public void click1(View view) {
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("软件下载"); //建议设置
timer = new Timer();
timer.schedule(new TimerTask() {
int progress = 0;
@Override
public void run() {
builder.setContentText("正在下载,当前进度"+progress);
builder.setProgress(100,progress,false);//下载过程使用精确进度条来显示进度
progress+=20;//步长值
manager.notify(1,builder.build());
if(progress==100) {
//进度达到100进入安装过程
builder.setContentText("正在安装");
builder.setProgress(0, 0, true);//安装过程使用模糊进度条
manager.notify(1, builder.build());
try {
Thread.sleep(3000);//线程休眠,模拟安装过程
} catch (InterruptedException e) {
e.printStackTrace();
}
//服务结束,timer结束
manager.cancel(1);
timer.cancel();
}
}
},1,1000);
}
public void click2(View view) {
groupNotification();
}
private void groupNotification() {
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification.Builder mBuilder0 = new Notification.Builder(this);
Notification.Builder mBuilder1 = new Notification.Builder(this);
Notification.Builder mBuilder2 = new Notification.Builder(this);
Notification.Builder mBuilder3 = new Notification.Builder(this);
//消息分组属性,group相同才能分到一组
mBuilder0.setGroup("2");
mBuilder0.setSmallIcon(R.mipmap.ic_launcher);
//被设置setGroupSummary为true的消息会隐藏内容,其内容会显示另外分组成员信息.
mBuilder0.setGroupSummary(true);
mBuilder0.setContentText("有志者");
mBuilder0.setContentTitle("事竟成");
mBuilder1.setSmallIcon(R.mipmap.ic_launcher);
mBuilder1.setContentText("一二三四五");
mBuilder1.setContentTitle("上山打老虎");
mBuilder2.setGroup("2");
mBuilder2.setSmallIcon(R.mipmap.ic_launcher);
mBuilder2.setContentText("苦心人");
mBuilder2.setContentTitle("天不负");
mBuilder3.setGroup("2");
mBuilder3.setSmallIcon(R.mipmap.ic_launcher);
mBuilder3.setContentText("卧薪尝胆");
mBuilder3.setContentTitle("踏高薪路");
manager.notify(0,mBuilder0.build());
manager.notify(1,mBuilder1.build());
manager.notify(2,mBuilder2.build());
manager.notify(3,mBuilder3.build());
}
public void click3(View view) {
userNotification();
}
private void userNotification() {
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentText("内容");
builder.setContentTitle("头部");
/**
* RemoteViews是可以在别的进程(系统进程)中显示的View,并且提供了一组跨进程更新它界面的操作
* 两个参数,第一个布局所在包名
* 第二个是布局Id
* 布局文件是自己创建的,随便一个线性布局,加一个textView和ImageView即可
*/
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_layout);
//不能直接设置,依靠方法来修改控件内容:两个参数 控件ID、控件内容
remoteViews.setTextViewText(R.id.t1,"为啥推人小女孩儿?");
remoteViews.setTextViewText(R.id.t2,"她扒拉我!");
remoteViews.setImageViewResource(R.id.pic,R.mipmap.ic_launcher);
builder.setCustomContentView(remoteViews);
Notification build = builder.build();
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(2,build);
}
}