【问题标题】:Background process timer on androidandroid上的后台进程计时器
【发布时间】:2016-02-23 13:14:43
【问题描述】:

我正在尝试让进程计时器运行并使其在 android 的后台运行(从单击按钮开始)。

计时器必须开启 30 秒,甚至应该在后台继续增长应用程序(主页按钮和电源/屏幕关闭)。

我该怎么做?我尝试了服务和处理程序,但没有工作......

编辑

我的服务跟踪(30 秒的过程)

public class TrackingService extends IntentService {

    private Handler mHandler;
    private Runnable mRunnable;

    public TrackingService() {

        super("TrackingService");

    }

    public TrackingService(String name) {

        super(name);

    }

    @Override
    protected void onHandleIntent(Intent intent) {

        long timer = 30000;

        mHandler = new Handler();
        mRunnable = new Runnable() {

            @Override
            public void run() {

                    //TODO - process with update timer for new 30 sec

                    mHandler.postDelayed(this, timer);

            }
        };

        mHandler.postDelayed(mRunnable, timer);

    }

}

我的点击按钮:

mButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        //TODO - start first time and it continued every 30 seconds and continue in the background
        startService(Intent intent = new Intent(this, TrackingService.class));

    }
});

【问题讨论】:

  • 欢迎来到 StackOverflow !如果您正在寻找问题的答案,您应该考虑先向我们提供您的方法,以便我们可以帮助您了解您做错了什么/该怎么做。
  • 您不能在关机的设备上运行任何东西。除此之外,请检查AlarmManager 和/或JobScheduler
  • 关于在后台运行某些东西的注意事项,Android OS 保留在认为必要时随时终止后台进程的权利。如果它是一个必须调用的关键任务计时器,您可能需要重新考虑您的方法。

标签: android service timer


【解决方案1】:

好的,首先,我真的不知道我是否完全正确地回答了您的问题。 但我认为你想要一个每 30 秒执行一次的计时器,如果我没记错的话。 如果是,请执行以下操作:

AlarmManager

注意:该类提供对系统警报服务的访问。这些允许您安排您的应用程序在将来的某个时间点运行。当警报响起时,系统会广播已为其注册的 Intent,如果目标应用程序已在运行,则会自动启动它。注册的闹钟在设备睡眠时会保留(并且可以选择在此期间关闭设备唤醒设备),但会在设备关闭并重新启动后被清除。强>

示例:

在您的onClick() 中注册您的计时器:

int repeatTime = 30;  //Repeat alarm time in seconds
AlarmManager processTimer = (AlarmManager)getSystemService(ALARM_SERVICE);
Intent intent = new Intent(this, processTimerReceiver.class);   
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,  intent, PendingIntent.FLAG_UPDATE_CURRENT);
//Repeat alarm every second
processTimer.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),repeatTime*1000, pendingIntent); 

还有你的 processTimerReceiver 类

//This is called every second (depends on repeatTime)
public class processTimerReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        //Do something every 30 seconds
    }
}

不要忘记在您的 Manifest.XML

中注册您的接收器
<receiver android:name="processTimer" >
   <intent-filter>
       <action android:name="processTimerReceiver" >
       </action>
   </intent-filter>
</receiver>

如果您想取消闹钟: 使用它来做到这一点:

//Cancel the alarm
Intent intent = new Intent(this, processTimerReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);

希望对你有所帮助。

PS:如果这不是你想要的,请将它留在 cmets 中,或者如果有人想编辑它,请这样做。

【讨论】:

    【解决方案2】:

    天哪,永远不要将 AlarmManager 用于 30 秒计时器。这有点矫枉过正,也会大量消耗设备资源(电池、CPU...)。

    也许您可以尝试使用真正的后台服务而不是 IntentService,因为 IntentService 在工作结束时会自行关闭。不确定这里是否是这种情况,但值得一试。

    【讨论】:

    • 我同意,但是他希望他的计时器无论如何都继续,所以AlarmManager 是最好的选择,尽管电池耗尽。要获得更好的答案,请阅读this
    • 是的,但是如果您需要在后台重复 30 秒计时器,即使应用程序没有运行,那么这是一个糟糕的应用程序设计。每 30 秒触发一次警报确实是一个糟糕的设计。
    • 是的,但我不知道他的问题是否完全正确:P。所以也许这甚至不是他想要的。你对他的问题有何看法?我只想把他推向正确的方向
    • 我知道他想要一个 30 秒的计时器来触发,即使应用程序在后台(不知道他所说的关机是什么意思)。后台服务将在这里发挥作用,直到操作系统由于缺乏资源(内存不足)而决定终止它。除此之外,这将是一个更好的解决方案,除非作者在这里想要完全不同的东西。
    • @ZoranP 你说这是一个糟糕的设计,但是假设我必须几乎“实时”发送我的位置以获得一些结果,那个位置不会是静态的,什么是最好的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多