Служба сигнализации Android не отвечает

1

Я взял некоторый код из некоторых вопросов здесь, в SO, а также на каком-то другом сайте, и я придумал разумное решение.

Что я пытаюсь сделать: Мне нужно отключить приложение через 2 минуты бездействия. Итак, идея состоит в том, чтобы запустить службу будильника, когда наше приложение переходит в onPause и отменяет сервис, когда наше приложение переходит в onResume.

Что у меня есть: Вот соответствующий код, который в настоящее время работает. Моя проблема заключается в том, что java файл TimeoutService никогда не будет "onCreated". Просто вызывает AlarmManager.set НЕ запускает ожидающее намерения?

Файл Timeout.java

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class Timeout 
{
    private static final int REQUEST_ID = 0;
    private static final long DEFAULT_TIMEOUT = 2 * 60 * 1000;  // 2 minutes

    public static final String INTENT_TIMEOUT = "timeoutintent";

    public static void start(Context ctx) 
    {
        //long triggerTime = System.currentTimeMillis() + DEFAULT_TIMEOUT;
        long triggerTime = System.currentTimeMillis() + (5000);
        AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(ctx, TimeoutService.class);
        PendingIntent pi = PendingIntent.getBroadcast(ctx, REQUEST_ID, intent, 0);
        am.set(AlarmManager.RTC, triggerTime, pi);
    }

    public static void cancel(Context ctx) 
    {
        AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(ctx, TimeoutService.class);
        PendingIntent pi = PendingIntent.getBroadcast(ctx, REQUEST_ID, intent, 0);
        am.cancel(pi);
    }

}

Файл блокировки. Это используется как суперкласс для всех моих действий.

import android.app.Activity;
import android.widget.Toast;

public class LockingActivity extends Activity
{
    @Override
    protected void onPause() 
    {
        super.onPause();
        Timeout.start(this);
    }

    @Override
    protected void onResume() 
    {
        super.onResume();
        Timeout.cancel(this);
        checkShutdown();
    }

    private void checkShutdown() 
    {
        if ( AppVM.isShutDown() )
        {
            Toast.makeText(this, "Shuting Down", 1).show();
            finish();
        }
    }
}

Я мог бы также отправить файл TimeoutService, но это просто типичный служебный файл. Проблема заключается в том, что класс TimeoutService никогда не создается, поэтому я не могу себе представить, что проблема будет в этом классе.

Теги:
android-service
android-alarms

2 ответа

2
Лучший ответ

Я думаю, что вы усложняете ситуацию с тревогой. Используйте Handler и postdelayed(), чтобы установить Runnable через две минуты, все в вашем основном действии. Любое взаимодействие пользователя отменяет сообщение и устанавливает новый в течение следующих двух минут. Для выполнения требуется только yourActivity.finish();

Следуйте этому ответу здесь: Подсчитайте в течение 45 секунд, пауза на 20, затем повторите с другим заголовком, чтобы указать пример таймера и как удалить обратные вызовы.

  • 0
    Вау, спасибо. Это НАСТОЛЬКО проще. Я отредактирую свой пост, чтобы показать результат.
0

Привет. Попробуйте использовать флаг PendingIntent.FLAG_CANCEL_CURRENT для вашего ожидающего намерения.

 PendingIntent pi = PendingIntent.getBroadcast(ctx, REQUEST_ID, intent,PendingIntent.FLAG_CANCEL_CURRENT);

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

При этом вам необходимо зарегистрировать широковещательный приемник и совершить огонь с некоторыми действиями, когда будильник погаснет. Установите действие с тем же намерением, которое вы используете для ожидающих намерений. Запустите службу в своем приемнике. Ваш широковещательный приемник должен иметь возможность прослушивать действие, инициированное этим намерением, когда Тревога выключена.

Цель намерения = новый намерение (SCH_ALARM_ACTION);               intent.setClass(getBaseContext(), SchAlarmReciever.class);               registerReceiver (новый SchAlarmReciever(), новый IntentFilter (SCH_ALARM_ACTION));   PendingIntent pi = PendingIntent.getBroadcast(getBaseContext(),               0,               намерение,               PendingIntent.FLAG_CANCEL_CURRENT);

  • 0
    Спасибо за ответ. Тем не менее, я попробовал это все еще не повезло. Тот же результат на самом деле.
  • 0
    Отредактированный ответ, пожалуйста, попробуйте это и проверьте, это должно работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню