#java #android #android-notifications #android-notification-bar #android-timer
#java #Android #android-уведомления #android-панель уведомлений #android-таймер
Вопрос:
Это снова я, и теперь я в настоящее время создаю приложение для секундомера, будильника и т. Д. Итак, я добавил сервис и уведомление в свой код, но дело в том, что единственный, который работает идеально, — это основной вид или просто я его назвал «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());
}
}
//..........................................................
}
Если у вас есть какие-либо решения, пожалуйста, помогите мне. В любом случае, заранее спасибо
Ответ №1:
Наконец, через 4 часа я решил свою собственную проблему. Вот в чем дело, мое уведомление было полностью устаревшим (XD Извините). Я даже не заметил этого раньше. Мое приложение работает на targetSdk 26 и minSdk 23, что означает, что мой приведенный выше код не будет работать, потому что большинство функций устарели, поэтому я должен добавить некоторое подавление для minSdk. И последнее, но не менее важное: в конце концов, я должен добавить сопоставление уведомлений и канал уведомлений для вызова уведомления. Это вызвано самим разработчиком. Я использовал независимую переменную с Builder на ней, и вместо этого она должна была вызывать сопоставление уведомлений.
Итак, вот что я изменил до сих пор :
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();
}