1

我从 SO 和其他一些网站的一些问题中获取了一些代码,我想出了一个合理的解决方案。

我正在尝试做的事情:我需要在 2 分钟不活动后关闭应用程序。所以想法是当我们的应用程序进入'onPause'时启动警报服务,并在我们的应用程序进入'onResume'时取消服务。

我目前拥有的:这是当前正在运行的相关代码。我的问题是 TimeoutService java 文件永远不会被“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 类从未被实例化,所以我无法想象问题出在那个类上。

4

2 回答 2

2

我认为您正在使警报复杂化。使用 aHandler和在两分钟内postdelayed()设置 a ,所有这些都在您的主要活动中。Runnable任何用户交互都会取消帖子并在接下来的两分钟内设置一个新帖子。可运行的只需要yourActivity.finish();

在此处遵循此答案:计数 45 秒,暂停 20 秒,然后以不同的标题重复计时器示例以及如何删除回调。

于 2011-05-23T17:46:30.243 回答
0

您好尝试使用 PendingIntent.FLAG_CANCEL_CURRENT 标志为您的待定意图。

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

将警报管理器设置为 RTC_WAKEUP 以唤醒设备,如果它在某个地方发生故障并检查。

有了这个,您需要注册一个广播接收器并在警报响起时通过一些动作触发意图。将操作设置为与待处理意图相同的意图。在接收器中启动您的服务。当警报关闭时,您的此广播接收器应该能够收听此 Intent 触发的操作。

意图意图 = 新意图(SCH_ALARM_ACTION);intent.setClass(getBaseContext(), SchAlarmReciever.class); registerReceiver(新 SchAlarmReciever(),新 IntentFilter(SCH_ALARM_ACTION));PendingIntent pi = PendingIntent.getBroadcast(getBaseContext(), 0, 意图, PendingIntent.FLAG_CANCEL_CURRENT);

于 2011-05-23T17:46:23.363 回答