Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Android Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
Сталкнулся с пролемой при работе приложения, которе использует AlarmManager в Android 6.0.
Проблема заключется в том, что AlarmManager перестал посылать PendingIntent в установленное время.
В качестве получателя использовал BroadcastReceiver, WakefulBroadcastReceiver, Service.
Установку производил всеми имеющимися у AlarmManagera методами.
setExactAndAllowWhileIdle, setAndAllowWhileIdle, setRepeating и т.д. Установка осуществлялась из приложения и из сервиса.
результат один и тот же - приемник не получает уведомление.
Доки по Doze mode прочитаны, stackoverflow изучен.
Может кто то знает как победить 6-й андроид?
Спасибо!!!
20 мар 17, 01:30    [20312105]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22744
https://developer.android.com/reference/android/app/AlarmManager.html#setAlarmClock(android.app.AlarmManager.AlarmClockInfo, android.app.PendingIntent) тоже не работает?
20 мар 17, 10:00    [20312559]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
wadman
https://developer.android.com/reference/android/app/AlarmManager.html#setAlarmClock(android.app.AlarmManager.AlarmClockInfo, android.app.PendingIntent) тоже не работает?

Не работает.
20 мар 17, 10:52    [20312848]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
Есть подозрение, что после ухода в режим Doze система убивает приложение. И PendingIntnet'у приходить не куда. Даже если он и пытается.
20 мар 17, 11:05    [20312955]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
Если приложение не сворачивать (нажать Home), то все работает как следует. Но если свернуть события от АлармМанагера не доходят.
20 мар 17, 11:38    [20313144]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22744
Dmitry Sukhovilin
Есть подозрение, что после ухода в режим Doze система убивает приложение.

Скорее всего так и есть. Там имеется возможность добавлять приложение в исключения?
20 мар 17, 11:42    [20313182]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
wadman
Dmitry Sukhovilin
Есть подозрение, что после ухода в режим Doze система убивает приложение.

Скорее всего так и есть. Там имеется возможность добавлять приложение в исключения?

Есть, но это не правильный путь. Заставлять пользователя ходить в настройки батареи, что-бы устанавливать галочку - не беречь батарею :)
20 мар 17, 11:58    [20313282]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22744
Dmitry Sukhovilin
wadman
пропущено...

Скорее всего так и есть. Там имеется возможность добавлять приложение в исключения?

Есть, но это не правильный путь. Заставлять пользователя ходить в настройки батареи, что-бы устанавливать галочку - не беречь батарею :)

Этот путь навязан самой ОС в целях экономии батарейки.
Если пользователю нужно, чтоб программа работала фоном, то он добавляет её в исключения.
Либо рутом переносит приложение с систему и тогда оно становится "не убиваемым".
20 мар 17, 12:06    [20313338]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
wadman,

+

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


Установил не беречь батарею для приложения галочку.
Я так понимаю из логов, что аларм сработал. Но приложение уже было убито Активити Манагером. Это логи с телефона, не с эмулятора.
20 мар 17, 12:40    [20313491]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22744
http://apprize.info/google/asynchronous/7.html тут пишут, что нужно делать в зависимости от версии апи.
20 мар 17, 13:20    [20313684]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
wadman
http://apprize.info/google/asynchronous/7.html тут пишут, что нужно делать в зависимости от версии апи.

Читал уже. Там ценные советы только до 23 версии.
После

I/ActivityManager: Force stopping service <service name>
Ничего уже не помогает. В случае с setAlarmClock исчезает значок будильника из трея.
20 мар 17, 14:19    [20314006]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 22744
Ну я (почти) точно знаю, что поможет :) таргет изменить на 19 или меньше, тогда оно будет работать в режиме совместимости.
20 мар 17, 14:36    [20314070]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
wadman
Ну я (почти) точно знаю, что поможет :) таргет изменить на 19 или меньше, тогда оно будет работать в режиме совместимости.

Это самое первое, что попробовал.
<uses-sdk
        android:maxSdkVersion="19"
        android:minSdkVersion="15"
        android:targetSdkVersion="19"/>
20 мар 17, 14:54    [20314143]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29123
Dmitry Sukhovilin
Я так понимаю из логов, что аларм сработал. Но приложение уже было убито Активити Манагером.

