Я справился с этим, используя AlarmManager, чтобы запланировать и отменить действие тайм-аута.
Затем в событии onPause() всех моих действий я планирую будильник. В событии onResume() всех моих действий я проверяю, отключен ли будильник. Если будильник погас, я отключил свое приложение. Если будильник еще не погас, я отменяю его.
Я создал Timeout.java для управления своими тревогами. Когда сигнал тревоги отключается, увольнение увольняется:
public class Timeout {
private static final int REQUEST_ID = 0;
private static final long DEFAULT_TIMEOUT = 5 * 60 * 1000; // 5 minutes
private static PendingIntent buildIntent(Context ctx) {
Intent intent = new Intent(Intents.TIMEOUT);
PendingIntent sender = PendingIntent.getBroadcast(ctx, REQUEST_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT);
return sender;
}
public static void start(Context ctx) {
ctx.startService(new Intent(ctx, TimeoutService.class));
long triggerTime = System.currentTimeMillis() + DEFAULT_TIMEOUT;
AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC, triggerTime, buildIntent(ctx));
}
public static void cancel(Context ctx) {
AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
am.cancel(buildIntent(ctx));
ctx.startService(new Intent(ctx, TimeoutService.class));
}
}
Затем я создал службу для захвата намерения, созданного будильником. Она устанавливает некоторое глобальное состояние в моем экземпляре класса приложения, чтобы указать, что приложение должно блокировать:
public class TimeoutService extends Service {
private BroadcastReceiver mIntentReceiver;
@Override
public void onCreate() {
super.onCreate();
mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intents.TIMEOUT)) {
timeout(context);
}
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(Intents.TIMEOUT);
registerReceiver(mIntentReceiver, filter);
}
private void timeout(Context context) {
App.setShutdown();
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
nm.cancelAll();
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mIntentReceiver);
}
public class TimeoutBinder extends Binder {
public TimeoutService getService() {
return TimeoutService.this;
}
}
private final IBinder mBinder = new TimeoutBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
Наконец, я создал подкласс деятельности, что все виды деятельности подкласса моего приложения от управления запиранием и отпирания:
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 (App.isShutdown()) {
finish();
}
}
}
Использование onPause и onResume для запуска и остановки таймаута дает мне следующую семантику. Пока активна одна из моих приложений, часы тайм-аута не работают. Поскольку я использовал Alarm Type AlarmManager.RTC, всякий раз, когда телефон переходит в спящий режим, тайм-аут запускается. Если тайм-аут происходит, когда телефон спит, мой сервис будет получать таймаут, как только телефон просыпается. Кроме того, часы запускаются, когда открыто какое-либо другое действие.
Для более подробной версии этого, вы можете увидеть, как я на самом деле реализовать их в моем приложении https://github.com/bpellin/keepassdroid
Можете ли вы прояснить, что входит в манифест? – yanokwa
Ваш код никогда не использует класс TimeoutService. Не могли бы вы показать, как и где вы это используете? – Peanut
Раньше я запускал службу при запуске приложения и останавливал его всякий раз, когда приложение заканчивалось. Это вызвало много обеспокоенных писем, потому что люди увидели, что работает служба, и предположили, что она использует неоправданные ресурсы. Итак, я добавил код в методах запуска и остановки Timeout для запуска и остановки службы. Я отредактировал свой ответ, чтобы отразить это. –