Notification 最详细的讲解与极简案例



一、 每个项目都必须有这个,只有这个才能进行不同安卓不同版本的适配

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            NotificationChannel channel = new NotificationChannel(Chanel_ID, name, NotificationManager.IMPORTANCE_HIGH);
                                               //   可打可不打,随便
            channel.setDescription(description);
            channel.enableLights(false);        //是否在桌面icon右上角展示小红点
            channel.setLightColor(Color.GREEN); //小红点颜色
            channel.setShowBadge(true);         //是否在久按桌面图标时显示此渠道的通知
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
            Log.e(TAG, "" );

        }

必须包含以下依赖

dependencies {

  implementation "com.android.support:support-compat:28.0.0"

 }





二、通知的每个部分

通知的设计由系统模板决定,您的应用只需定义模板各部分的内容。通知的某些详细信息仅在展开视图中显示。

在这里插入图片描述


展示了通知最常见的部分,具体如下所示:

  1. 小图标:此为必要图标,通过 setSmallIcon()设置。
  2. 应用名称:此由系统提供。
  3. 时间戳:此由系统提供,不过您可以通过setWhen() 进行替换,或使用 setShowWhen(false)]将其隐藏。 --------好像不怎么用
  4. 大图标:此为可选图标(通常仅用于联系人照片;请勿将其用于应用图标),通过setLargeIcon() 设置。
  5. 标题:此为可选内容,通过 setContentTitle() 设置。
  6. 文本:此为可选内容,通过 setContentText() 设置





三、安卓8之前的内容设置

private void tongzhi() {
    //通知栏的显示
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);           //获取这个服务
    Notification notification = new NotificationCompat.Builder(getApplicationContext())        
            .setContentTitle("我是标题")            //设置标题
            .setContentText("我是内容")             //设置内容
            .setWhen(System.currentTimeMillis())   //设时间,获取当前时间
            .setSmallIcon(R.drawable.p2)           //设置小图标
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.p1))                                                      //设置大图标
            .build();
    manager.notify(1, notification);
}

private void init() {
    button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            tongzhi();
        }
    });
}





四、通知的取消方法

1)、取消通知的 第一种方法
 .setAutoCancel(true) //设置为自动取消
2)、在跳转后的Activity中
NotificationManager manager = 
(NotificationManager)getSystemService(NOTIFICATION_SERVICE);

manager.cancel(1);

这里的cancle传入的是一个1,就是我们创建Notification中指定的通知的ID





五、通知的高级使用

1)、设置声音

(2)、设置振动

(3)、设置LED灯闪烁

(4)、进行默认效果设置

Notification notification = new NotificationCompat.Builder(MainActivity.this)
                        ...
 .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg"))) 
//设置通知提示音
 .setVibrate(new long[]{0,1000,1000,1000}) 
//设置振动, 需要添加权限  <uses-permission android:name="android.permission.VIBRATE"/>
.setLights(Color.GREEN,1000,1000)
//设置前置LED灯进行闪烁, 第一个为颜色值  第二个为亮的时长  第三个为暗的时长
.setDefaults(NotificationCompat.DEFAULT_ALL)  
//使用默认效果, 会根据手机当前环境播放铃声, 是否振动
 .build();
 manager.notify(1,notification);






六、进度条的显示

通知可以包含动画形式的进度指示器,向用户显示正在进行的操作状态。

img

如果您可以估算操作在任何时间点的完成进度,应通过调用 setProgress(max, progress, false) 使用指示器的“确定性”形式。第一个参数是“完成”值(如 100);第二个参数是当前完成的进度,最后一个参数表明这是一个确定性进度条。

随着操作的继续,持续使用 progress 的更新值来调用 setProgress(max, progress, false) 并重新发出通知。

操作结束时,progress 应等于 max。您可以在操作完成后仍保留显示进度条,也可以将其移除。无论哪种情况,都请记得更新通知文本以显示操作已完成。要移除进度条,请调用 setProgress(0, 0, false)