оно всегда моет быть убито Осью.
Подымай по будильнику опять если надо.
В чём проблема?
20 мар 17, 15:20    [20314260]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
Petro123
Dmitry Sukhovilin
Я так понимаю из логов, что аларм сработал. Но приложение уже было убито Активити Манагером.

оно всегда моет быть убито Осью.
Подымай по будильнику опять если надо.
В чём проблема?

Дык не поднимается.
20 мар 17, 15:22    [20314269]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29123
Dmitry Sukhovilin
Дык не поднимается.

кто и что не подымается)) LOL
Андроид по интенту не подымает активити ни разу не запущенного приложения? (перегрузили).
Не верю.
20 мар 17, 15:40    [20314339]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
Полный пример. Форма с 2-мя кнопками. 1-я заводит будильник на 30 сек. 2-я показывает, что находится в шаред преференс. будильник делает запись в шаред префреренс - что-бы было видно сработал или нет.
Если форму не закрывать работает. Если свернуть - будильник пропадает. (Время в шаред преференс не обновляется).


MainActivity.java
+
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
+
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 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 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>
20 мар 17, 18:27    [20315163]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29123
Dmitry Sukhovilin
Если свернуть - будильник пропадает.

где логи?
2. В ресивер пропиши
context.startService(new Intent(context, MyService.class));
20 мар 17, 19:19    [20315341]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
Petro123,

Ресивер НЕ получает вызов onReceive().
В onReceive() происходит запись в ShardPreferences это и есть индикатор того, что onReceive() был вызван.
Логи Андроид Монитор http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1253973&msg=20313491
20 мар 17, 19:30    [20315372]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29123
Dmitry Sukhovilin
Ресивер НЕ получает вызов onReceive().
В onReceive() происходит запись в ShardPreferences это и есть индикатор того, что onReceive() был вызван.

ничего не понял.
Дак событие приходит или нет если поставить все настройки против doze?
Ещё раз:
- написал приложение
- поставил будильник на 6 утра
- ПЕРЕГРУЗИЛ т.е. приложения в памяти нету
- в 6 утра должен запуск активити на экран Доброе утро!
..........
В чём проблема?
20 мар 17, 20:02    [20315453]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
Petro123
Dmitry Sukhovilin
Ресивер НЕ получает вызов onReceive().
В onReceive() происходит запись в ShardPreferences это и есть индикатор того, что onReceive() был вызван.

ничего не понял.
Дак событие приходит или нет если поставить все настройки против doze?
Ещё раз:
- написал приложение
- поставил будильник на 6 утра
- ПЕРЕГРУЗИЛ т.е. приложения в памяти нету
- в 6 утра должен запуск активити на экран Доброе утро!
..........
В чём проблема?

Если приложение свернуть, то AlarmManager не вызывает привязанный к нему PendingIntent. Т.е. ничего не происходит. Нет вызова. Никак. Совсем нет.
Если приложение оставить запущенным и усыпить телефон - все работает. На зарядке стоит все работает.
Нажать Home и после этого усыпить - не работает.
20 мар 17, 20:52    [20315579]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
И не важно, как именно был сделан вызов - Service, BroadcastReceiver, тупо из Activity.
Перебрал все возможные варианты.
Или так сделать ваще нельзя в 6.0 или что-то я не так делаю. Вот на этот вопрос я и не могу найти ответ.
20 мар 17, 20:54    [20315583]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29123
Dmitry Sukhovilin
Если приложение свернуть, то AlarmManager не вызывает привязанный к нему PendingIntent.

в 20-ый раз.
Будильник должен работать с сервисом который нельзя свернуть.
И проблемы твоей не будет.
Активити это - ГУИ. Андроид знает что если ГУИ нет, то и будильник не нужен.
20 мар 17, 21:23    [20315641]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Dmitry Sukhovilin
Member

Откуда: Таганрог
Сообщений: 347
Petro123,

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

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

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


+
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;
    }
}


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


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


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

        }


    }


}
20 мар 17, 23:05    [20315819]     Ответить | Цитировать Сообщить модератору
 Re: AlarmManager API 23+  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 29123
Dmitry Sukhovilin,

Задача: запускать ежедневно в конце дня сервис, который собирает статистику и записывает ее в БД. Реализую, используя AlarmManager. Код активити:
http://www.cyberforum.ru/android-dev/thread1881826.html
Работает у мужика?
20 мар 17, 23:53    [20315882]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Android Ответить