8.Android学习之消息、通知、广播与闹钟(二)
目录
8.消息、通知、广播与闹钟(二)
3.使用Notification类在状态栏上显示通知
4.BroadcastReceiver类的使用
4-1.BroadcastReceiver类简介
4-2.BroadcastReceiver类的应用
8.消息、通知、广播与闹钟(二)
3.使用Notification类在状态栏上显示通知
状态栏位于手机屏幕的最上方,一般用于显示手机当前的网络状态、系统时间以及电池状态等信息。在使用手机时,当有未接来电或有新短消息时,手机会给出相应的提示信息,这些提示信息通常会显示到手机屏幕的状态栏上。
Android也提供了用于处理这些信息的类,它们是Notification类和NotificationManager类。其中Notification 代表的是具有全局效果的通知,而NotificaionManager类则是用来发送Notification通知的系统服务。使用Notification类和NotificationManager类发送和显示通知也比较简单,大致可以分为以下4个步骤:
(1)调用getSystemService()方法用于获取系统的NotificationManager服务。
(2)创建一个Notification对象。
(3)为Notification对象设置各种属性,其中常用的方法如表8.4所示。
表8.4 Notificat ion对象中的常用方法
方法 | 描述 |
---|---|
setDefaults() | 设置通知LED灯、音乐、振动等 |
setAutoCancel() | 设置单击通知后,状态栏自动删除通知 |
setContentTitle() | 设置通知标题 |
setContentText() | 设置通知内容 |
setSmallIcon() | 为通知设置图标 |
setLargeIcon() | 为通知设置大图标 |
setContentIntent() | 设置单击通知后将要启动的程序组件对应的PendingIntent |
(4)通过NotificationManager类的notify()方法发送Notification 通知。
注:通过NotificationManager类的notify()方法发送Notification 通知时,需要将Moudle的最低版本设置为API 16,即Android 4.1版本,如果低于该版本将报错。
例:
MainActivity.java
package com.example.notification;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
final int NOTIFYID=0x123;//通知的IDString id="channelId";String name="channelName";
@RequiresApi(api = Build.VERSION_CODES.O)@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionBar=getSupportActionBar();actionBar.hide();
NotificationManagerCompat manager=NotificationManagerCompat.from(MainActivity.this);NotificationChannel channel = new NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH);//获取通知管理器服务,用于发送通知NotificationManager notificationManager =(NotificationManager) getApplication().getSystemService(Context.NOTIFICATION_SERVICE);notificationManager.createNotificationChannel(channel);
//创建一个Notification对象Notification.Builder notification= null;notification = new Notification.Builder(MainActivity.this,id);//设置打开该通知,该通知自动消失notification.setAutoCancel(true);//设置通知的图标notification.setSmallIcon(R.drawable.packet);//设置通知内容的标题notification.setContentTitle("奖励百万红包!!!");//设置通知内容notification.setContentText("点击查看详情!");//设置使用系统默认的声音、默认振动notification.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);//设置发送时间notification.setWhen(System.currentTimeMillis());//创建一个启动其他Activity的IntentIntent intent=new Intent(MainActivity.this,DetailActivity.class);PendingIntent pendingIntent=PendingIntent.getActivity(MainActivity.this,0,intent,0);//设置通知栏单击跳转notification.setContentIntent(pendingIntent);Notification notification1=notification.build();//发送通知manager.notify(NOTIFYID,notification1);}
}
注:在程序中需要访问系统振动器,这就需要在AndroidManifest.xml中声明使用权限,具体代码如下:
<uses-permission android:name="android.permission.VIBRATE"/>
4.BroadcastReceiver类的使用
4-1.BroadcastReceiver类简介
BroadcastReceiver类是接收广播通知的组件。广播是一种同时通知多个对象的事件通知机制,类似日常生活中的广播,允许多个人同时收听,也允许不收听。通常情况下,广播通知是以消息提示框、对话框或者通知的形式进行体现的。例如,在接收到一条短信之后,系统会发出一条广播,当广播接收器接收到该广播时,将以通知和对话框两种形式提示。再如,当更新系统日期时间时,系统也会发出一条广播,当广播接收器接收到该广播时,将以消息提示框的形式提示用户。
Android中广播来源有系统事件,例如按下拍照键、电池电量低以及安装新应用等,还有普通应用程序,例如启动特定线程、文件下载完毕等。这里主要介绍系统广播,下面列举出一些常用的系统事件,当这些事件发生时就会发送系统广播。
◆电池电量低。
◆系统启动完成。
◆系统日期发生改变。
◆系统时间发生改变。
◆系统连接电源。
◆系统被关闭。
BroadcastReceiver类是所有广播接收器的抽象基类。其实现类用来对发送出来的广播进行筛选并做出响应。广播接收器的生命周期非常简单。当消息到达时,接收器调用onReceive()方法,在该方法结束后,BroadcastReceiver 实例失效。
注: onReceive() 方法是实现BroadcastReceiver类时需要重写的方法。
当用户需要进行广播时,可以通过Activity程序中的sendBroadcast()方法触发所有的广播组件,而每一个广播组件在进行广播启动之前,也必须判断用户所传递的广播操作是否是指定的Action 类型,如果是,则进行广播的处理。
在Android操作系统中,每启动一个广播都需要重写实例化一个新的广播组件对象,并自动调用类中的onReceive()方法对广播事件进行处理。
用于接收的广播有以下两大类:
◆普通广播
使用Context.sendBroadcast()方法发送,它们完全是异步的。 广播的全部接收者以未定义的顺序运行,通常在同一时间。这使得消息传递的效率比较高,但缺点是接收者不能将处理结果传递给下一个接收者,并且无法终止广播的传播。
◆有序广播
使用Context.sendOrderedBroadcast()方法发送,它们每次只发送给优先级较高的接收者,然后由优先级较高的接收者再传播到优先级较低的接收者。由于每个接收者依次运行,它能为下一个接收者生成一个结果,或者它能完全终止广播以便不传递给其他接收者。有序接收者运行顺序由匹配的intent-filter的android:priority属性控制,具有相同优先级的接收者运行顺序任意。
综上所述,普通广播和有序广播的特点如表8.5所示。
表8.5 普通广播和有序广播的特点
普通广播 | 有序广播 |
---|---|
可以在同一时刻被所有接收者接收到 | 相同优先级的接收者接收顺序是随机的,不同优先级的接收者按照优先级由高到低的顺序依次接收 |
按收者不能将处理结果传递给下一个接收者 | 接收者可以将处理结果传递给下一个接收者 |
无法终止广播的传播 | 可以终止广播的传播 |
4-2.BroadcastReceiver类的应用
例:
MainActivity.java
package com.example.broadcastreceiver;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ActionBar actionBar=getSupportActionBar();actionBar.hide();
Button button=(Button) findViewById(R.id.main_bt1);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent=new Intent();intent.setAction("com.example");//为Intent添加动作com.exampleintent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);intent.setComponent(new ComponentName("com.example.broadcastreceiver","com.example.broadcastreceiver.MyReceiver"));sendBroadcast(intent);//发送广播}});}
}
com.example.broadcastreceiver文件夹右键→new→Other→Broadcast Receiver,创建一个名为“MyReceiver”的广播接收器。
MyReceiver.java
package com.example.broadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {private static final String action1="com.example";//声明第一个动作private static final String action2="example";//声明第二个动作public MyReceiver(){}@Overridepublic void onReceive(Context context, Intent intent) {if(intent.getAction().equals(action1)){//回复该动作收到广播Toast.makeText(context,"MyReceiver收到:com.example的广播",Toast.LENGTH_SHORT).show();}else if(intent.getAction().equals(action2)){//回复该动作收到广播Toast.makeText(context,"MyReceiver收到:example的广播",Toast.LENGTH_SHORT).show();}}
}
AndroidManifest.xml文件中注册BroadcastReceiver:
<receiverandroid:name=".MyReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="com.example"></action><action android:name="example"></action></intent-filter>
</receiver>
8.Android学习之消息、通知、广播与闹钟(二)相关推荐
- Android学习—Notification消息通知
最近在项目中需要使用消息通知,自己把它封装成了一个方法,需要的时候方便调用, 下面对Notification类中的一些常量,字段,方法简单介绍一下: 常量: DEFAULT_ALL 使用所有默认 ...
- Android学习日记 Notification 通知
Android学习日记 Notification 通知 文章目录 Android学习日记 Notification 通知 前言 使用步骤 总结 前言 下拉状态栏显示的通知功能 使用步骤 代码如下: p ...
- Android篇 --Notification(消息通知)
Android篇 --Notification(消息通知) 消息通知(Notification)是Android系统中比较有特色的一个功能,当某个应用程序希望用户发出一些提示信息,而该应用又不在前台运 ...
- android gmail 不翻墙,Android延迟Gmail消息通知,可能只是为了省电
原标题:Android延迟Gmail消息通知,可能只是为了省电 IT之家11月9日消息 据Android Authority消息,推送通知是我们智能手机的重要组成部分.没有这些推送,我们可能会错过重要 ...
- Java中集成极光推送实现给Android提送消息通知(附代码下载)
场景 Android中集成极光推送实现推送消息通知与根据别名指定推送附示例代码下载: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...
- Android仿QQ消息拖拽效果(二)
前言 本文参考辉哥贝塞尔曲线 - QQ消息汽包拖拽,前面我们使用二阶贝塞尔曲线绘制了拖拽圆点效果Android仿QQ消息拖拽效果(一)(二阶贝塞尔曲线使用),这里我们在此基础之上实现仿QQ消息拖拽爆炸 ...
- android学习笔记---38_采用广播接收者拦截外拔电话,实现原理以及实例源码
38_采用广播接收者拦截外拔电话及其特性 这个程序是在原来的基础上进行的: 用到了,上一个工程SMSListener 首先在清单文件中添加,外拨电话的广播接受者 <receiver androi ...
- android学习笔记---37_采用广播接收者实现系统短信操作_获取短信_收发短信等
37_采用广播接收者实现短信操作 1. 原理:当系统接收到短信时候,会发出一个广播Intent,Intent的action名称为android.provider.Telephony.SMS ...
- Android中集成Jpush实现推送消息通知与根据别名指定推送附示例代码下载
场景 经常会有后台服务向Android推送消息通知的情况. 实现 首先在Android Studio中新建一个Android应用 在Project根目录的build.gradle中配置了jcenter ...
最新文章
- LeetCode简单题之验证外星语词典
- 如何快速增加网站收录?
- DSP程序中段的定义和作用
- 如何让自己时刻冷静的方法_如何锻炼自己的口才及沟通技巧?这5个方法让你受用一辈子...
- [OS复习]进程互斥与同步2
- 面向对象4(匿名对象、内部类、包、修饰符、代码块)
- c#程序打包,同时把netframework也打包进去
- 深入解析 | Oracle Database 20c 十大新特性一览
- mysql删除选课为空的学生_MySQL一些简单的操作题
- 手机新趋势:智能大屏
- weightad interval scheduling problems
- 【React 】基于Antd Design的RadioGroup按钮组控件封装
- iOS开发:Pokemon Go试玩,未越狱的iPhone伪造GPS定位信息
- 3.4 haas506 2.0开发教程-example-ads1115
- JS - 判断当前浏览器是不是PC浏览器
- 亚马逊云技术防范勒索病毒
- yilia头像/图标设置
- 知名游戏设计师的 GitHub 仓库被删,CEO 道歉;工信部向四家公司发放 5G 牌照
- 【职场】大公司想招程序员,一般都在什么网站上进行招聘呢?
- android官方自带下拉刷新功能
热门文章
- python中copy是什么意思_Python-copy()与deepcopy()区别
- Json数据格式的使用
- manjaro增加虚拟内存(linux通用)
- MySQL删除表操作(delete、truncate、drop的区别)
- Idea 快捷键 使用总结
- Welcome to the future! welcome to the python world!
- 这个淘宝验证码是多少
- [golang Web开发] 1.golang web开发:简介以及web服务器的搭建以及http协议简介
- 珠宝鉴定市场现状研究分析-
- Bootstrap历练实例:带徽章的列表组