注意:由于进度条要求应用持续更新通知,因此该代码通常应在后台服务中运行。

要显示不确定性进度条(不指示完成百分比的进度条),请调用 setProgress(0, 0, true)。结果会产生一个与上述进度条样式相同的指示器,区别是这个进度条是一个持续动画,不指示完成情况。在您调用 setProgress(0, 0, false) 之前,进度动画会一直运行,调用后系统会更新通知以移除 Activity 指示器。

同时,请记得更改通知文本,以表明操作已完成。

在这里插入图片描述

此处为小deemo,复制粘贴后实现以上效果

public class b extends AppCompatActivity {
    int PROGRESS_MAX = 100;
    int PROGRESS_CURRENT = 0;
    String Chanel_ID = "这是Channel_ID";
    int notificationId = 1;
    String name = "这是姓名";
    String description = "这是描述";

    String TAG = "---------";
    NotificationCompat.Builder builder;
    NotificationManagerCompat notificationManager;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.b);
        init();
    }

    private void init() {

        Button button = findViewById(R.id.button3);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

NotificationChannel channel = new NotificationChannel(Chanel_ID, name, NotificationManager.IMPORTANCE_DEFAULT);
                    channel.setDescription(description);
NotificationManager notificationManager = getSystemService(NotificationManager.class);
                    notificationManager.createNotificationChannel(channel);
                }

         notificationManager = NotificationManagerCompat.from(getApplicationContext());
           builder = new NotificationCompat.Builder(getApplicationContext(), Chanel_ID);
           builder.setContentText("Download in progress")
                        .setContentTitle(" Picture Download")
                        .setSmallIcon(R.drawable.p1s)
                        .setAutoCancel(true)
                        .setPriority(NotificationCompat.PRIORITY_HIGH);

                builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
                notificationManager.notify(notificationId, builder.build());

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                       // 这几个都要设置为全局变量,否则新建的多线程没法接收到
                        // NotificationCompat.Builder builder;
                        // NotificationManagerCompat notificationManager;
                        //int PROGRESS_MAX = 100;
                        //int PROGRESS_CURRENT = 0;

                        for (int i = PROGRESS_CURRENT; i < PROGRESS_MAX; i++) {
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            Log.e(TAG, "i的值" + i);
                            //每次运行都进行+1
                            PROGRESS_CURRENT = ++PROGRESS_CURRENT;
                            builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
                           notificationManager.notify(notificationId, builder.build());
                            Log.e(TAG, "run: " + PROGRESS_CURRENT);
                            //当他大于100时,下载完成并且删除此通知栏的下载按钮
                            if (PROGRESS_CURRENT == 100) {
                                //下载完成后出现这个
                                builder.setContentText("Download complete")
                                        .setProgress(0, 0, false);
                           notificationManager.notify(notificationId, builder.build());
                            }
                        }

                    }
                }).start();

            }
        });
    }

}





七、设置大图片进行显示

Bitmap bitmap1 = BitmapFactory.decodeResource(this.getResources(), R.drawable.p1s);
builder = new NotificationCompat.Builder(getApplicationContext(), Chanel_ID);
builder.setContentText("Download in progress")
        .setContentTitle(" Picture Download")
        .setFullScreenIntent(pendingIntent,true)
        .setSmallIcon(R.drawable.p1s)
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap1))

效果图如下

在这里插入图片描述





八、通知的可见权限

通知的是否可见

.setStyle(new NotificationCompat.BigTextStyle().bigText("DSAFFFFFFFFFFFFFFFF"))
//显示应用是否在锁屏可见
/*
VISIBILITY_PUBLIC 显示通知的完整内容。
VISIBILITY_SECRET 不在锁定屏幕上显示该通知的任何部分。
VISIBILITY_PRIVATE 显示基本信息,例如通知图标和内容标题,但隐藏通知的完整内容,比如Big。Text
 */
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setAutoCancel(true)
/**
 * 如果用户设备被锁定,会显示全屏 Activity,覆盖锁屏。
 * 如果用户设备处于解锁状态,通知以展开形式显示,其中包含用于处理或关闭通知的选项
 */
