Страница 4 из 5

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 25 авг 2015, 23:40
mercuriy94
Всем привет, может вопрос не по теме. Но я не нашёл темы , где могу его задать, а данная тема более менее подходит по теме. Итак.
Каким способом можно добавить будильники в системное приложение будильника?Как программно менять звук системного будильника?

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 26 авг 2015, 02:27
doter.ua
В одной строке 4 слова "тема", однако здравствуйте. Насколько я знаю такие приложения на разных девайсах могут отличаться http://stackoverflow.com/a/4281243. Лучше напиши свой.

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 26 авг 2015, 11:33
mercuriy94
doter.ua писал(а):В одной строке 4 слова "тема", однако здравствуйте. Насколько я знаю такие приложения на разных девайсах могут отличаться http://stackoverflow.com/a/4281243. Лучше напиши свой.
Ночью писал) не заметил) по вашему ответу) пример приведённый по ссылке запускает intent будильника , а не добавляет новый будильник ) Ну может и правда лучше свой написать)

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 26 авг 2015, 19:17
mercuriy94
В общем если кому то интересно решение моего вопроса то я разобрался. Ниже приведён кусок кода , который ставит будильник на 22:00.

Код: Выделить всё

Integer hour = 22;
        Integer minute = 00;
        Intent NewAlarm = new Intent(AlarmClock.ACTION_SET_ALARM);
       NewAlarm.putExtra(AlarmClock.EXTRA_HOUR, hour);
        NewAlarm.putExtra(AlarmClock.EXTRA_MINUTES, minute);
        NewAlarm.putExtra(AlarmClock.EXTRA_SKIP_UI, true);
        startActivity(NewAlarm);
Теперь следующая задача как программно получить информацию о включенных будильниках и как программно удалить какой либо будильник?

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 28 авг 2015, 11:21
An-droid
Добрый день. Урок 119 становится делать сложнее, потому что метод

Код: Выделить всё

 void sendNotif(int id, PendingIntent pIntent) {
    Notification notif = new Notification(R.drawable.ic_launcher, "Notif "
        + id, System.currentTimeMillis());
    notif.flags |= Notification.FLAG_AUTO_CANCEL;
    notif.setLatestEventInfo(this, "Title " + id, "Content " + id, pIntent);
    nm.notify(id, notif);
  }
отказывается работать - setLatestEventInfo не просто зачёркивает (устаревший), а вообще выделяет красным.

В связи с чем переписал данный метод так:

Код: Выделить всё

 void sendNotif(int id, PendingIntent pIntent) {
    Notification notification = new Notification.Builder(getApplicationContext())
                .setContentTitle("Title " + id)
                .setContentText("Content " + id)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setAutoCancel(true)
                .setContentIntent(pIntent)
                .getNotification();

        notificationManager.notify(id, notification);
  }
Возможно, кому-то будет полезна эта информация. Я на неё убил часик-полтора ((

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 26 окт 2015, 13:18
si001
Подскажите плиз, как прописать receiver ?
у меня не ловит сообщения с секцией :

Код: Выделить всё

        <receiver android:name=".Receiver"
            android:enabled="true"
            android:exported="true" >
        </receiver>
Нужен intent filter ? Если можно, приведите секцию, плз, а то запутался - вообще тема манифеста интересует, у Вас она почти не освещена - пару ссылок на визард из эклипса и все (

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 26 окт 2015, 18:48
doter.ua
si001 писал(а):Подскажите плиз, как прописать receiver ?
у меня не ловит сообщения с секцией :

Код: Выделить всё

        <receiver android:name=".Receiver"
            android:enabled="true"
            android:exported="true" >
        </receiver>
Нужен intent filter ? Если можно, приведите секцию, плз, а то запутался - вообще тема манифеста интересует, у Вас она почти не освещена - пару ссылок на визард из эклипса и все (
http://developer.alexanderklimov.ru/and ... estXML.php

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 02 ноя 2015, 19:58
danek130995
An-droid писал(а):Добрый день. Урок 119 становится делать сложнее, потому что метод

Код: Выделить всё

 void sendNotif(int id, PendingIntent pIntent) {
    Notification notif = new Notification(R.drawable.ic_launcher, "Notif "
        + id, System.currentTimeMillis());
    notif.flags |= Notification.FLAG_AUTO_CANCEL;
    notif.setLatestEventInfo(this, "Title " + id, "Content " + id, pIntent);
    nm.notify(id, notif);
  }
отказывается работать - setLatestEventInfo не просто зачёркивает (устаревший), а вообще выделяет красным.

В связи с чем переписал данный метод так:

Код: Выделить всё

 void sendNotif(int id, PendingIntent pIntent) {
    Notification notification = new Notification.Builder(getApplicationContext())
                .setContentTitle("Title " + id)
                .setContentText("Content " + id)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setAutoCancel(true)
                .setContentIntent(pIntent)
                .getNotification();

        notificationManager.notify(id, notification);
  }
Возможно, кому-то будет полезна эта информация. Я на неё убил часик-полтора ((
An-droid, спасибо Вам огромное!

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 03 ноя 2015, 12:21
bankir1980
Никто так и не поднял главный вопрос будильника, хотя "намёк" проскакивал.

Как поддерживать "бесконечный" жизненный цикл повторяющегося будильника?
Речь идёт о случае, если приложение было "убито" в настройках, в списке приложения или чистильщиками памяти или, что самое главное - осью, допустим при нехватке памяти?

Товарищ тут писал про такое на самсунге, но никто на это внимания не обратил.

У меня задача ежедневно запускать определённый код. Если процесс прибит случайно или намеренно. Все будильники убиваются.
Началась такая канитель кажется с Android 3.0 - будильник не живёт без процесса приложения и все будильники убиваются вместе с процессом.

Я же пока сделал запуск будильника из сервиса, который живёт в отдельном процессе от процесса приложения (чтобы памяти меньше жрать), и который по флагам onStartCommand перезапускается в случае необходимости убийства процесса. При загрузке устройства стартует этот сервис, перезапускающий будильник. Будильник в таком случае привязан к процессу сервиса.

Обойти стороной данную тему, как мне кажется, неправильно, учитывая саму суть будильников.

Или может быть всё не так страшно?

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 09 дек 2015, 06:49
GRAF_COLLIOSTRO
накАнецтА пабедил!!!))) корочь повозился достаточно с этой бедой. изучил глубоко и сам урок и форум)

там выше спрашивали..., в общем я пришёл к такой схеме:

есть класс, который ставит будильники. он дёргает системное время и высчитывает соответственно на когда ставить будильники. при повторяющемся интенте проблем никаких - последний вариант установленного будильника срабатывает

есть boot ресивер, который дёргает класс будильников

и вот самое главное: перечитал кучу статей когда и почему падают будильники. вразумительного объяснения я не нашёл, разве что замечено, будильники отпадают на реальных устройствах когда устройство уходит в спячку-просыпается многократно... пишут про самсунги и htc... но суть не в этом.

в качестве таблетки предлагается вот такое решение:
для контроля ставится один разовый будильник для самого приложения. у него нет вейкапа и время стоит 1 час от текущего. он сработает по времени или сработает сразу как проснётся устройство и перезапустит класс будильников обновит их все и себя самого без шума и пыли.

как пишут при таком подходе будильники живут вечно. реализовал. теперь тесчу на выносливость. попробовал поставить будильник с вейкапом на 10 дней вперёд. посмотрим как отработает)
У меня задача ежедневно запускать определённый код. Если процесс прибит случайно или намеренно. Все будильники убиваются.
ну вот какбы то что нагуглил должно решать эту проблему. тестировать очень тяжко. требуется время( ждём(

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 12 мар 2016, 22:52
Siemenstim
Всем привет.
Есть приложение, где пользователь устанавливает время сработки Alarm Manager, который в свою очередь из ресивера запускает уведомление. Добавил boot Receiver для сработки после перезагрузки. Теперь вопрос:
- Каким способом лучше сохранить установленное пользователем время для запуска Alarm Manager после ребута?

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 20 окт 2016, 18:53
Naidovich
метод sendNotif пришлось переписать, система не нашла метол setLatestEventInfo

Код: Выделить всё

void sendNotif(int id, PendingIntent pIntent) { нашел тут //http://stackoverflow.com/questions/1207269/sending-a-notification-from-a-service-in-android
        Notification notif = new Notification.Builder(this)
                .setContentTitle("Title " + id)
                .setContentText("Content " + id)
                .setSmallIcon(R.mipmap.icon)
                .setContentIntent(pIntent)
                .setAutoCancel(true)
                .setContentIntent(pIntent).build(); //добавляем PendingIntent
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notificationManager.notify(id, notif);//id должен быть уникальным, чтобы сообщений было несколько
    }

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 29 дек 2016, 11:22
nebesny
Люди добрые, как же грамотно с API 19 ставить наступление события по точному времени каждый день?

Код: Выделить всё

 alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
идеально работает для API 16.
Для новых версий пробовал

Код: Выделить всё

alarmManager.setInexactRepeating
и

Код: Выделить всё

 alarmManager.setExactAndAllowWhileIdle
. Не работает. Вообще не срабатывает, даже с опозданием.
Задача выполнять кое что в 23:59 каждый день, естественно, для все версий ОС.
Кто как решает проблему?

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 15 май 2017, 14:01
Vladimir V.
Коллеги, подскажите, в чём косяк?
При касании системного уведомления в баре в лог должны выводится сообщения. Но не выводятся.
Вот код MainActivity.java:

Код: Выделить всё

package com.example.samsung.p1191_pendingintent;

import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    private NotificationManager nm;
    private AlarmManager am;
    private Intent intent1, intent2;
    private PendingIntent pendingIntent1, pendingIntent2;
    private String message;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        am = (AlarmManager) getSystemService(ALARM_SERVICE);
    }

    public void onClickBtn(View view) {

        switch (view.getId()) {

            case R.id.btn1:
                intent1 = createIntent(getString(R.string.action_1), getString(R.string.extra_1));
                pendingIntent1 = PendingIntent.getBroadcast(this, 0, intent1, 0);

                intent2 = createIntent(getString(R.string.action_2), getString(R.string.extra_2));
                pendingIntent2 = PendingIntent.getBroadcast(this, 0, intent2, 0);

                compare(view.getContext());
                sendNotif(view.getContext(), 1, pendingIntent1);
                sendNotif(view.getContext(), 2, pendingIntent2);
                break;
            default:
                break;
        }

    }

    private Intent createIntent(final String action, final String extra) {
        Intent intent = new Intent(this, Receiver.class);
        intent.setAction(action);
        intent.putExtra(getString(R.string.extra), extra);
        return intent;
    }

    private void compare(final Context context) {
        message = "intent 1 == intent 2: " + intent1.filterEquals(intent2);
        Messager.sendToAllRecipients(context, message);
        message = "pendingIntent1 == pendingIntent2: " + pendingIntent1.equals(pendingIntent2);
        Messager.sendToAllRecipients(context, message);
    }

    @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB)
    private void sendNotif(final Context context, final int id, final PendingIntent pendingIntent) {
        //Подготовка уведомления в статус-бар
        //noinspection deprecation
        Notification notification = new Notification.Builder(context)
                //Установка заголовка
                .setContentTitle("Notification's title " + id)
                //Установка сообщения для статус-бара
                .setContentText("Notification's text " + id)
                //Установка стикера
                .setTicker("Notification's ticker " + id)
                //Установка малой иконки
                .setSmallIcon(R.mipmap.ic_launcher_round)
                //Подключение активити к записи
                .setContentIntent(pendingIntent)
                //Установка флага, удаляющего уведомление из списка после нажатия
                .setAutoCancel(true)
                //Только для API не младше №16
//              .setSubText("The notification's subtext");
                //Создание строки в разворачивающемся списке уведомлений
                //noinspection deprecation
                .getNotification();
        //Отправка уведомления в статус-бар
        nm.notify(id, notification);
    }
}
Вот код Receiver.java

Код: Выделить всё

package com.example.samsung.p1191_pendingintent;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * Created by samsung on 12.05.2017.
 */

public class Receiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String message = context.getString(R.string.receiver)
                + " " + context.getString(R.string.on_receive);
        Messager.sendToAllRecipients(context, message);
        message = context.getString(R.string.action_) + " " + intent.getAction();
        Messager.sendToAllRecipients(context, message);
        message = context.getString(R.string.extra_) + " "
                + intent.getStringExtra(context.getString(R.string.extra));
        Messager.sendToAllRecipients(context, message);
    }
}
Это код класса Messager.java

Код: Выделить всё

package com.example.samsung.p1191_pendingintent;

import android.content.Context;
import android.util.Log;
import android.widget.Toast;

/**
 * Created by samsung on 12.05.2017.
 */

public class Messager {

    private final static String LOG_TAG = "myLogs";

    public static final void sendToAllRecipients(final Context context, final String message) {
        Log.d(LOG_TAG, message);
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }

    public static final void sendToOnlyLog(final String message) {
        Log.d(LOG_TAG, message);
    }
}

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 15 май 2017, 16:02
Vladimir V.
Naidovich писал(а):метод sendNotif пришлось переписать, система не нашла метол setLatestEventInfo

Код: Выделить всё

