Android 使用通知
通知(notification )是Android 系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容。
修改activity_main.xml 中的代码,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/sendNotice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Notice" />
</LinearLayout>
修改 MainActivity 中的代码,如下所示:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 先需要一个NotificationManager 对通知进行管理,可以通过调用Context 的getSystemService()方法获取。
// getSystemService()方法接收一个字符串参数用于确定获取系统的哪个服务,这里我们传入Context.NOTIFICATION_SERVICE即可。
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// 由于NotificationChannel类和createNotificationChannel()方法都是Android 8.0 系统中新增的API,
// 因此我们在使用的时候还需要进行版本判断才可以
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 创建一个通知渠道至少需要渠道ID、渠道名称以及重要等级这3个参数,
// 其中渠道ID可以随便定义,只要保证全局唯一性就可以。
// 渠道名称是给用户看的,需要可以清楚地表达这个渠道的用途。
// 通知的重要等级主要有IMPORTANCE_HIGH、IMPORTANCE_DEFAULT、IMPORTANCE_LOW、IMPORTANCE_MIN这几种,对应的重要程度依次从高到低。
val channel = NotificationChannel("normal", "Normal", NotificationManager.IMPORTANCE_DEFAULT)
// 调用NotificationManager 的createNotificationChannel()方法完成创建。
manager.createNotificationChannel(channel)
}
sendNotice.setOnClickListener {
val intent = Intent(this, NotificationActivity::class.java)
// PendingIntent 从名字上看起来就和Intent 有些类似,它们确实存在不少共同点。
// 比如它们都可以指明某一个“意图”,都可以用于启动Activity 、启动Service 以及发送广播等。
// 不同的是,Intent 倾向于立即执行某个动作,而PendingIntent 倾向于在某个合适的时机执行某个动作。
// 所以,也可以把PendingIntent 简单地理解为延迟执行的Intent 。
// 主要提供了几个静态方法用于获取PendingIntent 的实例,可以根据需求来选择是使用getActivity()方法、getBroadcast()方法,还是getService()方法。
// 这几个方法所接收的参数都是相同的:第一个参数依旧是Context,不用多做解释;
// 第二个参数一般用不到,传入0即可;
// 第三个参数是一个Intent 对象,我们可以通过这个对象构建出PendingIntent 的“意图”;
// 第四个参数用于确定PendingIntent 的行为,有FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT和FLAG_UPDATE_CURRENT这4种值可选,通常情况下这个参数传入0就可以了。
val pi = PendingIntent.getActivity(this, 0, intent, 0)
// AndroidX库中提供了一个NotificationCompat类,使用这个类的构造器创建Notification对象
// 第一个参数是context,这个没什么好说的;第二个参数是渠道ID,需要和我们在创建通知渠道时指定的渠道ID相匹配才行。
val notification = NotificationCompat.Builder(this, "normal")
.setContentTitle("This is content title")//指定通知的标题内容
.setContentText("This is content text")//指定通知的正文内容
.setSmallIcon(androidx.core.R.drawable.notification_icon_background)//设置通知的小图标
.setLargeIcon(
BitmapFactory.decodeResource(
resources,
androidx.core.R.drawable.notification_icon_background
)
)//设置通知的大图标
.setContentIntent(pi)//通过PendingIntent 构建一个延迟执行的“意图”,当用户点击这条通知时就会执行相应的逻辑。
.setAutoCancel(true)//setAutoCancel()方法传入true,就表示当点击这个通知的时候,通知会自动取消。
.build()
// 调用NotificationManager 的notify()方法就可以让通知显示出来了。
// notify()方法接收两个参数:第一个参数是id,要保证为每个通知指定的id都是不同的;
// 第二个参数则是Notification对象,这里直接将我们刚刚创建好的Notification对象传入即可。
manager.notify(1, notification)
}
}
}
修改 activity_notification.xml 中的代码,如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="This is notification layout"
android:textSize="24sp" />
</RelativeLayout>
修改 NotificationActivity
class NotificationActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_notification)
/*val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.cancel(1)//想取消哪条通知,在cancel()方法中传入该通知的id就行了。*/
}
}

浙公网安备 33010602011771号