BroadcastReceiver onReceive вызывается немедленно или не вызывается вообще - PullRequest
0 голосов
/ 17 мая 2018

Я пишу приложение с фиксированной функцией автоматического выхода из системы.Вот код:

AndroidManifest:

<application
    [...]>
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    [...]
    <receiver
        android:name="myPackage.LoginAlarm">
        <intent-filter>
            <action android:name="myPackage.ACTION_LOGOUT" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>
</application>

Активность (из onActivityResult, после успешного входа в систему):

if(session.getUser().length() > 0) {
    Intent i = new Intent(getResources().getString(R.string.action_logout));
    i.setClass(this, LoginAlarm.class);
    this.sendBroadcast(i);

    al.setOwner(this); // LoginAlarm instance, setting context.
    al.setAlarm(this, i);
}

LoginAlarm class:

public class LoginAlarm extends BroadcastReceiver {
    private final static long LIMIT = 600000; // session timeout, 10 minutes.
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;
    private StartAct owner;

    public LoginAlarm() {}

    @Override
    public void onReceive(Context context, Intent intent) {
         Log.i("LoginAlarm", "onReceive: time out.");
    }

    public void setAlarm(Context context, Intent intent) {
        if(alarmMgr != null) alarmMgr.cancel(alarmIntent);

        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmIntent = PendingIntent.getBroadcast(context, 1, intent, 0);

        long trigger = System.currentTimeMillis() + LIMIT;
        alarmMgr.set(AlarmManager.ELAPSED_REALTIME, trigger, alarmIntent);

        String click = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis()));
        String end = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(trigger));
        Log.i("LoginAlarm", "setAlarm: Click at: " + click + ". Alarm set: " + end);
    }
}

Если в моей Деятельности я прокомментирую строку:

   this.sendBroadcast(i);

onReceive никогда не вызывается, но с этой строкой метод вызывается сразу после установки тревоги, независимо от того,как долго ЛИМИТ.

Пожалуйста, я читаю тонны статей, учебных пособий и постов, но пока безуспешно.
Нужна подсказка.

Заранее спасибо.

...