• 一手遮天 Android


    项目地址 https://github.com/webabcd/AndroidDemo
    作者 webabcd

    一手遮天 Android - Notification: Notification

    示例如下:

    /notification/NotificationDemo1.java

    /**
     * Notification
     *
     * 本例用于演示
     * 1、弹出通知
     * 2、点击通知后跳转到指定的页面
     */
    
    package com.webabcd.androiddemo.notification;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    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.graphics.BitmapFactory;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    import com.webabcd.androiddemo.R;
    
    public class NotificationDemo1 extends AppCompatActivity {
    
        private Button mButton1;
        private Button mButton2;
        private Button mButton3;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_notification_notificationdemo1);
    
            mButton1 = findViewById(R.id.button1);
            mButton2 = findViewById(R.id.button2);
            mButton3 = findViewById(R.id.button3);
    
            sample();
        }
    
        private void sample() {
            // 获取 NotificationManager 对象,并为其指定 NotificationChannel 对象
            final NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    
            // 构造通知点击后的需要跳转到的 PendingIntent 对象(点击通知跳转后的行为参见 NotificationDemo1Click.java)
            Intent intent = new Intent(getApplicationContext(), NotificationDemo1Click.class);
            // 通过 intent 保存通知的数据
            intent.putExtra("param1", "abc");
            intent.putExtra("param2", "xyz");
            // 第 2 个参数用于标识 PendingIntent
            // 第 4 个参数,用于指定当存在多个标识相同的 PendingIntent 时的行为
            //   PendingIntent.FLAG_CANCEL_CURRENT - 取消老的 PendingIntent,只保留新的 PendingIntent(即新的通知点击有效果,老的通知点击没有效果)
            //   PendingIntent.FLAG_UPDATE_CURRENT - 以新的 PendingIntent 更新老的 PendingIntent(即新的通知和老的通知点击效果都使用新的通知的)
            //   所以,如果需要不影响之前的通知,请每次构造 PendingIntent 时都把第 2 个参数设置为不同的值
            PendingIntent pendingIntent = PendingIntent.getActivity(getApplication(),0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
            // 如果需要点击通知后发广播,则请使用类似如下的方式构造 PendingIntent 对象
            // PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0, new Intent("xxx.xxx.xxx"), PendingIntent.FLAG_CANCEL_CURRENT);
    
            Notification.Builder notificationBuilder = null;
            // api level 26 或以上系统的通知的实现逻辑(需要注册通知通道)
            if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                // 先创建一个 NotificationChannel 对象
                String channel_id = "channel_id"; // 通道id,需要包内唯一
                String channel_name = "channel_name"; // 通道名称,用户可见的一个名称(我也不知道用户咋可见)
                int importance = NotificationManager.IMPORTANCE_DEFAULT; // 通道重要性
                NotificationChannel notificationChannel = new NotificationChannel(channel_id, channel_name, importance);
                notificationManager.createNotificationChannel(notificationChannel);
                // api level 26 或以上系统需要注册通知通道,然后在这里指定通知通道的 id
                notificationBuilder = new Notification.Builder(this, channel_id);
            } else {
                // api level 26 以下系统不需要注册通知通道
                notificationBuilder = new Notification.Builder(this);
            }
    
            // 构造 Notification 对象
            final Notification notification = notificationBuilder
                    .setContentTitle("Title") // 通知的标题
                    .setContentText("测试内容") // 通知的内容
                    .setSmallIcon(R.mipmap.ic_launcher_alpha) // 小图标,状态栏上用此图标(只能用 alpha 图层绘制,简单说就是背景透明,然后只用白色作画)
                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)) // 大图标
                    .setContentIntent(pendingIntent) // 通知点击后的需要跳转到的 PendingIntent 对象
                    .setAutoCancel(true) // 通知点击后自动消失
                    .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE) // 使用系统默认声音和震动(自定义声音和震动懒得写了,网上搜吧)
                    .setProgress(100, 30, false) // 设置进度条(3 个参数分别为: 最大值, 当前值, 进度是否是不确定的)
                    .build();
    
    
            // 弹出通知
            mButton1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 弹出通知
                    // 第 2 个参数为具体的 notification 对象
                    // 第 1 个参数用于指定该 notification 对象的 id
                    notificationManager.notify(123, notification);
                }
            });
    
            // 移除通知
            mButton2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 移除通知
                    // 移除指定 id 的 notification 对象
                    notificationManager.cancel(123);
                }
            });
    
            // 更新通知
            Notification.Builder finalNotificationBuilder = notificationBuilder;
            mButton3.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 更新通知和弹出通知是一样的,调用 notify() 就行,其会覆盖同 id 的 notification 对象
                    final Notification notification = finalNotificationBuilder.setContentTitle("aaa") .setContentText("bbb").build();
                    notificationManager.notify(123, notification);
                }
            });
        }
    }
    

    otificationNotificationDemo1Click.java

    /**
     * Notification
     *
     * 本例用于处理 NotificationDemo1 弹出的通知点击后的行为
     */
    
    package com.webabcd.androiddemo.notification;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.TextView;
    
    import com.webabcd.androiddemo.R;
    
    import java.util.Locale;
    
    public class NotificationDemo1Click extends AppCompatActivity {
    
        private TextView mTextView1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_notification_notificationdemo1click);
    
            mTextView1 = findViewById(R.id.textView1);
    
            // 通过 intent 获取通知的数据
            Intent intent = this.getIntent();
            String param1 = intent.getStringExtra("param1");
            String param2 = intent.getStringExtra("param2");
            mTextView1.setText(String.format(Locale.US, "param1:%s, param2:%s", param1, param2));
        }
    }
    

    /layout/activity_notification_notificationdemo1.xml

    <?xml version="1.0" encoding="utf-8"?>
    <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/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="弹出 Notification"
            android:textAllCaps="false" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="移除 Notification"
            android:textAllCaps="false" />
    
        <Button
            android:id="@+id/button3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="更新 Notification"
            android:textAllCaps="false" />
    
    </LinearLayout>
    

    /layout/activity_notification_notificationdemo1click.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    项目地址 https://github.com/webabcd/AndroidDemo
    作者 webabcd

  • 相关阅读:
    PTA 两个有序链表序列的合并
    PTA 递增的整数序列链表的插入
    PTA 链表逆置
    PTA 带头结点的链式表操作集
    _KPCR, _NT_TIB, _KPRCB
    FSOP
    逆向PspCreateProcess
    寒假训练 [GKCTF2020]Domo(4/250) 劫持vtable
    IO_FILE利用与劫持vtables控制程序流程、FSOP
    线程结构
  • 原文地址:https://www.cnblogs.com/webabcd/p/android_notification_NotificationDemo1.html
Copyright © 2020-2023  润新知