.setPriority(NotificationCompat.PRIORITY_HIGH);





九、通知点击后进入,同时通知消失

此处为一个小deemo 可以复制粘贴后进行实践理解 点击后进行跳转和取消通知

private void tongzhi() {

    /**
     * 使用PendingIntent进行通知点击跳转功能。
     * PendingIntent的用法:
     * (1)、通过getActivity()、getBroadcast()、getService()方法获取实例
     * (2)、参数(Context context, int requestCode, Intent intent, int flags)
     * 第一个参数:Context
     * 第二个参数:requestCode 一般用不到 ,通常设置为0
     * 第三个参数:intent
     * 第四个参数:flags 用于确定PendingIntent的行为。这里传0就行
     */

    //跳转
    Intent intent=new Intent(MainActivity.this,a.class);
    PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);

    /**
     * 需要使用一个Builder构造器来创建Notification对象,由于API不同会造成不同版本的通知出现不稳定的问题,
     * 所以这里使用NotificationCompat类来兼容各个版本
     */
    //通知栏的显示
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //获取这个服务
    Notification notification = new NotificationCompat.Builder(getApplicationContext())
            .setContentTitle("我是标题")     //设置标题
            .setContentText("我是内容")      //设置内容
            .setWhen(System.currentTimeMillis())   //设时间,获取当前时间
            .setSmallIcon(R.drawable.p2)           //设置小图标
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.p1))   //设置大图标

            .setContentIntent(pi) ///跳转
            .setAutoCancel(true)  //自动取消通知栏
            .build();
    manager.notify(1, notification);
}

private void init() {
    button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            tongzhi();
        }
    });
}





十、堆栈的跳转(必须理解)

附赠小deemo,进行实践理解他们的堆栈问题

public class MainActivity extends AppCompatActivity {

 //   String Chanel_ID = "这是Channel_ID";
 //   String name = "这是姓名";
 //   String description = "这是描述";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        panduan();
        tiaozhuan();
    }


    private void panduan() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            //ID Name Desription  都要在全局变量中设定
            NotificationChannel channel = new NotificationChannel("ID", "name", NotificationManager.IMPORTANCE_DEFAULT);
            channel.setDescription("描述");
            NotificationManager notificationManager = getSystemService(NotificationManager.class);
            notificationManager.createNotificationChannel(channel);
        }
    }

    private void tiaozhuan() {
        //这个设置的最低安卓版本是 16
        //这是需要堆栈,就是并不是返回桌面而是层级返回,他会新建一个栈,和原来的应用不是一起的堆栈
        //这个需要在AndroidManifest。xml里进行设置class的父类,让新建的栈能根据父类设定层层返回
        Intent intent = new Intent(getApplicationContext(), san.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
        stackBuilder.addNextIntentWithParentStack(intent);
        PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

        //这个是,只要退出就返回桌面
         //   Intent intent = new Intent(this, c.class);
        //   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
       //    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);


        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getApplicationContext());
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "ID")//这个要和上个是一致的,这就是为甚全局变量
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setContentText("标题")
                .setAutoCancel(true)
                .setContentTitle("内容")
                .setContentIntent(pendingIntent);
        //这个notification——id  也要设置全局变量
        notificationManager.notify(1, builder.build());
    }
}

AndroidManifest.xml

<activity android:name=".san"
    android:parentActivityName=".Second"/>
<activity android:name=".Second"
    />
<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

发布了2 篇原创文章 · 获赞 5 · 访问量 1997

猜你喜欢

转载自blog.csdn.net/qq_45056715/article/details/105518106