这里直接复制官方给的Demo,之后再补充细节
https://github.com/googlesamples/android-NotificationChannels/
Notification.Builder是API26中的类,旧版用NotificationCompat.Builder
PendingIntent可以设置通知和前台服务的点击跳转
通知没什么难点,主要还是要去看官方API文档了解各种设置的方法
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
/**
* Display main screen for sample. Displays controls for sending test notifications.
*/
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();
private static final int NOTI_PRIMARY1 = 1100;
private static final int NOTI_PRIMARY2 = 1101;
private static final int NOTI_SECONDARY1 = 1200;
private static final int NOTI_SECONDARY2 = 1201;
/*
* A view model for interacting with the UI elements.
*/
private MainUi ui;
/*
* A
*/
private NotificationHelper noti;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
noti = new NotificationHelper(this);
ui = new MainUi(findViewById(R.id.activity_main));
}
/**
* Send activity notifications.
*
* @param id The ID of the notification to create
* @param title The title of the notification
*/
public void sendNotification(int id, String title) {
Notification.Builder nb = null;
switch (id) {
case NOTI_PRIMARY1:
nb = noti.getNotification1(title, getString(R.string.primary1_body));
break;
case NOTI_PRIMARY2:
nb = noti.getNotification1(title, getString(R.string.primary2_body));
break;
case NOTI_SECONDARY1:
nb = noti.getNotification2(title, getString(R.string.secondary1_body));
break;
case NOTI_SECONDARY2:
nb = noti.getNotification2(title, getString(R.string.secondary2_body));
break;
}
if (nb != null) {
noti.notify(id, nb);
}
}
/**
* Send Intent to load system Notification Settings for this app.
*/
public void goToNotificationSettings() {
Intent i = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
i.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
startActivity(i);
}
/**
* Send intent to load system Notification Settings UI for a particular channel.
*
* @param channel Name of channel to configure
*/
public void goToNotificationSettings(String channel) {
Intent i = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
i.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
i.putExtra(Settings.EXTRA_CHANNEL_ID, channel);
startActivity(i);
}
/**
* View model for interacting with Activity UI elements. (Keeps core logic for sample
* seperate.)
*/
class MainUi implements View.OnClickListener {
final TextView titlePrimary;
final TextView titleSecondary;
private MainUi(View root) {
titlePrimary = (TextView) root.findViewById(R.id.main_primary_title);
((Button) root.findViewById(R.id.main_primary_send1)).setOnClickListener(this);
((Button) root.findViewById(R.id.main_primary_send2)).setOnClickListener(this);
((ImageButton) root.findViewById(R.id.main_primary_config)).setOnClickListener(this);
titleSecondary = (TextView) root.findViewById(R.id.main_secondary_title);
((Button) root.findViewById(R.id.main_secondary_send1)).setOnClickListener(this);
((Button) root.findViewById(R.id.main_secondary_send2)).setOnClickListener(this);
((ImageButton) root.findViewById(R.id.main_secondary_config)).setOnClickListener(this);
((Button) root.findViewById(R.id.btnA)).setOnClickListener(this);
}
private String getTitlePrimaryText() {
if (titlePrimary != null) {
return titlePrimary.getText().toString();
}
return "";
}
private String getTitleSecondaryText() {
if (titlePrimary != null) {
return titleSecondary.getText().toString();
}
return "";
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.main_primary_send1:
sendNotification(NOTI_PRIMARY1, getTitlePrimaryText());
break;
case R.id.main_primary_send2:
sendNotification(NOTI_PRIMARY2, getTitlePrimaryText());
break;
case R.id.main_primary_config:
goToNotificationSettings(NotificationHelper.PRIMARY_CHANNEL);
break;
case R.id.main_secondary_send1:
sendNotification(NOTI_SECONDARY1, getTitleSecondaryText());
break;
case R.id.main_secondary_send2:
sendNotification(NOTI_SECONDARY2, getTitleSecondaryText());
break;
case R.id.main_secondary_config:
goToNotificationSettings(NotificationHelper.SECONDARY_CHANNEL);
break;
case R.id.btnA:
goToNotificationSettings();
break;
default:
Log.e(TAG, "Unknown click event.");
break;
}
}
}
}
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.graphics.Color;
import android.text.TextUtils;
/**
* Helper class to manage notification channels, and create notifications.
*/
class NotificationHelper extends ContextWrapper {
private NotificationManager manager;
public static final String PRIMARY_CHANNEL = "default";
public static final String SECONDARY_CHANNEL = "second";
/**
* Registers notification channels, which can be used later by individual notifications.
*
* @param ctx The application context
*/
public NotificationHelper(Context ctx) {
super(ctx);
NotificationChannel chan1 = new NotificationChannel(PRIMARY_CHANNEL,
getString(R.string.noti_channel_default), NotificationManager.IMPORTANCE_DEFAULT);
chan1.setLightColor(Color.GREEN);
chan1.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
getManager().createNotificationChannel(chan1);
NotificationChannel chan2 = new NotificationChannel(SECONDARY_CHANNEL,
getString(R.string.noti_channel_second), NotificationManager.IMPORTANCE_HIGH);
chan2.setLightColor(Color.BLUE);
chan2.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
getManager().createNotificationChannel(chan2);
}
/**
* Get a notification of type 1
*
* Provide the builder rather than the notification it's self as useful for making notification
* changes.
*
* @param title the title of the notification
* @param body the body text for the notification
* @return the builder as it keeps a reference to the notification (since API 24)
*/
public Notification.Builder getNotification1(String title, String body) {
return new Notification.Builder(getApplicationContext(), PRIMARY_CHANNEL)
.setContentTitle(title)
.setContentText(body)
.setSmallIcon(getSmallIcon())
.setAutoCancel(true);
}
/**
* Build notification for secondary channel.
*
* @param title Title for notification.
* @param body Message for notification.
* @return A Notification.Builder configured with the selected channel and details
*/
public Notification.Builder getNotification2(String title, String body) {
return new Notification.Builder(getApplicationContext(), SECONDARY_CHANNEL)
.setContentTitle(title)
.setContentText(body)
.setSmallIcon(getSmallIcon())
.setAutoCancel(true);
}
/**
* Send a notification.
*
* @param id The ID of the notification
* @param notification The notification object
*/
public void notify(int id, Notification.Builder notification) {
getManager().notify(id, notification.build());
}
/**
* Get the small icon for this app
*
* @return The small icon resource id
*/
private int getSmallIcon() {
return android.R.drawable.stat_notify_chat;
}
/**
* Get the notification manager.
*
* Utility method as this helper works with it a lot.
*
* @return The system service NotificationManager
*/
private NotificationManager getManager() {
if (manager == null) {
manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
return manager;
}
}