通知(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就行了。*/ } }
标签:NotificationManager,val,通知,使用,参数,notification,Android,PendingIntent From: https://www.cnblogs.com/ooo0/p/17061091.html