java - Android 通知未显示用于秒表的 Java
问题描述
又是我,现在我正在为秒表、闹钟等构建应用程序。所以我在我的代码中添加了服务和通知,但问题是唯一能完美运行的是主视图,或者只是我称之为“TimePlayer.java”,这是我的秒表活动。通知没有出现,我检查了我的代码几次,但不知道我错过了哪一部分。我正在使用目标 API OREO
这是我的服务类:
public class MyServices extends Service implements PropertyChangeListener {
//..........................................................
private static final int NOTIFICATION_ID = 0;
private NotificationManager mNotificationManager;
private boolean isNotificationShowing;
private BroadcastReceiver receiverStateChanged;
private BroadcastReceiver receiverResets;
private BroadcastReceiver receiverExit;
private Timer t;
private Builder mBuilder;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
isNotificationShowing = false;
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
IntentFilter filterNext = new IntentFilter(ACTION_PLAY);
receiverStateChanged = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(TimeContainer.getInstance().getCurrentState() == TimeContainer.STATE_RUNNING) {
TimeContainer.getInstance().pause();
} else {
TimeContainer.getInstance().start();
}
updateNotification();
}
};
registerReceiver(receiverStateChanged, filterNext);
receiverResets = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
TimeContainer.getInstance().reset();
updateNotification();
}
};
IntentFilter filterPause = new IntentFilter(ACTION_RESET);
registerReceiver(receiverResets, filterPause);
IntentFilter filterPrev = new IntentFilter(ACTION_STOP);
receiverExit = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
TimeContainer.getInstance().reset();
stopForeground(true);
isNotificationShowing = false;
stopSelf();
}
};
registerReceiver(receiverExit, filterPrev);
startUpdateTimer();
TimeContainer.getInstance().isServiceRunning.set(true);
return START_STICKY;
}
@Override
public void onCreate() {
mBuilder = new Notification.Builder(this)
.setSmallIcon(R.drawable.timer)
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setOngoing(true)
.setOnlyAlertOnce(true);
super.onCreate();
}
//..........................................................
@SuppressWarnings("deprecation")
private synchronized void updateNotification() {
RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_navigation);
if(TimeContainer.getInstance().getCurrentState() == TimeContainer.STATE_RUNNING) {
contentView.setImageViewResource(R.id.btnPlay, R.drawable.ic_launcher_blackpause_foreground);
} else {
contentView.setImageViewResource(R.id.btnPlay, R.drawable.ic_launcher_blackplay_foreground);
}
contentView.setTextViewText(R.id.textNotifTime, msToHourMinSec(TimeContainer.getInstance().getElapsedTime()) );
//..........................................................
mBuilder.setContent(contentView);
Intent notificationIntent = new Intent(this, TimePlayer.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(this, PendingIntent.FLAG_UPDATE_CURRENT, notificationIntent, 0);
mBuilder.setContentIntent(intent);
if(isNotificationShowing) {
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.getNotification());
} else {
isNotificationShowing = true;
startForeground(NOTIFICATION_ID, mBuilder.getNotification());
}
}
//..........................................................
}
如果您有任何解决方案,请帮助我。无论如何,提前感谢
解决方案
最后,4小时后,我解决了自己的问题。事情是这样的,我的通知已完全弃用(XD 抱歉)。以前我什至没有注意到这一点。我的应用程序在 targetSdk 26 和 minSdk 23 上运行,这意味着我上面的代码将无法工作,因为大多数功能已被弃用,这就是为什么我必须为 minSdk 添加一些抑制。最后但同样重要的是,最后,我必须添加 Notification Compat 和 Notification Channel 来调用通知。这是由 Builder 本身引起的。我使用了带有 Builder 的自变量,它应该调用 Notification Compat。
所以这是我到目前为止所做的改变:
private NotificationCompat.Builder mBuilder;
//..................
NotificationChannel mChannel = new NotificationChannel(notifyID, "name", importance);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mNotificationManager.createNotificationChannel(mChannel);
}
//..................
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//..................
mBuilder.setSmallIcon(R.drawable.timer);
mBuilder.setContentIntent(intent);
mBuilder.setChannelId(notifyID);
mBuilder.build();
}
推荐阅读
- c++ - 是 std::transform SIMD 功能吗?
- java - 如何使用双向 OneToMany 关系避免无限递归,并从双方获取信息?
- c++ - C++ set:根据自定义比较器查找和删除元素
- java - 根据游戏的输赢增加和减少“金额”
- typescript - 为什么 TypeScript 会抛出“void is not assignable”错误?
- r - 使用 kableExtra 调整长表
- r - 按列总计获取所有列的百分比
- mongodb - 为什么我的 MongoDB Realm GraphQL 端点返回日期是这样的,我如何在客户端解析它
- angular - Angular 获取 http 响应
- javascript - 更改数组元素值的样式