Служба сигнализации Android не отвечает - PullRequest
1 голос
/ 23 мая 2011

Я взял некоторый код из некоторых вопросов здесь, в 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 никогда не создается, поэтому я не могу представить, что проблема будет в этом классе.

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

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

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

0 голосов
/ 23 мая 2011

Привет. Попробуйте использовать флаг 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);

...