void sendNotif(int id, PendingIntent pIntent) { нашел тут //http://stackoverflow.com/questions/1207269/sending-a-notification-from-a-service-in-android
        Notification notif = new Notification.Builder(this)
                .setContentTitle("Title " + id)
                .setContentText("Content " + id)
                .setSmallIcon(R.mipmap.icon)
                .setContentIntent(pIntent)
                .setAutoCancel(true)
                .setContentIntent(pIntent).build(); //добавляем PendingIntent
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        notificationManager.notify(id, notif);//id должен быть уникальным, чтобы сообщений было несколько
    }
С учётом испльзования библиотеки android.support.v4.app код будет выглядеть так:

Код: Выделить всё

    private void sendNotif(final Context context, final int id, final PendingIntent pendingIntent) {
        //Подготовка уведомления в статус-бар
        Notification notification = new NotificationCompat.Builder(context)
                //Установка заголовка
                .setContentTitle("Notification's title " + id)
                //Установка сообщения для статус-бара
                .setContentText("Notification's text " + id)
                //Установка стикера
                .setTicker("Notification's ticker " + id)
                //Установка времени сообщения
                .setWhen(System.currentTimeMillis())
                //Установка малой иконки
                .setSmallIcon(R.mipmap.ic_launcher_round)
                //Подключение активити к записи
                .setContentIntent(pendingIntent)
                //Установка флага, удаляющего уведомление из списка после нажатия
                .setAutoCancel(true)
                //Только для API не младше №16
//              .setSubText("The notification's subtext");
                //Создание строки в разворачивающемся списке уведомлений
                //noinspection deprecation
                .build();
        //Отправка уведомления в статус-бар
        nm.notify(id, notification);
    }
}

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 04 фев 2018, 19:41
WKBAPKA
Коллеги подскажите, если я из уведомления вызывают некую активность, по нажатию кнопки выполняю в этой активности некую деятельность и вызываю метод finish(). Активность закрывается, но остается в стеке, установка флагов при создании Intent ни как не влияет на это, как я понимаю, или мне кажется, что вызываемая активность становиться как бы главной корневой активностью приложения и не реагирует на флаги, на которые реагируют дочерние активности вызываемые из главной активности. Но мне надо добиться результата, когда пользователь нажал кнопку и активность ушла навсегда, ему не надо возвращаться потом к этой активности (как пример, диалоговые окна, нажал на ок и в стеке не должно быть ничего).
Возможно, есть флаги которые позволяют открыть активность из уведомления в нужном режиме?

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 04 фев 2018, 20:04
WKBAPKA
Сам спросил, сам нашел решение...
Если прописать в манифесте для активити вот такое вот

