1.通知の概要
通知は、一般に通知と呼ばれ、グローバルな効果を持つ通知です。画面の上部に表示され、最初にアイコンの形で表示されます。ユーザーが下にスワイプすると、通知の特定のコンテンツが表示されます。このシステムは、開発者に使用するさまざまなタイプの通知スタイルテンプレートを提供し、開発者は必要に応じて通知スタイルをカスタマイズすることもできます。
2.通知チャネル(NotificationChannel)
通知チャネルは、Android OでGoogleによって追加された新機能です。新しいバージョンでは、振動、音響効果、照明効果が通知チャネルに配置されて制御されるため、ユーザーはアプリケーションの特定の種類の通知を選択的に制御できます。通知効果は、以前のバージョンとは異なり、すべての通知が1つの設定で制御されます。Android Oバージョンでは、通知を送信するときに通知用に通知チャネルを設定する必要があることに注意してください。設定しないと、通知は送信されません。
public void addNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//创建通知渠道
CharSequence name = "渠道名称1";
String description = "渠道描述1";
int importance = NotificationManager.IMPORTANCE_DEFAULT;//重要性级别 这里用默认的
NotificationChannel mChannel = new NotificationChannel(channelId, name, importance);
mChannel.setDescription(description);//渠道描述
mChannel.enableLights(true);//是否显示通知指示灯
mChannel.enableVibration(true);//是否振动
mNotificationManager.createNotificationChannel(mChannel);//创建通知渠道
}
}
3、通知を送信します
1.簡単な通知
効果図は次のとおりです。
具体的なコードは次のとおりです。
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)//小图标
.setContentTitle("我是标题")
.setContentText("我是内容内容");
mNotificationManager.notify(id, mBuilder.build());
2.大きなテキスト通知
効果図は次のとおりです。
具体的なコードは次のとおりです。
NotificationCompat.Builder mBuilder2 = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)//小图标
.setStyle(new NotificationCompat.BigTextStyle().bigText("通知渠道是 Google 在 Android O 中新增加的功能," +
"新的版本中把振动、音效和灯效等相关效果放在了通知渠道中控制," +
"这样用户就可以有选择的控制应用的某一类通知的通知效果," +
"而不像之前版本中应用所有通知都受控于一种设置。需要注意的是," +
"在 Android O 版本中,发送通知的时候必须要为通知设置通知渠道,否则通知不会被发送"))
.setContentTitle("我是标题");
mNotificationManager.notify(id, mBuilder2.build());
3.通知をクリックできます
効果図は次のとおりです。
具体的なコードは次のとおりです。
NotificationCompat.Builder mBuilder2 = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)//小图标
.setStyle(new NotificationCompat.BigTextStyle().bigText("通知渠道是 Google 在 Android O 中新增加的功能," +
"新的版本中把振动、音效和灯效等相关效果放在了通知渠道中控制," +
"这样用户就可以有选择的控制应用的某一类通知的通知效果," +
"而不像之前版本中应用所有通知都受控于一种设置。需要注意的是," +
"在 Android O 版本中,发送通知的时候必须要为通知设置通知渠道,否则通知不会被发送"))
.setContentTitle("我是标题");
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent ClickPending = PendingIntent.getActivity(this, 0, intent, 0);
mBuilder2.setContentIntent(ClickPending);
mBuilder2.setAutoCancel(true);//点击这条通知自动从通知栏中取消
mNotificationManager.notify(id, mBuilder2.build());
4.イベント監視をクリックします
システムが通知クリックイベントをリッスンするための対応するAPIを提供していないことは誰もが知っています。したがって、通知クリックをキャプチャする場合はどうでしょうか。getBroadcast()メソッドはPendingIntentで提供されており、ブロードキャストで処理できます。ユーザーが通知をクリックすると、ブロードキャストが送信され、ブロードキャストレシーバーで必要な操作を実行できます。
具体的なコードは次のとおりです。
NotificationCompat.Builder mBuilder3 = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)//小图标
.setStyle(new NotificationCompat.BigTextStyle().bigText("通知渠道是 Google 在 Android O 中新增加的功能," +
"新的版本中把振动、音效和灯效等相关效果放在了通知渠道中控制," +
"这样用户就可以有选择的控制应用的某一类通知的通知效果," +
"而不像之前版本中应用所有通知都受控于一种设置。需要注意的是," +
"在 Android O 版本中,发送通知的时候必须要为通知设置通知渠道,否则通知不会被发送"))
.setContentTitle("我是标题");
Intent intent3 = new Intent(BROADCAST_ACTION);
intent3.putExtra("data","12345");//带上参数
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,id,intent3, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder3.setContentIntent(pendingIntent);
mBuilder3.setAutoCancel(true);//点击这条通知自动从通知栏中取消
mNotificationManager.notify(id, mBuilder3.build());
break;
受け入れられるコードは次のとおりです。
public class DynamicBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
String data = intent.getStringExtra("data");
Log.i("dataTag","点击通知事件发过来的数据为: " + data);
}
}
操作の結果は次のとおりです。
クリックイベントが正常に検出され、送信されたデータを受信したことがわかります。
第四に、完全なコード
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_send;
private Button btn_send_big_text;
private Button btn_broadcast;
// 通知相关
private int id = 1111;
private String channelId = "channelId1";//渠道id
private NotificationManager mNotificationManager;
private String BROADCAST_ACTION="android.intent.action.BROADCAST_ACTION";
private DynamicBroadcast dynamicBroadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_send = findViewById(R.id.btn_send);
btn_send_big_text = findViewById(R.id.btn_send_big_text);
btn_broadcast = findViewById(R.id.btn_broadcast);
btn_send.setOnClickListener(this);
btn_send_big_text.setOnClickListener(this);
btn_broadcast.setOnClickListener(this);
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
addNotificationChannel();
//动态注册广播
dynamicBroadcast=new DynamicBroadcast();
IntentFilter intentFilter=new IntentFilter(BROADCAST_ACTION);
registerReceiver(dynamicBroadcast,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(dynamicBroadcast!=null){
unregisterReceiver(dynamicBroadcast);
}
}
public void addNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//创建通知渠道
CharSequence name = "渠道名称1";
String description = "渠道描述1";
int importance = NotificationManager.IMPORTANCE_DEFAULT;//重要性级别 这里用默认的
NotificationChannel mChannel = new NotificationChannel(channelId, name, importance);
mChannel.setDescription(description);//渠道描述
mChannel.enableLights(true);//是否显示通知指示灯
mChannel.enableVibration(true);//是否振动
mNotificationManager.createNotificationChannel(mChannel);//创建通知渠道
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send:
NotificationCompat.Builder mBuilder1 = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)//小图标
.setContentTitle("我是标题")
.setContentText("我是内容内容");
mNotificationManager.notify(id, mBuilder1.build());
break;
case R.id.btn_send_big_text:
NotificationCompat.Builder mBuilder2 = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)//小图标
.setStyle(new NotificationCompat.BigTextStyle().bigText("通知渠道是 Google 在 Android O 中新增加的功能," +
"新的版本中把振动、音效和灯效等相关效果放在了通知渠道中控制," +
"这样用户就可以有选择的控制应用的某一类通知的通知效果," +
"而不像之前版本中应用所有通知都受控于一种设置。需要注意的是," +
"在 Android O 版本中,发送通知的时候必须要为通知设置通知渠道,否则通知不会被发送"))
.setContentTitle("我是标题");
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent ClickPending = PendingIntent.getActivity(this, 0, intent, 0);
mBuilder2.setContentIntent(ClickPending);
mBuilder2.setAutoCancel(true);//点击这条通知自动从通知栏中取消
mNotificationManager.notify(id, mBuilder2.build());
break;
case R.id.btn_broadcast:
NotificationCompat.Builder mBuilder3 = new NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)//小图标
.setStyle(new NotificationCompat.BigTextStyle().bigText("通知渠道是 Google 在 Android O 中新增加的功能," +
"新的版本中把振动、音效和灯效等相关效果放在了通知渠道中控制," +
"这样用户就可以有选择的控制应用的某一类通知的通知效果," +
"而不像之前版本中应用所有通知都受控于一种设置。需要注意的是," +
"在 Android O 版本中,发送通知的时候必须要为通知设置通知渠道,否则通知不会被发送"))
.setContentTitle("我是标题");
Intent intent3 = new Intent(BROADCAST_ACTION);
intent3.putExtra("data","12345");//带上参数
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,id,intent3, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder3.setContentIntent(pendingIntent);
mBuilder3.setAutoCancel(true);//点击这条通知自动从通知栏中取消
mNotificationManager.notify(id, mBuilder3.build());
break;
}
}
}
五、発言
テスト中に、GoogleのPixel電話で通知が表示されたとき、小さなアイコンに対応するアイコンスタイルは、真っ白な小さな正方形または小さな丸いブロックであることがわかりました。次の図に示すように、
この問題の理由は、Googleネイティブ携帯電話のsetSmallIcon()メソッドによって設定された画像の背景が透明である必要があり、すべての不透明なポイントが最終的に白で表示されるためです。詳細については、このブログを参照してください。