Уведомление Android не показывает Java для секундомера

#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();
        }