@Niki_111

Как осуществить вызов функции уведомления не из класса MainActivity?

disclaimer:
Сам не очень близок к программированию, но пытаюсь немного модифицировать приложение с открытыми исходниками.

Цель на первый взгляд довольно проста: добавить в приложение уведомление при определенных условиях.
Т.к. я новичек то для тестов добавил в приложение кнопку при нажатии которой симулируется реакция на нужное событие. И прикрутил к этой кнопке функцию вызова уведомления. (Все доработки производились в классе MainActivity.) Все работало как нужно: при нажатии кнопки вызывалось соответствующее уведомление.

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.action_refresh:
                refreshMenuItem = item;
                // load the data from server
                new RefreshData().execute();
                return true;
            default:
                return super.onOptionsItemSelected(item);

                // my added test function
            case R.id.action_go:
                refreshMenuItem = item;
                // test alert
                testAlertNotify();
                return true;
        }
    }

public void testAlertNotify(){
        JSONParse jp = new JSONParse();
        Action action = jp.getAction();
        
        SendNotification(action.getDescription());
    }



    public void SendNotification(String  action){
        
        Context context = getApplicationContext();

        Intent notificationIntent = new Intent(context, LoginActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context,0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        NotificationManager nm = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);

        Resources res = context.getResources();
        Notification.Builder builder = new Notification.Builder(context);

        builder.setContentIntent(contentIntent)
                // try vibrate
                .setVibrate(new long[]{0, 200, 200, 600, 600})

                .setSmallIcon(R.drawable.run_icon)
                        // большая картинка
                .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.run_icon))
                        //.setTicker(res.getString(R.string.warning)) // текст в строке состояния
                .setTicker("Тестовое оповещение" + action)
                .setWhen(System.currentTimeMillis()) // java.lang.System.currentTimeMillis()
                .setAutoCancel(true)
                .setContentTitle("Action = " + action)
                 .setContentText("Action = " + action); // Текст уведомленимя

                // try sound
                Uri uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                builder.setSound(uri);

        Notification n = builder.getNotification();

        nm.notify(101, n);
    }


Сложности начались при попытке вызвать функцию уведомления из другого класса с порверками по таймауту. Для чего был создан класс SmartCheckerTimer с функцией из которой я пытаюсь вызвать запуск уведомления после изменения тестового значения. Счетчик работает в штатном режиме, но после достижения порогового значения(GlobalVars_my) останавливается. (проверял вызывая в приложении Alert со значением тестовой переменной, костыльный способ но другой мне не ведом) Вобщем попытки разобраться были разнообразнейшими, и класический вызов и наследование класса MainActivity c последующей попыткой вызова нужной функции, и добавление в класс SmartCheckerTimer дубликата функции для вызова уведомления(SendNotification1). Но чувствую копаю не в ту сторону и уперся в стенку.

Последний описаный вариант: добавление в класс SmartCheckerTimer дубликата функции (SendNotification1) для вызова уведомления.
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public void run() {
        try {
            _detector = new ConnectionDetector(_context);
            while (true) {
                SendNotification1(action.getDescription());
                // Через 10 секунд еще раз получаем данные
                Thread.sleep(10000);
                if (_detector.isConnectingToInternet()) {
                    GlobalVars_my.countVar++;
                    if (GlobalVars_my.countVar >= 2) {
                        SendNotification1(action.getDescription());
                    }
                }
            }
        } catch (Exception exception) {
            ErrorsList.AddError(exception.toString());
        }
    }
  • Вопрос задан
  • 3050 просмотров
Пригласить эксперта
Ответы на вопрос 1
VYakushev
@VYakushev
Разработчик Android в Nowtaxi
1. Создать сервис, который будет брать данные с сервера. Сервис обязателен для работы в фоне.
2. Нужную вам activity научить работать либо с сервисом, либо с промежуточным классом для получения нужных данных.
3. Notification формируется сервером, но с ссылкой на activity. Activity при открытии отображает нужные данные.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы