Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Android [игнор отключен] [закрыт для гостей] / AlarmManager API 23+ / 25 сообщений из 34, страница 1 из 2
20.03.2017, 01:30
    #39422753
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Сталкнулся с пролемой при работе приложения, которе использует AlarmManager в Android 6.0.
Проблема заключется в том, что AlarmManager перестал посылать PendingIntent в установленное время.
В качестве получателя использовал BroadcastReceiver, WakefulBroadcastReceiver, Service.
Установку производил всеми имеющимися у AlarmManagera методами.
setExactAndAllowWhileIdle, setAndAllowWhileIdle, setRepeating и т.д. Установка осуществлялась из приложения и из сервиса.
результат один и тот же - приемник не получает уведомление.
Доки по Doze mode прочитаны, stackoverflow изучен.
Может кто то знает как победить 6-й андроид?
Спасибо!!!
...
Рейтинг: 0 / 0
20.03.2017, 10:00
    #39422850
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
...
Рейтинг: 0 / 0
20.03.2017, 10:52
    #39422916
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
wadman https://developer.android.com/reference/android/app/AlarmManager.html#setAlarmClock(android.app.AlarmManager.AlarmClockInfo, android.app.PendingIntent) тоже не работает?
Не работает.
...
Рейтинг: 0 / 0
20.03.2017, 11:05
    #39422938
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Есть подозрение, что после ухода в режим Doze система убивает приложение. И PendingIntnet'у приходить не куда. Даже если он и пытается.
...
Рейтинг: 0 / 0
20.03.2017, 11:38
    #39422983
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Если приложение не сворачивать (нажать Home), то все работает как следует. Но если свернуть события от АлармМанагера не доходят.
...
Рейтинг: 0 / 0
20.03.2017, 11:42
    #39422994
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Dmitry SukhovilinЕсть подозрение, что после ухода в режим Doze система убивает приложение.
Скорее всего так и есть. Там имеется возможность добавлять приложение в исключения?
...
Рейтинг: 0 / 0
20.03.2017, 11:58
    #39423018
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
wadmanDmitry SukhovilinЕсть подозрение, что после ухода в режим Doze система убивает приложение.
Скорее всего так и есть. Там имеется возможность добавлять приложение в исключения?
Есть, но это не правильный путь. Заставлять пользователя ходить в настройки батареи, что-бы устанавливать галочку - не беречь батарею :)
...
Рейтинг: 0 / 0
20.03.2017, 12:06
    #39423035
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Dmitry Sukhovilinwadmanпропущено...

Скорее всего так и есть. Там имеется возможность добавлять приложение в исключения?
Есть, но это не правильный путь. Заставлять пользователя ходить в настройки батареи, что-бы устанавливать галочку - не беречь батарею :)
Этот путь навязан самой ОС в целях экономии батарейки.
Если пользователю нужно, чтоб программа работала фоном, то он добавляет её в исключения.
Либо рутом переносит приложение с систему и тогда оно становится "не убиваемым".
...
Рейтинг: 0 / 0
20.03.2017, 12:40
    #39423097
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
wadman,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
03-20 12:34:42.059 1109-1109/? I/xuelb: Recents removeAllTasks task:Task (8962): myapp [com.android.systemui.recents.model.Task@8fc8caf], packageName:myapp, isLocked:false
03-20 12:34:42.137 975-2771/? I/ActivityManager: Killing 29358:myapp/u0a97 (adj 9): remove task
03-20 12:34:42.253 975-1604/? I/WindowState: WIN DEATH: Window{ed062c1 u0 myapp/myapp.MainActivity}
03-20 12:34:42.279 975-1676/? I/ActivityManager: Force stopping myapp appid=10097 user=0: from pid 1109
03-20 12:34:42.279 975-1676/? D/ActivityManager: SVC-handleAppDiedLocked: app = ProcessRecord{1c80011 29358:myapp/u0a97}, app.pid = 29358
03-20 12:34:42.283 975-1676/? V/ActivityManager: Broadcast: Intent { act=android.intent.action.PACKAGE_RESTARTED dat=package:myapp flg=0x10 (has extras) } ordered=false userid=0 callerApp=null
03-20 12:34:42.290 975-986/? W/ActivityManager: Spurious death for ProcessRecord{1c80011 0:myapp/u0a97}, curProc for 29358: null


Установил не беречь батарею для приложения галочку.
Я так понимаю из логов, что аларм сработал. Но приложение уже было убито Активити Манагером. Это логи с телефона, не с эмулятора.
...
Рейтинг: 0 / 0
20.03.2017, 13:20
    #39423145
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
http://apprize.info/google/asynchronous/7.html тут пишут, что нужно делать в зависимости от версии апи.
...
Рейтинг: 0 / 0
20.03.2017, 14:19
    #39423209
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
wadman http://apprize.info/google/asynchronous/7.html тут пишут, что нужно делать в зависимости от версии апи.
Читал уже. Там ценные советы только до 23 версии.
После
Код: plaintext
1.
I/ActivityManager:   Force stopping service <service name>
Ничего уже не помогает. В случае с setAlarmClock исчезает значок будильника из трея.
...
Рейтинг: 0 / 0
20.03.2017, 14:36
    #39423225
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Ну я (почти) точно знаю, что поможет :) таргет изменить на 19 или меньше, тогда оно будет работать в режиме совместимости.
...
Рейтинг: 0 / 0
20.03.2017, 14:54
    #39423244
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
wadmanНу я (почти) точно знаю, что поможет :) таргет изменить на 19 или меньше, тогда оно будет работать в режиме совместимости.
Это самое первое, что попробовал.
Код: xml
1.
2.
3.
4.
<uses-sdk
        android:maxSdkVersion="19"
        android:minSdkVersion="15"
        android:targetSdkVersion="19"/>
...
Рейтинг: 0 / 0
20.03.2017, 15:20
    #39423266
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Dmitry SukhovilinЯ так понимаю из логов, что аларм сработал. Но приложение уже было убито Активити Манагером.
оно всегда моет быть убито Осью.
Подымай по будильнику опять если надо.
В чём проблема?
...
Рейтинг: 0 / 0
20.03.2017, 15:22
    #39423269
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Petro123Dmitry SukhovilinЯ так понимаю из логов, что аларм сработал. Но приложение уже было убито Активити Манагером.
оно всегда моет быть убито Осью.
Подымай по будильнику опять если надо.
В чём проблема?
Дык не поднимается.
...
Рейтинг: 0 / 0
20.03.2017, 15:40
    #39423286
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Dmitry SukhovilinДык не поднимается.
кто и что не подымается)) LOL
Андроид по интенту не подымает активити ни разу не запущенного приложения? (перегрузили).
Не верю.
...
Рейтинг: 0 / 0
20.03.2017, 18:27
    #39423495
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Полный пример. Форма с 2-мя кнопками. 1-я заводит будильник на 30 сек. 2-я показывает, что находится в шаред преференс. будильник делает запись в шаред префреренс - что-бы было видно сработал или нет.
Если форму не закрывать работает. Если свернуть - будильник пропадает. (Время в шаред преференс не обновляется).


MainActivity.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btnStart;
    Button btnGet;

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

        btnStart = (Button) findViewById(R.id.btn_start);
        btnStart.setOnClickListener(this);
        btnGet = (Button) findViewById(R.id.btn_get);
        btnGet.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v == btnStart) {
            System.out.println("start");
            Intent intent = new Intent(
                    this, MyReceiver.class
            );
            PendingIntent pi = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            am.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
                    System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(30), pi);
        }
        if (v == btnGet) {
            System.out.println("get");
            SharedPreferences demo = getSharedPreferences("demo", MODE_PRIVATE);
            String time = demo.getString("time", "?");
            setTitle(time + " " + new Date().getTime());

        }

    }

}



MyReceiver.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("demo");
        SharedPreferences p = context.getSharedPreferences("demo", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = p.edit();
        editor.putString("time", new Date().getTime()+"");
        editor.commit();
    }
}



Форма
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context="com.example.dmitres.myapplication.MainActivity">

    <Button
        android:id="@+id/btn_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="start"/>

    <Button
        android:id="@+id/btn_get"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="get"/>

</LinearLayout>




Манифест
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.dmitres.myapplication">

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

    <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>

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

    </application>

</manifest>

...
Рейтинг: 0 / 0
20.03.2017, 19:19
    #39423545
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Dmitry SukhovilinЕсли свернуть - будильник пропадает.
где логи?
2. В ресивер пропиши
context.startService(new Intent(context, MyService.class));
...
Рейтинг: 0 / 0
20.03.2017, 19:30
    #39423549
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Petro123,

Ресивер НЕ получает вызов onReceive().
В onReceive() происходит запись в ShardPreferences это и есть индикатор того, что onReceive() был вызван.
Логи Андроид Монитор http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1253973&msg=20313491
...
Рейтинг: 0 / 0
20.03.2017, 20:02
    #39423566
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Dmitry SukhovilinРесивер НЕ получает вызов onReceive().
В onReceive() происходит запись в ShardPreferences это и есть индикатор того, что onReceive() был вызван.
ничего не понял.
Дак событие приходит или нет если поставить все настройки против doze?
Ещё раз:
- написал приложение
- поставил будильник на 6 утра
- ПЕРЕГРУЗИЛ т.е. приложения в памяти нету
- в 6 утра должен запуск активити на экран Доброе утро!
..........
В чём проблема?
...
Рейтинг: 0 / 0
20.03.2017, 20:52
    #39423594
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Petro123Dmitry SukhovilinРесивер НЕ получает вызов onReceive().
В onReceive() происходит запись в ShardPreferences это и есть индикатор того, что onReceive() был вызван.
ничего не понял.
Дак событие приходит или нет если поставить все настройки против doze?
Ещё раз:
- написал приложение
- поставил будильник на 6 утра
- ПЕРЕГРУЗИЛ т.е. приложения в памяти нету
- в 6 утра должен запуск активити на экран Доброе утро!
..........
В чём проблема?
Если приложение свернуть, то AlarmManager не вызывает привязанный к нему PendingIntent. Т.е. ничего не происходит. Нет вызова. Никак. Совсем нет.
Если приложение оставить запущенным и усыпить телефон - все работает. На зарядке стоит все работает.
Нажать Home и после этого усыпить - не работает.
...
Рейтинг: 0 / 0
20.03.2017, 20:54
    #39423595
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
И не важно, как именно был сделан вызов - Service, BroadcastReceiver, тупо из Activity.
Перебрал все возможные варианты.
Или так сделать ваще нельзя в 6.0 или что-то я не так делаю. Вот на этот вопрос я и не могу найти ответ.
...
Рейтинг: 0 / 0
20.03.2017, 21:23
    #39423611
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Dmitry SukhovilinЕсли приложение свернуть, то AlarmManager не вызывает привязанный к нему PendingIntent.
в 20-ый раз.
Будильник должен работать с сервисом который нельзя свернуть.
И проблемы твоей не будет.
Активити это - ГУИ. Андроид знает что если ГУИ нет, то и будильник не нужен.
...
Рейтинг: 0 / 0
20.03.2017, 23:05
    #39423650
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Petro123,

Да пробовал уже. Добавим сервис и ресивер.
Работает так:
MainReceiver запускает AlarmService в котором AlarmManager через 30 сек посылает вызов в NotifReceiver. NotifReceiver Делает пометку в SharedPreferences (timestamp) о том, что сообщение прибыло.

UI нужен только для того, что бы посмотреть в SharedPreferences обновился ли timestamp.
Весь код ниже.

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.dmitres.myapplication">
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <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>
        <receiver
            android:name=".MainReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
        <receiver
            android:name=".NotifReceiver"
            android:enabled="true"
            android:exported="true" />
        <service
            android:name=".AlarmService"
            android:enabled="true"
            android:exported="true"/>
    </application>
</manifest>



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class AlarmService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("start command");
        PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 1,
                new Intent(getApplicationContext(), NotifReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager am = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        am.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(30), pi);
        return START_STICKY;
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class NotifReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("got alarm call!");
        SharedPreferences p = context.getSharedPreferences("demo", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = p.edit();
        editor.putString("time", System.currentTimeMillis() + "");
        editor.commit();
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
public class MainReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("main receiver");
        context.startService(new Intent(context, AlarmService.class));
    }
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button btnStart;
    Button btnGet;

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

        btnStart = (Button) findViewById(R.id.btn_start);
        btnStart.setOnClickListener(this);
        btnGet = (Button) findViewById(R.id.btn_get);
        btnGet.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v == btnStart) {
            System.out.println("start");
            Intent intent = new Intent(
                    this, MainReceiver.class);
            PendingIntent pi = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            try {
                pi.send();
            } catch (PendingIntent.CanceledException e) {
                e.printStackTrace();
            }
        }
        if (v == btnGet) {
            System.out.println("get");
            SharedPreferences demo = getSharedPreferences("demo", MODE_PRIVATE);
            String time = demo.getString("time", "?");
            setTitle(time + " " + new Date().getTime());

        }


    }


}

...
Рейтинг: 0 / 0
20.03.2017, 23:53
    #39423661
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AlarmManager API 23+
Dmitry Sukhovilin,

Задача: запускать ежедневно в конце дня сервис, который собирает статистику и записывает ее в БД. Реализую, используя AlarmManager. Код активити:
http://www.cyberforum.ru/android-dev/thread1881826.html
Работает у мужика?
...
Рейтинг: 0 / 0
Форумы / Android [игнор отключен] [закрыт для гостей] / AlarmManager API 23+ / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]