如何在经过固定的时间后停止我的服务?

时间:2015-12-17 20:55:08

标签: android broadcastreceiver android-service alarmmanager android-pendingintent

在我的应用程序中的A点,我启动了我的服务并期望服务从B点关闭。但是,可能有一些情况B点不要求服务关闭。在这种情况下,我希望服务在固定的时间后自行关闭。

我已将以下代码写入我的Service类,并期望服务在启动时间10秒后关闭(将来会是45分钟,但我不想长时间停留测试)。

public class ChatService extends Service implements ITCPConnection
{
    private static final int SERVICE_LIFE_TIME = 10 * 1000; // In millis

    private AlarmReceiver mAlarmReceiver;
    private AlarmManager alarmMgr;
    private PendingIntent alarmIntent;

    @Override
    public void onCreate()
    {
        super.onCreate();

        //
        mAlarmReceiver = new AlarmReceiver();
        registerReceiver(mAlarmReceiver, new IntentFilter());

        //
        Intent intent = new Intent(this, AlarmReceiver.class);
        alarmIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
        alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        alarmMgr.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + SERVICE_LIFE_TIME, alarmIntent);
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        Log.e(TAG, "onDestroy()");

        // Unregister receiver
        if (mAlarmReceiver != null)
        {
            unregisterReceiver(mAlarmReceiver);
        }

        disconnect();
    }

    public void disconnect()
    {
        // If the alarm has been set, cancel it.
        if (alarmMgr!= null)
        {
            alarmMgr.cancel(alarmIntent);
        }

        ...

        Log.e(TAG, "disconnect()");
    }


    /*****************
     * Alarm Receiver
     *****************/
    private static class AlarmReceiver extends BroadcastReceiver
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            Log.e(TAG, "Stop service from AlarmReceiver");
            context.stopService(intent);
        }
    }
}

我的问题是AlarmReceiver.onReceive()永远不会被调用,因此我的服务将无限期地存在。任何想法将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

您要做的是明确定位广播接收器。

根据this,它不能通过动态创建(即未声明到清单)广播接收器来完成,因为操作系统不知道如何解决它。 要检查这是否是问题的根源,您可以采用隐式方式并在intent内设置一个操作,并在IntentFilter中对其进行过滤。

无论如何,使用延迟发布的帖子可以被视为一种有效的替代方案,因为您希望服务自然关闭或者仍然可以拦截延迟事件。

另一个(不相关的)是你正在打电话

            context.stopService(intent);

使用广播意图而不是启动服务的意图。您只需致电stopSelf()