android:excludeFromRecents="true"

то работает как мне надо

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 27 мар 2018, 16:01
Дмитрий_
Ребята не срабатывает будильник SDK >= 23
При старте сервиса делаю

Код: Выделить всё

startForeground(1002, notification);
		PowerManager.WakeLock wl1;
    		PowerManager pm = (PowerManager)this.getSystemService(
                Context.POWER_SERVICE);
		wl = pm.newWakeLock(
	            PowerManager.FULL_WAKE_LOCK, "TAG1");
		wl.acquire();
потом создаю Alarm с проверкой версии SDK

Код: Выделить всё

if (Build.VERSION.SDK_INT >= 23) {// Wakes up the device in Doze Mode
  alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, t, amPIntent);
} else if (Build.VERSION.SDK_INT >= 19) {// Wakes up the device in Idle Mode
  alarmManager.setExact(AlarmManager.RTC_WAKEUP, t, amPIntent);
} else {// Old APIs
  alarmManager.set(AlarmManager.RTC_WAKEUP, t, amPIntent);
}
Когда Alarm срабатывает опять ставлю на повтор.
Если подключена зарядка все нормально срабатывает, без зарядки Alarm в течении 2-х минут срабатывает, потом останавливает до включения телефона либо когда прилетит уведомление в статус бар от других приложений потом опять перестаёт срабатывать.

В манифест добавил:
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />

При запуске приложения сделал запрос

Код: Выделить всё

		if (Build.VERSION.SDK_INT >= 23)
			if (!pm.isIgnoringBatteryOptimizations(getPackageName()) ){

				Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
						Uri.parse("package:" + getPackageName()));
				startActivity(intent);	
			}
При подтверждении добавлении в список разрешенных приложения в итоге там нет, хотя при повторном запросе разрешения pm.isIgnoringBatteryOptimizations(getPackageName() возвращает true - при этом в списке разрешенных нет. Добавляю приложение в список вручную и все ровно засыпает...

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 21 ноя 2018, 17:49
powercat
А спрошу-ка здесь ))

Манифест:

Код: Выделить всё

    <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <activity
            android:name=".Screen"
            android:label="@string/title_activity_screen"
            android:theme="@style/AppTheme.NoActionBar">
        </activity>

        <receiver android:name=".Receiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="action" />
            </intent-filter>
        </receiver>

    </application>
Главная активити. Создаю Интент, прикручиваю ему action, кладу одно данное для получения в ресивере, оборачиваю в пендинг, скармливаю Аларму. Надеюсь, что аларм через 5 секунд пнет ресивер и передаст пендинг.

Код: Выделить всё

     protected void onCreate(Bundle savedInstanceState)
     {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);

          Intent intent=new Intent(this,Screen.class);
          intent.setAction("action");
          intent.putExtra("key","ДАННЫЕ");

          PendingIntent pending_intent=PendingIntent.getBroadcast(this,0,intent,0);
          AlarmManager alarm_manager=(AlarmManager) getSystemService(ALARM_SERVICE);
          alarm_manager.setExact(AlarmManager.RTC,System.currentTimeMillis()+5000,pending_intent);
     }
Ресивер. Просто вывод в лог сообщения, что зашло сюда. Интент пока не потрошится.

Код: Выделить всё

public class Receiver extends BroadcastReceiver
{
     @Override
     public void onReceive(Context context, Intent intent)
     {
          Log.d("---!!!---","В ресивере");
     }
}
Все запускается, но в ресивер не попадает. :? :shock:

Вопрос - где косяк?

Re: Урок 119. PendingIntent – флаги, requestCode. AlarmManag

Добавлено: 22 ноя 2018, 13:45
powercat
Почему бродкаст БЕЗ фильтра отрабатывает?? :o :shock: