【问题标题】:The Structure of a Service Class in Android - Questions and Check WorkAndroid中服务类的结构 - 问题和检查工作
【发布时间】:2019-01-15 20:57:50
【问题描述】:

我目前正在恢复我一直在从事的项目,并从头开始重新创建它。
但是,在创建 Service 类时,我注意到了一些事情 - 在我的旧项目中,Service 中的一个名为 onStartCommand 的方法包含所有需要触发的代码,而在我的新项目中,当我创建一个 Service 类时,这个方法是无处可寻。

- 我需要手动添加这个“onStartCommand”方法来包含我的服务代码吗?

- 如果没有,我的代码究竟会去哪里?似乎在我的“旧”项目代码中,我完全注释块公共 TimerService,并将 null 传递给 IBinder,并创建 onStartCommand 等。我不太明白为什么。

- 当我在这里时,有人可以仔细检查我下面的 CountdownTimer 代码吗?如果它是正确的,我应该把它放在一个线程内吗?


当我创建一个新的服务类时,它看起来像这样:

public class TimerService extends Service {

    public TimerService() {

    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");

    }

}


但是在我的旧项目中,我的服务类如下所示:

public class TimerService extends Service {

/*
public TimerService() {

}
*/

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

@Override
public int onStartCommand(final Intent intent, int flags, int startId) {

    intent.getStringExtra("TIMER_VALUE");

    String string_timerValue;
    string_timerValue = intent.getStringExtra("TIMER_VALUE");

    long long_timerValue;
    long_timerValue = Long.parseLong(String.valueOf(string_timerValue));

    // I DO NOT WANT ANY TICK VALUE, SO GIVE IT FULL TIMER VALUE
    long long_tickValue;
    long_tickValue = Long.parseLong(String.valueOf(string_timerValue));

    new CountDownTimer(long_timerValue, long_tickValue) {

        public void onTick(long millisUntilFinished) {
            // DO NOTHING
        }

        public void onFinish() {

            Toast.makeText(TimerService.this, "TIMES UP", Toast.LENGTH_LONG).show();

            stopService(intent);

        }
    }.start();

    return START_STICKY;

    // END OF onStartCommand
}

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

    Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
}

// END OF ENTIRE SERVICE CLASS
}


谢谢!!

【问题讨论】:

    标签: android android-service android-timer


    【解决方案1】:

    我是否需要手动添加这个“onStartCommand”方法来包含我的服务代码?

    是的。

    有人可以仔细检查我下面的 CountdownTimer 代码吗?

    仅在绝对必要时才创建服务。目前尚不清楚为什么需要这项服务。

    除此之外:

    • 使用stopSelf(),而不是stopService(),从服务内部停止服务。

    • 检查Intent extras 使用START_STICKY 不是一个好的组合。 START_STICKY 表示“如果您终止我的进程以释放系统 RAM,请尽可能重新启动我的服务,但将 null 传递给 Intent”。这将导致您的服务因NullPointerException 而崩溃。

    【讨论】:

    • 谢谢你的洞察力。我的目标是有一个广播监听器,当它被触发时,会弹出一个对话框活动,用户在编辑文本中输入一个值并按 OK..然后活动消失,并在后台运行计时器,当时间到期时,一个新活动打开/代码触发。我认为需要一个服务来在后台执行计时器。如果不是,我还能怎么做,以免在系统处于后台时被系统杀死?后台进程不是服务的用途吗?另外,如果不是 START_STICKY,那么要使用什么标志?
    • @Studio2bDesigns:“我还能怎么做”——AlarmManager,很可能。 “以免在后台被系统杀死?” -- 你被“系统杀死”。 只有在主动向用户提供价值时才运行服务。坐在那里看着时钟滴答作响并没有积极地为用户带来价值。
    • 所以为了澄清一下,您建议而不是关闭 Activity 并启动服务来运行 AlarmManager,我应该简单地将 AlarmManager 代码放在实际 Activity,直接在关闭 Activity 之前?我不确定如果我要关闭 Activity,AlarmManager 是否会继续运行,这就是为什么我要在后台启动一个服务来执行它。 您是说可以在后台运行 AlarmManager 代码的同时关闭 Activity? 另外,为了将来参考,我应该使用什么 FLAG 来代替 START_STICKY?跨度>
    • @Studio2bDesigns:“我不确定如果我要关闭 Activity,AlarmManager 是否会继续运行”——AlarmManager 的重点是在请求的时间让您的应用程序控制,无论您当时是否有正在运行的进程。请注意,鉴于 Android 6.0+ 设备上的打盹模式和应用程序待机施加的限制,时间不一定准确。 “另外,为了将来参考,我会使用什么 FLAG 来代替 START_STICKY?” ——没那么简单。最简单的方法是去掉 Intent 额外的东西,在这种情况下,START_STICKY 是用户敌对的,但会起作用。
    • 您说 AlarmManager 不精确 - 但我需要它在用户输入 EditText 的确切分钟数之后触发我的代码。那么 AlarmManager 不是最好的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 2017-04-06
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多