Android警报服务没有响应

时间:2011-05-23 17:36:44

标签: java android android-service android-alarms

我在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);
    }

}

LockingActivity文件。这用作我所有活动的超类。

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 个答案:

答案 0 :(得分:2)

我认为你让事情变得复杂了。在主要活动中,使用Handlerpostdelayed()在两分钟内设置Runnable。任何用户交互都会取消帖子并在接下来的两分钟内设置一个新帖子。可运行只需要yourActivity.finish();

请按照以下答案:Count for 45 seconds, pause for 20 then repeat with different title获取计时器示例以及如何删除回调。

答案 1 :(得分:0)

嗨,请尝试使用PendingIntent.FLAG_CANCEL_CURRENT标志表示您的待处理意图。

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

将闹钟管理器设为RTC_WAKEUP,以便唤醒设备,如果它在某处停止并检查。

使用此功能,您需要注册广播接收器并在闹钟响起时执行某些操作。将操作设置为您用于待处理意图的相同意图。 在您的接收器中启动您的服务。 当闹钟关闭时,你的这个广播接收器应该能够听取这个意图发出的动作。

Intent intent = new 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);