美文网首页
Android:通知

Android:通知

作者: 春暖花已开 | 来源:发表于2019-02-19 09:51 被阅读26次

如果你将项目中的targetSdkVersion指定到了26或者更高(targetSdkVersion可以在app/build.gradle里查看),这个时候如果还不使用通知渠道的话,那么你的App的通知将完全无法弹出。

import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.tencent.testand.R;

public class NotificationActivity extends Activity implements View.OnClickListener {

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

        findViews();

        // API Level >= 26,需要添加NotificationChannel
        // Build.VERSION.SDK_INT 获取当前SDK的API Level
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            String channelId = "MyCustomChannel";
            String channelName = "自定义Channel";
            int importance = NotificationManager.IMPORTANCE_HIGH;
            createNotificationChannel(channelId, channelName, importance);
            channelId = "subscribe";
            channelName = "订阅消息";
            importance = NotificationManager.IMPORTANCE_DEFAULT;
            createNotificationChannel(channelId, channelName, importance);
        }
    }

    @TargetApi(Build.VERSION_CODES.O)
    private void createNotificationChannel(String channelId, String channelName, int importance) {
        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
        // 是否显示角标
        channel.setShowBadge(true);
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(channel);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.chat_button: {
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    NotificationChannel channel = manager.getNotificationChannel("MyCustomChannel");
                    if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
                        Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
                        intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
                        intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());
                        startActivity(intent);
                        Toast.makeText(this, "请手动将通知打开", Toast.LENGTH_SHORT).show();
                    }
                }

                Notification notification = new NotificationCompat.Builder(this, "MyCustomChannel")
                        .setContentTitle("收到一条聊天消息")
                        .setContentText("这是我自定义的聊天内容")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.drawable.icon)
                        // 这里需要用drawable例的图片
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
                        // 设置显示角标的数量(注:如果需要显示出来,需要长按图标)
                        .setNumber(2)
                        .setAutoCancel(true).build();
                manager.notify(1, notification);
                break;
            }
            case R.id.subscribe_button: {
                NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                Notification notification = new NotificationCompat.Builder(this, "subscribe")
                        .setContentTitle("收到一条订阅消息")
                        .setContentText("北京市教委:明天要放假了~")
                        .setWhen(System.currentTimeMillis())
                        .setSmallIcon(R.drawable.icon)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
                        .setAutoCancel(true).build();
                manager.notify(2, notification);
                break;
            }
        }
    }

    private void findViews() {
        Button chatButton = findViewById(R.id.chat_button);
        chatButton.setOnClickListener(this);
        Button subscribeButton = findViewById(R.id.subscribe_button);
        subscribeButton.setOnClickListener(this);
    }
}

Android 8.0还赋予了我们删除通知渠道的功能,只需使用如下代码即可删除:
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.deleteNotificationChannel(channelId);

参考:Android通知栏微技巧,8.0系统中通知栏的适配

相关文章

  • Android直接回复通知

    Android直接回复通知 通知直接回复 Android N/7.0 前言 通知(Notification)可为是...

  • 《Android第一行代码》first reading 十

    Android多媒体运用 一 通知 使用Android通知功能步骤: 通过Context的getSystemSer...

  • Android的通知

    通知是什么? 通知存在的意义是什么? Android O(Android SDK Api Level 26,And...

  • android通知

    1.这里写了一个常用的通知的代码

  • Android通知

    通知在实际开发中还是比较常见的,例如新闻,音乐播放器,等。 1,基本通知 2,基础扩展通知自定义布局 xml >>...

  • android 通知

    notification需要一个NotificationManager来管理,如何获取呢?Notification...

  • Android通知

    在这里写一个Android的通知,相应的图标以及位置大概也有介绍,需要的时候可以试试;

  • Android 通知

    Android 8.0中各种通知写法汇总https://www.jianshu.com/p/6aec3656e27...

  • Android:通知

    如果你将项目中的targetSdkVersion指定到了26或者更高(targetSdkVersion可以在app...

  • Android 8.0 Notification

    Android 8.0 通知适配: Android Api 26 Notification Builder 构建...

网友评论

      本文标题:Android:通知

      本文链接:https://www.haomeiwen.com/subject/pdqxyqtx.html